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($variables) { static $repeating_ids = array(); $entity_type = $variables['entity_type']; $entity = $variables['entity']; $field = $variables['field']; $instance = $variables['instance']; $langcode = $variables['langcode']; $item = $variables['item']; $delta = $variables['delta']; $display = $variables['display']; $field_name = $field['field_name']; $formatter = $display['type']; $options = $display['settings']; $dates = $variables['dates']; $attributes = $variables['attributes']; $rdf_mapping = $variables['rdf_mapping']; $add_rdf = $variables['add_rdf']; $precision = date_granularity_precision($field['settings']['granularity']); $output = ''; // If date_id is set for this field and 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; break; case 'value2': $date2 = $dates['value2']['formatted']; $date1 = $date2; break; default: $date1 = $dates['value']['formatted']; $date2 = $dates['value2']['formatted']; break; } // 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 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, 'date2' => $time2, 'timezone' => $timezone, 'attributes' => $attributes, 'rdf_mapping' => $rdf_mapping, 'add_rdf' => $add_rdf, 'dates' => $dates, )); $replaced = str_replace($time1, $time, $date1); $output .= theme('date_display_single', array( 'date' => $replaced, 'timezone' => $timezone, 'attributes' => array(), 'rdf_mapping' => array(), 'add_rdf' => FALSE, 'dates' => $dates, )); } // Different days, display both in their entirety. else { $output .= theme('date_display_range', array( 'date1' => $date1, 'date2' => $date2, 'timezone' => $timezone, 'attributes' => $attributes, 'rdf_mapping' => $rdf_mapping, 'add_rdf' => $add_rdf, 'dates' => $dates, )); } return $output; } /** * Template preprocess function for displaying a single date. */ function template_preprocess_date_display_single(&$variables) { if ($variables['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 = $variables['rdf_mapping']; $base_attributes = array( 'property' => array('dc:date'), 'datatype' => 'xsd:dateTime', 'content' => $variables['dates']['value']['formatted_iso'], ); $variables['attributes'] = $variables['attributes'] + $base_attributes; } } /** * Returns HTML for a date element formatted as a single date. */ function theme_date_display_single($variables) { $date = $variables['date']; $timezone = $variables['timezone']; $attributes = $variables['attributes']; // Wrap the result with the attributes. return '' . $date . $timezone . ''; } /** * Template preprocess function for displaying a range of dates. */ function template_preprocess_date_display_range(&$variables) { // Merge in the shared attributes for themes to use. $variables['attributes_start'] += $variables['attributes']; $variables['attributes_end'] += $variables['attributes']; if ($variables['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 = $variables['rdf_mapping']; $dates = $variables['dates']; $base_attributes = array( 'property' => array('dc:date'), 'datatype' => 'xsd:dateTime', 'content' => $dates['value']['formatted_iso'], ); $variables['attributes_start'] += $base_attributes; $variables['attributes_end'] += $base_attributes; $variables['attributes_end']['content'] = $dates['value2']['formatted_iso']; foreach ($variables['attributes_end']['property'] as $delta => $property) { $variables['attributes_end']['property'][$delta] = str_replace('start', 'end', $property); } } } /** * Returns HTML for a date element formatted as a range. */ function theme_date_display_range($variables) { $date1 = $variables['date1']; $date2 = $variables['date2']; $timezone = $variables['timezone']; $attributes_start = $variables['attributes_start']; $attributes_end = $variables['attributes_end']; // Wrap the result with the attributes. return t('!start-date to !end-date', array( '!start-date' => '' . $date1 . '', '!end-date' => '' . $date2 . $timezone . '', )); } /** * Returns HTML for a date element formatted as an interval. */ function theme_date_display_interval($variables) { $entity = $variables['entity']; $options = $variables['display']['settings']; $dates = $variables['dates']; $attributes = $variables['attributes']; // 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 '' . theme('date_time_ago', $time_ago_vars) . ''; } /** * Returns HTML for a start/end date combination on form. */ function theme_date_combo($variables) { $element = $variables['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. $fieldset = array( '#title' => t($element['#title']) . ' ' . ($element['#delta'] > 0 ? intval($element['#delta'] + 1) : ''), '#value' => '', '#description' => !empty($element['#fieldset_description']) ? $element['#fieldset_description'] : '', '#attributes' => array(), '#children' => $element['#children'], ); return theme('fieldset', array('element' => $fieldset)); } /** * Returns HTML for the text/select options for date parts in a table. */ function theme_date_text_parts($variables) { $element = $variables['element']; $rows = array(); foreach (date_granularity_names() as $key => $part) { if ($element[$key]['#type'] == 'hidden') { $rows[] = drupal_render($element[$key]); } else { $rows[] = array($part, 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); } } /** @} End of addtogroup themeable */