Skip to content
date.theme 12.6 KiB
Newer Older
<?php
/**
 * @file
 * Theme functions.
 */
/**
 * @addtogroup themeable
 * @{
 *
 * Formatter themes
 */
/**
 * Theme Start/End date combination in the view.
 *   $entity->date_id
 *     If set, this will show only an individual date on a field with
 *     multiple dates. The value should be a string that contains
 *     the following values, separated with periods:
 *     - module name of the module adding the item
 *     - node nid
 *     - field name
 *     - delta value of the field to be displayed
 *     - other information the module's custom theme might need
 *     Used by the calendar module and available for other uses.
 *     example: 'date.217.field_date.3.test'
 *   $entity->date_repeat_show
 *     If true, tells the theme to show all the computed values
 *     of a repeating date. If not true or not set, only the
 *     start date and the repeat rule will be displayed.
 *   $dates['format'] - the format string used on these dates
 *   $dates['value']['local']['object'] - the local date object for the Start date
 *   $dates['value2']['local']['object'] - the local date object for the End date
 *   $dates['value']['local']['datetime'] - the datetime value of the Start date database (GMT) value
 *   $dates['value2']['local']['datetime'] - the datetime value of the End date database (GMT) value
 *   $dates['value']['formatted'] = formatted Start date, i.e. 'February 15, 2007 2:00 pm';
 *   $dates['value']['formatted_date'] - only the date part of the formatted Start date
 *   $dates['value']['formatted_time'] - only the time part of the formatted Start date
 *   $dates['value2']['formatted'] = formatted End date, i.e. 'February 15, 2007 6:00 pm';
 *   $dates['value2']['formatted_date'] - only the date part of the formatted End date
 *   $dates['value2']['formatted_time'] - only the time part of the formatted End date
 */
