You are here

function date_prepare_node in Date 5.2

Same name and namespace in other branches
  1. 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;
}