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

am 28.08.2010 - 14:23 Uhr in
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.
- Anmelden oder Registrieren um Kommentare zu schreiben
Hat sowas echt noch nie
am 06.09.2010 - 13:52 Uhr
Hat sowas echt noch nie jemand gemacht und kann helfen?
Ich verweifel langsam :( Kann
am 14.09.2010 - 16:14 Uhr
Ich verweifel langsam :( Kann denn wirklich niemand helfen?
So, durch Zufall habe ich
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.