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']); $output = ''; // 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; 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 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, '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(&$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 '' . $date . $timezone . ''; } /** * 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']; 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']; $dates = $vars['dates']; $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' => '' . $date1 . '', '!end-date' => '' . $date2 . $timezone. '', )); } /** * 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 '' .theme('date_time_ago', $time_ago_vars) . ''; } /** * 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. $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)); } /** * 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); } } /** @} End of addtogroup themeable */