function theme_date_display_combination($vars) {
  static $repeating_ids = array();

  $entity_type = $vars['entity_type'];
  $entity      = $vars['entity'];
  $field       = $vars['field'];
  $instance    = $vars['instance'];
  $langcode    = $vars['langcode'];
  $item        = $vars['item'];
  $delta       = $vars['delta'];
  $display     = $vars['display'];
  $field_name  = $field['field_name'];
  $formatter   = $display['type'];
  $options     = $display['settings'];
  $dates       = $vars['dates'];
  $attributes  = $vars['attributes'];
  $rdf_mapping = $vars['rdf_mapping'];
  $add_rdf     = $vars['add_rdf'];
  $precision   = date_granularity_precision($field['settings']['granularity']);

  // If date_id is set for this field and the delta doesn't match, don't display it.
  if (!empty($entity->date_id)) {
    foreach ((array) $entity->date_id as $key => $id) {
      list($module, $nid, $field_name, $item_delta, $other) = explode('.', $id . '.');
      if ($field_name == $field['field_name'] && isset($delta) && $item_delta != $delta) {
        return $output;
      }
    }
  }
  // Check the formatter settings to see if the repeat rule should be
  // displayed. Show it only with the first multiple value date.
  list($id) = entity_extract_ids($entity_type, $entity);
  if (!in_array($id, $repeating_ids) && module_exists('date_repeat_field')
  && !empty($item['rrule']) && $options['show_repeat_rule'] == 'show') {
    $repeat_vars = array(
      'field' => $field,
      'item' => $item,
      'entity_type' => $entity_type,
      'entity' => $entity,
    );
    $output .= theme('date_repeat_display', $repeat_vars);
    $repeating_ids[] = $id;
  }
  // If this is a full node or a pseudo node created by grouping
  // multiple values, see exactly which values are supposed to be visible.
  if (isset($entity->$field_name)) {
    $entity = date_prepare_entity($formatter, $entity_type, $entity, $field, $instance, $langcode, $item, $display);
    // Did the current value get removed by formatter settings?
    if (empty($entity->{$field_name}[$langcode][$delta])) {
      return $output;
    }
    // Adjust the $element values to match the changes.
    $element['#entity'] = $entity;
  }
  switch ($options['fromto']) {
    case 'value':
      $date1 = $dates['value']['formatted'];
      $date2 = $date1;
    case 'value2':
      $date2 = $dates['value2']['formatted'];
      $date1 = $date2;
      break;
    default:
      $date1 = $dates['value']['formatted'];
      $date2 = $dates['value2']['formatted'];
  // Pull the timezone, if any, out of the formatted result and tack it
  // back on at the end, if it is in the current formatted date.
  $timezone = $dates['value']['formatted_timezone'];
  if ($timezone) {
    $timezone = ' ' . $timezone;
  }
  $date1 = str_replace($timezone, '', $date1);
  $date2 = str_replace($timezone, '', $date2);
  $time1 = preg_replace('`^([\(\[])`', '', $dates['value']['formatted_time']);
  $time1 = preg_replace('([\)\]]$)', '', $time1);
  $time2 = preg_replace('`^([\(\[])`', '', $dates['value2']['formatted_time']);
  $time2 = preg_replace('([\)\]]$)', '', $time2);

  // A date with a granularity of 'hour' has a time string that is just an integer value.
  // We can't use that to replace time strings in formatted dates.
  $has_time_string = date_has_time($field['settings']['granularity']);
  if ($precision == 'hour') {
    $has_time_string = FALSE;
  }
  // No date values, display nothing.
  if (empty($date1) && empty($date2)) {
    $output .= '';
  }
  // Start and End dates match or there is no End date, display a complete single date.
  elseif ($date1 == $date2 || empty($date2)) {
    $output .= theme('date_display_single', array(
      'date' => $date1,
      'timezone' => $timezone,
      'attributes' => $attributes,
      'rdf_mapping' => $rdf_mapping,
      'add_rdf' => $add_rdf,
      'dates' => $dates,
  // Same day, different times, don't repeat the date but show both Start and End times.
  // We can NOT do this if the replacement value is an integer instead of a time string.
  elseif ($has_time_string && $dates['value']['formatted_date'] == $dates['value2']['formatted_date']) {
    // Replace the original time with the start/end time in the formatted start date.
    // Make sure that parentheses or brackets wrapping the time will be retained in the
    // final result.
    $time = theme('date_display_range', array(
      'date1' => $time1,
      'timezone' => $timezone,
      'attributes' => $attributes,
      'rdf_mapping' => $rdf_mapping,
      'add_rdf' => $add_rdf,
      'dates' => $dates,
    ));
    $output .= theme('date_display_single', array(
      'date' => $replaced,
      'timezone' => $timezone,
      'attributes' => array(),
      'rdf_mapping' => array(),
      'add_rdf' => FALSE,
      'dates' => $dates,
    ));
    $output .= theme('date_display_range', array(
      'date1' => $date1,
      'date2' => $date2,
      'timezone' => $timezone,
      'attributes' => $attributes,
      'rdf_mapping' => $rdf_mapping,
      'add_rdf' => $add_rdf,
      'dates' => $dates,
    ));
/**
 * Template preprocess function for displaying a single date.
 */
function template_preprocess_date_display_single(&$vars) {
  if ($vars['add_rdf']) {
    // Pass along the rdf mapping for this field, if any.
    // Add some default rdf attributes that will be used if not overridden by attributes passed in.
    $rdf_mapping = $vars['rdf_mapping'];
    $base_attributes = array(
      'property' => array('dc:date'),
      'datatype' => 'xsd:dateTime',
      'content' => $vars['dates']['value']['formatted_iso'],
    $vars['attributes'] = $vars['attributes'] + $base_attributes;
}

function theme_date_display_single($vars) {
  $date = $vars['date'];
  $timezone = $vars['timezone'];
  $attributes = $vars['attributes'];

  // Wrap the result with the attributes.
  return '<span class="date-display-single"' . drupal_attributes($attributes) . '>' . $date . $timezone . '</span>';
/**
 * Template preprocess function for displaying a range of dates.
 */
function template_preprocess_date_display_range(&$vars) {
  // Merge in the shared attributes for themes to use.
  $vars['attributes_start'] += $vars['attributes'];
  $vars['attributes_end'] += $vars['attributes'];
    // Pass along the rdf mapping for this field, if any.
    // Add some default rdf attributes that will be used if not overridden by attributes passed in.
    $rdf_mapping = $vars['rdf_mapping'];
    $base_attributes = array(
      'property' => array('dc:date'),
      'datatype' => 'xsd:dateTime',
      'content' => $dates['value']['formatted_iso'],
    );
    $vars['attributes_start'] += $base_attributes;
    $vars['attributes_end'] += $base_attributes;
    $vars['attributes_end']['content'] = $dates['value2']['formatted_iso'];
    foreach ($vars['attributes_end']['property'] as $delta => $property) {
      $vars['attributes_end']['property'][$delta] = str_replace('start', 'end', $property);
}

function theme_date_display_range($vars) {
  $date1 = $vars['date1'];
  $date2 = $vars['date2'];
  $timezone = $vars['timezone'];
  $attributes_start = $vars['attributes_start'];
  $attributes_end = $vars['attributes_end'];

  // Wrap the result with the attributes.
  return t('!start-date to !end-date', array(
    '!start-date' => '<span class="date-display-start"' . drupal_attributes($attributes_start) . '>' . $date1 . '</span>',
    '!end-date' => '<span class="date-display-end"' . drupal_attributes($attributes_end) . '>' . $date2 . $timezone. '</span>',
}

/**
 * Theme a format interval for a date element
 *
 *  @param $field = the field settings
 *  @param $entity = node information, this is not always available and not
 *     always the full node, it depends on what value was provided to the formatter.
 *     Only the nid is always guaranteed to be available.
 *  @param $dates - an array of date information, see explanation for date_field_object for details.
 *  @return a formatted display
 *
 */
function theme_date_display_interval($vars) {
  $entity_type = $vars['entity_type'];
  $entity      = $vars['entity'];
  $field       = $vars['field'];
  $instance    = $vars['instance'];
  $langcode    = $vars['langcode'];
  $item        = $vars['item'];
  $delta       = $vars['delta'];
  $display     = $vars['display'];
  $field_name  = $field['field_name'];
  $options     = $display['settings'];
  $dates       = $vars['dates'];
  $formatter   = $display['type'];
  $attributes  = $vars['attributes'];
  $rdf_mapping = $vars['rdf_mapping'];
  $add_rdf     = $vars['add_rdf'];
  // Get the formatter settings, either the default settings for this node
  // type or the View settings stored in $entity->date_info.
  if (!empty($entity->date_info) && !empty($entity->date_info->formatter_settings)) {
    $options = $entity->date_info->formatter_settings;
  }

  $time_ago_vars = array(
    'start_date' => $dates['value']['local']['object'],
    'end_date' => $dates['value2']['local']['object'],
    'interval' => $options['interval'],
  );
  return '<span class="date-display-interval"' . drupal_attributes($attributes) . '>' .theme('date_time_ago', $time_ago_vars) . '</span>';
 *  Theme start/end date combination on form.
 */
function theme_date_combo($vars) {
  $element = $vars['element'];
  $field = field_info_field($element['#field_name']);
  $instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);

  // Group start/end items together in fieldset.
    '#title' => t($element['#title']) . ' ' . ($element['#delta'] > 0 ? intval($element['#delta'] + 1) : ''),
    '#description' => !empty($element['#fieldset_description']) ? $element['#fieldset_description'] : '',
    '#attributes' => array(),
    '#children' => $element['#children'],
  );
  return theme('fieldset', array('element' => $fieldset));
}

/**
 * Display the text/select options for date parts in a table
 * for easier readability.
 */
function theme_date_text_parts($vars) {
  $element = $vars['element'];
  $names = date_granularity_names();
  $rows = array();
  foreach ($names as $key => $part) {
    if ($element[$key]['#type'] == 'hidden') {
      $rows[] = drupal_render($element[$key]);
    }
    else {
      $rows[] = array($names[$key], drupal_render($element[$key][0]), drupal_render($element[$key][1]));
    }
  }
  if ($element['year']['#type'] == 'hidden') {
    return implode($rows) . drupal_render_children($element);
  }
  else {
    $header = array(t('Date part'), t('Select list'), t('Text field'));
    return theme('table', array('header' => $header, 'rows' => $rows)) . drupal_render_children($element);
  }
}