Views, Calendar, Datumsfelder aus der DB, Datumsinterval,
am 15.07.2010 - 16:59 Uhr in
Hallo zusammen,
wäre sehr glücklich wenn jemand mir ein paar Tipps geben kann, suche schon seit langem nach der Lösung...
Ausgangslage: ich schreibe ein Modul (nennen wir das "modul1") mit einer Kalender-Sicht auf die Daten eines
bestehenden Modules ("modul2"). Ich darf modul2 nicht verändern. Das Problem ist, in dem modul2 wurde ein
Inhaltstyp nicht mit CCK, sondern mit Drupal-Hooks erstellt. Der Inhaltstyp hat From und To - Datums in der DB
als Unixtimestamp.
Ich habe mit dem hook_views_data() die Tabellen dem views Module bekannt gemacht. Auch hook_date_api_fields()
implementiert. Die Datums werden in der View angezeigt und ich kann sie mit 'OR' oder mit 'AND' verknüpfen.
Als ich vorher einen Event-Inhaltstyp mit CCK erstellt habe, musste ich nur einen von beiden Datumsfelder wählen,
und die Nodes wurden automatisch richtig angezeigt: wenn ein Event über mehrere Tage geht, wird er auch in jedem
Tag angezeigt. Bei den eigenen Datumsfeldern wird der Node nur an dem Anfangstag oder nur an dem Endtag angezeigt
oder verschwindet komplett aus der View, je nachdem wie ich die Datumsfelder verknüpfe.
Ich habe ein Screenshot gemacht.
Hier ist der Code-Ausschnitt aus dem hook_views_data():
(enddate hat gleiche händler)
$data['incidents']['startdate'] = array(
'title' => t('Startdate'),
// Information for displaying the startdate
'field' => array(
'handler' => 'views_handler_field_date',
'click sortable' => TRUE,
),
// Information for accepting a startdate as an argument
'argument' => array(
// 'handler' => 'date_api_argument_handler', - weiss nicht welchen Argumenthänder nehmen... beide ausprobiert -> hilft nicht
'handler' => 'views_handler_argument_date',
),
// Information for accepting a startdate as a filter
'filter' => array(
//'handler' => 'date_api_filter_handler', - ?
'handler' => 'views_handler_filter_date',
),
// Information for sorting on a startdate
'sort' => array(
'handler' => 'views_handler_sort_date',
),
);
Und hier ist hook_date_api_fields():
/**
* Implementation of hook_date_api_fields().
*
* All modules that create custom fields that use the
* 'views_handler_field_date' handler can provide
* additional information here about the type of
* date they create so the date can be used by
* the Date API views date argument and date filter.
*/
function hzdcalendar_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('incidents.startdate', 'incidents.enddate'),
// Granularity of this date field's db data.
'granularity' => array('year', 'month', 'day', 'hour', 'minute', 'second'),
);
switch ($field) {
case 'incidents.startdate':
case 'incidents.enddate':
return $values;
}
}
Hat jemand eine Idee?
Liebe Grüße,
Katja
Anhang | Größe |
---|---|
calendar1.jpg | 51.47 KB |
- Anmelden oder Registrieren um Kommentare zu schreiben
Wenn du ein print_r($node)
am 16.07.2010 - 07:42 Uhr
Wenn du ein
print_r($node)
machst sind die dann identisch bei den Datumsfeldern?Vielleicht liegt es gar nicht an Views.
-----------
Luca Curella
Kooperative Netze - Berlin
das liegt an Views...
am 16.07.2010 - 11:01 Uhr
Hi luzer,
die view habe ich als default view gespeichert, sprich in der Datei "module-name.views_default.inc", hook_views_default_views().
Da liegt die Beschreibung der View als array. Ich wüsste nicht, an welcher Stelle ich print_r($node) aufrufen kann, um die Infos
zu Nodes auszugeben... Eine Idee?
Aber ich habe das auch ohne print_r($node) überprüft: die Datums sind genau die, die im Node stehen: wenn man auf den Node klickt,
kommt man auf die Node-Seite und da stehen die. Vor allem habe ich die eigenen Tabellen mit node Tabelle verknüpft. Das steht bei
mir in dem hook_views_data():
// incidents table links directly to node table.
$data['incidents']['table']['join']['node'] = array(
'left_field' => 'nid',
'field' => 'incident_id',
)
Also ich denke die Datumsfelder werden schon die richtigen genommen. Das Problem liegt daran, dass sie "falsch zu einer SQL-Abfrage gemacht
werden". In SQL-Anfrage steht folgendes, was die Datumsfelder betrifft:
.....AND ((DATE_FORMAT(ADDTIME(FROM_UNIXTIME(incidents.startdate), SEC_TO_TIME(7200)), '%Y-%m') <= '2010-07' AND DATE_FORMAT(ADDTIME(FROM_UNIXTIME(incidents.startdate), SEC_TO_TIME(7200)), '%Y-%m') >= '2010-07')).....
Sollte aber so was stehen: startdate <= jetzt(2010-07) <= enddate oder so: startdate <= jetzt AND enddate >= jetzt
Dann würde alles funktionieren.
Ich habe diese Anfrage mit der SQL-Anfrage verglichen, die für einen mit CCK-erstellten Event gemacht wird:
SELECT ...
node_data_field_event_datetime.field_event_datetime_value AS node_data_field_event_datetime_field_event_datetime_value,
node_data_field_event_datetime.field_event_datetime_value2 AS node_data_field_event_datetime_field_event_datetime_value2
...
WHERE ....
AND ((DATE_FORMAT(ADDTIME(FROM_UNIXTIME(node_data_field_event_datetime.field_event_datetime_value), SEC_TO_TIME(7200)), '%Y-%m') <= '2010-07' AND DATE_FORMAT(ADDTIME(FROM_UNIXTIME(node_data_field_event_datetime.field_event_datetime_value2), SEC_TO_TIME(7200)), '%Y-%m') >= '2010-07'))
Da wird es automatisch richtig selektiert. Eigentlich wenn man den hook_date_api_fields() implementiert, sollte es automatisch erkannt werden,
dass eigene Datumsfelder zusammen gehören. Ich habe noch überprüft, ob dieser Hook wirklich aufgerufen wird -> das ist der Fall.
Wenn ich einen Datumsargument auswähle: "Datum: Date (node)", dann kann ich die Datumsfelder unter "Date field(s)" anklicken. Hab schon alles ausprobiert:
beide auswählen -> mit OR oder UND verknüpfen, nur eine auswählen und auch OR, UND... Die SQL-Statement ist trotzem falsch: es wird immer nur startdatum oder enddatum genommen.
Vielen Dank im Voraus wenn jemand eine Idee dazu hat,
Leibe Grüße,
Katja