Startseite
  • » Home
  • » Handbuch & FAQ
  • » Showroom
  • » Forum
  • » Drupalchannel
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › CCK und Views ›

[gelöst] Von- und Bis-Datum über hook_views_data

Eingetragen von Exterior (2571)
am 28.08.2010 - 14:23 Uhr in
  • CCK und Views
  • Drupal 6.x

Hey Leute,

ich habe über ein Modul und hook_form einen eigenen Inhaltstyp implementiert. Vorerst teste ich damit nur ein wenig herum, vor allem in Bezug auf hook_views_data, um die Felder in Views unterzubringen. Ziel der ganzen Sache ist es, das Modul Calendar (welches ein Datumsfeld als Argument fordert) korrekt mit meinen eigenen Datumsfeldern zu verwenden.

Der Inhaltstyp hat also als Felder ein zusätzliches Text-Feld und zwei Textfelder, in die ein Datum eingetragen werden soll - ein Von- und ein Bis-Datum. Gespeichert wird das ganze in einer eigenen Tabelle.

So sehen das Tabellen-Schema und der hook_form aus:

<?php
function my_own_type_schema()
  {
   
//Bitte keine Kommentare dazu, dass in der t-Funktion englischer Text rein kommt, das böse Schema-Modul ist Schuld ;-)

   
$schema['my_own_type_tabelle'] = array(
     
'description' => t('Diese Tabelle ist von einem Test-Modul'),
     
'fields' => array(
       
'nid' => array(
         
'description' => t('ID des zugehörigen Nodes'),
         
'type' => 'int',
         
'length' => '10',
         
'unsigned' => TRUE,
         
'not null' => TRUE),
       
'text' => array(
         
'description' => t('Eingegebener Text'),
         
'type' => 'varchar',
         
'length' => '255',
         
'not null' => TRUE),
       
'datum1' => array(
         
'description' => t('eingegebenes Datum'),
         
'type' => 'varchar',
         
'length' => '10',
         
'not null' => TRUE),         
       
'datum2' => array(
         
'description' => t('eingegebenes Datum'),
         
'type' => 'varchar',
         
'length' => '10',
         
'not null' => TRUE),   
        ),
     
'primary key' => array('nid'),
    );
  return
$schema; 
 
  }
?>


<?php
function my_own_type_form(&$node, $form_state)
  {
   
$type = node_get_types('type', $node);
   
   
$form['title'] = array(
     
'#type' => textfield,
     
'#title' => check_plain($type->title_label),
     
'#required' => TRUE,
     
'#default_value' => $node->title,
     
'#weight' => -5,
     
'#maxlength' => 255,
    );
   
   
$form['body_filter']['body'] = array(
     
'#type' => textarea,
     
'#title' => check_plain($type->body_label),
     
'#default_value' => $node->body,
     
'#rows' => 12,
     
'#weight' => 0,
     
'#required' => FALSE,
    );
   
   
$form['body_filter']['format'] = filter_form(FILTER_FORMAT_DEFAULT, null, $parents=array());
   
   
$form['text'] = array(
     
'#type' => textfield,
     
'#title' => 'Zusatz Text',
     
'#default_value' => $node->text,
     
'#required' => FALSE,
     
'#weight' => 2,
     
'#maxlength' => 255,
     
    );
   
   
$form['datum_1'] = array(
     
'#type' => textfield,
     
'#title' => 'Von-Datum',
     
'#default_value' => $node->datum_1,
     
'#required' => FALSE,
     
'#weight' => 4,
     
'#maxlength' => 20,
    );
   
   
$form['datum_2'] = array(
     
'#type' => textfield,
     
'#title' => 'Bis-Datum',
     
'#default_value' => $node->datum_2,
     
'#required' => FALSE,
     
'#weight' => 5,
     
'#maxlength' => 20,
    );
   
    return
$form; 
  }
?>

Damit bekomme ich den eigenen Inhaltstyp mit allen gewünschten Feldern und das Speichern klappt auch wunderbar (die beiden Datums-Felder werden als Timestamps gespeichert).

Nun habe ich noch eine Datei namens "my_own_type.views.inc" angelegt und folgendes eingetragen:

