function date_prepare_node in Date 5.2
Same name and namespace in other branches
- 6.2 date/date.module \date_prepare_node()
Helper function to adapt multiple date fields on a node to view parameters.
Called by date theme, needed when a date field is used in a view.
1 call to date_prepare_node()
- date_field_formatter in date/
date.module - Implementation of hook_field_formatter().
File
- date/
date.module, line 539 - Defines date/time field types for the Content Construction Kit (CCK).
Code
function date_prepare_node(&$node) {
// Set some default values.
$node->date_id = isset($node->date_id) ? (array) $node->date_id : array();
$node->date_repeat_show = isset($node->date_repeat_show) ? $node->date_repeat_show : FALSE;
// Only nodes called from views need special processing.
if (empty($node->view)) {
return;
}
// Process the node the first time we encounter it, otherwise return.
static $prepared = array();
$view = $node->view;
if (array_key_exists($view->name, $prepared)) {
if (in_array($node->nid, $prepared[$view->name])) {
return;
}
}
// Adapt fields that use the CCK Date handler to the view's values.
$date_fields = date_handler_fields($view);
$fields = content_fields();
foreach ($date_fields as $field_name => $type) {
$field = $fields[$field_name];
if (!empty($field_name) && isset($node->{$field_name}) && !empty($field['multiple'])) {
switch ($type['type']) {
case 'ungroup':
$delta = $node->{$type}['delta_field'];
$id = 'date:' . $node->nid . ':' . $field_name . ':' . $delta . ':0';
break;
case 'first':
case 'last':
case 'group':
// If we're working with a grouped value of a field used
// to limit the view's date range, limit the group to that range.
if (!empty($view->date_handler) && !empty($view->min_date) && in_array($field_name, $view->date_fields)) {
$field = $fields[$field_name];
$format = date_type_format($field['type']);
$timezone = date_get_timezone($field['tz_handling']);
$db_timezone = date_get_timezone_db($field['tz_handling']);
$min_date = $view->min_date;
$max_date = $view->max_date;
date_timezone_set($min_date, timezone_open($db_timezone));
date_timezone_set($max_date, timezone_open($db_timezone));
$min_date = date_format($min_date, $format);
$max_date = date_format($max_date, $format);
if (empty($item['value2'])) {
$item['value2'] = $item['value'];
}
$node_field = $node->{$field_name};
foreach ($node_field as $node_delta => $item) {
if ($item['value'] < $min_date || $item['value2'] > $max_date) {
unset($node_field[$node_delta]);
}
else {
$delta = $node_delta;
}
}
$node->{$field_name} = $node_field;
}
switch ($type) {
case 'first':
$delta = min(array_keys($node->{$field_name}));
$id = 'date:' . $node->nid . ':' . $field_name . ':' . $delta . ':0';
break;
case 'last':
$delta = max(array_keys($node->{$field_name}));
$id = 'date:' . $node->nid . ':' . $field_name . ':' . $delta . ':0';
break;
case 'group':
$delta = min(array_keys($node->{$field_name}));
$id = '';
break;
}
// In a view showing grouped dates, we show repeating values.
$node->date_repeat_show = TRUE;
break;
}
$node->date_id[] = $id;
}
}
$prepared[$view->name][] = $node->nid;
}