<?php
function my_own_type_views_data()
  {
   
$data=array();
   
   
$data['my_own_type_tabelle']['table']['group'] = 'My own Type';
   
   
$data['my_own_type_tabelle']['table']['base'] = array(
     
'field' => 'nid',
     
'title' => t('My own Type'),
     
'help' => t("This is my own nodetype"),
     
'weight' => -9,
    );

   
//joins
   
$data ['my_own_type_tabelle']['table']['join'] = array(
     
//...to the node table
     
'node' => array(
         
'left_field' => 'nid',
         
'field' => 'nid'
     
),
    );

 
//Fields
 
$data ['my_own_type_tabelle']['nid'] = array(
     
'title' => 'Termin Node',
     
'help' => 'Die Node ID des Termins',
     
'field' => array(
         
'handler' => 'views_handler_field'
     
),
     
'relationship' => array(
         
'base' => 'node',
         
'field' => 'nid',
         
'handler' => 'views_handler_relationship',
         
'label' => t('Node')
      ),
     
'argument' => array(
         
'handler' => 'views_handler_argument_node_nid',
         
'name field' => 'title',
         
'numeric' => TRUE,
         
'validate type' => 'nid'
     
),
     
'sort' => array(
         
'handler' => 'views_handler_sort'
     
)
  );

  
$data ['my_own_type_tabelle']['text'] = array(
     
'title' => 'Zusatz-Text',
     
'help' => 'Der gespeicherte Zusatz-Text',
     
'field' => array(
         
'handler' => 'views_handler_field'
     
),
     
'relationship' => array(
         
'base' => 'my_own_type_tabelle',
         
'field' => 'text',
         
'handler' => 'views_handler_relationship',
         
'label' => 'My Type'
     
)
  );
 
  
$data ['my_own_type_tabelle']['datum'] = array(
     
'title' => 'Datum-Feld',
     
'help' => 'Gespeichertes Datum des Termins',
     
'field' => array(
         
'handler' => 'views_handler_field_date'
     
),
     
'argument' => array(
         
'handler' => 'date_api_argument_handler',
      ),
     
'filter' => array(
         
'handler' => 'date_api_filter_handler',
      ),   
     
'sort' => array(
         
'handler' => 'views_handler_sort_date'
     
)
  );
 
return
$data;        
}


/**
* Implementation of hook_date_api_fields
*/
function my_own_type_date_api_fields($field) {

 
$values = array(
   
// The type of date: DATE_UNIX, DATE_ISO, DATE_DATETIME.
   
'sql_type' => DATE_UNIX,
   
// Timezone handling options: 'none', 'site', 'date', 'utc'.
   
'tz_handling' => 'site',
   
// Needed only for dates that use 'date' tz_handling.
   
'timezone_field' => '',
   
// Needed only for dates that use 'date' tz_handling.
   
'offset_field' => '',
   
// Array of "table.field" values for related fields that should be
    // loaded automatically in the Views SQL.
   
'related_fields' => array(),
   
// Granularity of this date field's db data.
   
'granularity' => array('year', 'month', 'day', 'hour', 'minute', 'second'),
  );

  switch (
$field) {
    case
'my_own_type_tabelle.datum1':
    case
'my_own_type_tabelle.datum2':
      return
$values;
  }
 
  return
$values;
}
?>

Damit stehen mir die gewünschten Felder in Views zur Verfügung, klappt ganz gut.

Mein Ziel ist es, diese Datums-Felder für das Calendar-Modul zu verwenden, welches ein Datumsfeld als Argument benötigt. Ich habe es schon mit dem oben gezeigten Code hinbekommen, dass ich Nodes mit einem Datum speichere und diese dann an der richtigen Stelle im Kalender auftauchen. Was noch nicht klappt wie es soll ist die Verwendung eines "Bis-Datums".

Wenn man das mit einem Date-Field von CCK macht, kann man ein Von- und ein Bis-Datum für einen Node auswählen und dann wird dieser Node für alle Tage zwischen diesen beiden Daten eingetragen. (Also wenn man einen Node mit Von-Datum 01.09.2010 und Bis-Datum 04.09.2010 speichert, dann wird er im Kalender auch am 02.09 und 03.09 eingetragen)

Die Frage ist nun: Wie kann ich es einrichten, dass meine beiden Datums-Felder auch so behandelt werden können wie diese Date-Felder? Dass ich also in meine beiden eigenen Felder ein Von- und ein Bis-Datum eintrage und der Node dann entsprechend in alle betroffenen Tage im Kalender eingetragen wird.

Kennt sich da jemand von euch aus? Das wäre wirklich ziemlich wichtig.

‹ Mehrere Filme (JW Player) per Views auf einer Seite untereinander anzeigen Inhaltstyp kopieren/Eportieren/Importieren? ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Hat sowas echt noch nie

Eingetragen von Exterior (2571)
am 06.09.2010 - 13:52 Uhr

Hat sowas echt noch nie jemand gemacht und kann helfen?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich verweifel langsam :( Kann

Eingetragen von Exterior (2571)
am 14.09.2010 - 16:14 Uhr

Ich verweifel langsam :( Kann denn wirklich niemand helfen?

  • Anmelden oder Registrieren um Kommentare zu schreiben

So, durch Zufall habe ich

Eingetragen von Exterior (2571)
am 18.09.2010 - 19:40 Uhr

So, durch Zufall habe ich jetzt ein paar Infos gefunden, welche den gewünschten Effekt bringen:

Man muss in hook_date_api_fields für das Von-Datum noch den Schlüssel 'fromto' festlegen und die Von- und Bis-Felder als related Fields eintragen.

Für alle, die das Problem auch mal haben und hier gelandet sind - so sieht der hook jetzt bei mir aus und funktioniert wie gewünscht:

<?php
/**
* Implementation of hook_date_api_fields
*/
function my_own_type_date_api_fields($field) {

  if (
$field == 'my_own_type_tabelle.datum1')
    {
      return array(
       
'sql_type' => DATE_UNIX,
       
'tz_handling' => 'site',
       
'fromto' => array('my_own_type_tabelle_datum1','my_own_type_tabelle_datum2'), //--> das ist der ausschlaggebende Teil
       
'related_fields' => array('my_own_type_tabelle_datum1','my_own_type_tabelle_datum2'), //--> dies ebenfalls
       
'granularity' => array('year', 'month', 'day'),
      );
    }
   
 
//ich erstelle zwei verschiedene Arrays, weil das Bis-Feld diverse Infos nicht benöigt ('fromto' und 'related_fields')
 
if ($field == 'my_own_type_tabelle.datum2')
    {
      return array(
       
'sql_type' => DATE_UNIX,
       
'tz_handling' => 'site',
       
'granularity' => array('year', 'month', 'day'),
      );
    }
}
?>

Damit kann man jetzt einfach das Von-Feld als Argument angeben und das Von-Feld Als Feld zur Calender-View hinzufügen und schon wird das Von-Feld inkl. Bis-Feld ausgegeben und alle Tage dazwischen bekommen diesen Node ebenfalls zugeordnet =)

Man kann zwar in Views bei den Feld-Einstellungen nicht auswählen, ob man nur das Von-Datum oder das Von- und Bis-Datum ausgeben möchte (das hängt eben davon ab, was man in hook_date_api_fields einträgt) aber hauptsache, es funktioniert so, wie es soll.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • [gelöst] Drupal7.10 Fehlermeldungen ohne Site-Änderungen
  • Blockregionen per CCK Feld ausblenden
  • [erledigt] drupal 7 - read more ausblenden
  • Drupal7 für eine Produktvergleich Seite
  • Marinelli 3, Admin-Layer
  • #ajax Funktionalität in einem Field Widget
  • Image: Bildupload erst beim Speichern des Nodes
  • Views Accordion - Header Elemente nebeneinander
  • Wie kann ich Theme AUTOMATISCH umstellen, wenn sich Benutzer einlogen?
  • Überprüfung von Artikeln, die Benutzer geschrieben haben
  • Target des Weiterlesen-Links ändern?
  • CCK Auswahlfelder während des Betriebes ändern/erweitern oder in Textfeld umwandeln
Weiter

Neue Kommentare

  • Danke!
    vor 1 Stunde 8 Minuten
  • in die template.php im
    vor 2 Stunden 14 Minuten
  • da es bisher keine etablierte
    vor 2 Stunden 24 Minuten
  • Also die lösung ist einfach
    vor 5 Stunden 43 Minuten
  • Und warum schreibst Du die
    vor 8 Stunden 41 Minuten
  • Jep, so hab ich eine View
    vor 9 Stunden 9 Minuten
  • Nimm dazu doch das Modul
    vor 9 Stunden 34 Minuten
  • okay, vielen dank :)
    vor 9 Stunden 44 Minuten
  • _target-Attribut für Links in node.tpl.php einfügen
    vor 9 Stunden 59 Minuten
  • Hallo Jonny und willkommen
    vor 10 Stunden 32 Minuten

Statistik

Beiträge im Forum: 160314
Registrierte User: 14286

Neue User:

  • schmittrich
  • mah1987
  • Nadine.S

» Alle User anzeigen

User nach Punkten sortiert:
stBorchert5214
quiptime4713
Tobias Bähr3825
md3727
bv3680
Thoor3282
Alexander Langer3155
wla2795
dereine2630
pebosi2495
» User nach Punkten
Zur Zeit sind 0 User und 3 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Showroom
  • » Forum
  • » Drupalchannel
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's
  • Bücherecke

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed Drupal Podcast
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
  • Drupal Demo
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association