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']; $microdata = $variables['microdata']; $add_microdata = $variables['add_microdata']; $precision = date_granularity_precision($field['settings']['granularity']); $show_remaining_days = $variables['show_remaining_days']; $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; } // Check remaining days. $show_remaining_days = ''; if (!empty($variables['show_remaining_days'])) { $remaining_days = floor((strtotime($variables['dates']['value']['formatted_iso']) - strtotime('now')) / (24 * 3600)); // Show remaining days only for future events. if ($remaining_days >= 0) { $show_remaining_days = theme('date_display_remaining', array( 'remaining_days' => $remaining_days, )); } } // 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, 'microdata' => $microdata, 'add_microdata' => $add_microdata, 'dates' => $dates, 'show_remaining_days' => $show_remaining_days, )); } // 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, 'microdata' => $microdata, 'add_microdata' => $add_microdata, 'dates' => $dates, 'show_remaining_days' => $show_remaining_days, )); $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, 'microdata' => $microdata, 'add_microdata' => $add_microdata, 'dates' => $dates, 'show_remaining_days' => $show_remaining_days, )); } return $output; } /** * Template preprocess function for displaying a single date. */ function template_preprocess_date_display_single(&$variables) { if ($variables['add_rdf'] || !empty($variables['add_microdata'])) { // 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; } // Pass along microdata attributes, or set display to false if none are set. if (!empty($variables['add_microdata'])) { // Because the Entity API integration for Date has a variable data // structure depending on whether there is an end value, the attributes // could be attached to the field or to the value property. if (!empty($variables['microdata']['#attributes']['itemprop'])) { $variables['microdata']['value']['#attributes'] = $variables['microdata']['#attributes']; } // Add the machine readable time using the content attribute. if (!empty($variables['microdata']['value']['#attributes'])) { $variables['microdata']['value']['#attributes']['content'] = $variables['dates']['value']['formatted_iso']; } else { $variables['add_microdata'] = FALSE; } } } /** * 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']; $show_remaining_days = isset($variables['show_remaining_days']) ? $variables['show_remaining_days'] : ''; // Wrap the result with the attributes. $output = '' . $date . $timezone . ''; if (!empty($variables['add_microdata'])) { $output .= ''; } // Add remaining message and return. return $output . $show_remaining_days; } /** * 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. $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); } } // Pass along microdata attributes, or set display to false if none are set. if ($variables['add_microdata']) { if (!empty($variables['microdata']['value']['#attributes'])) { $variables['microdata']['value']['#attributes']['content'] = $variables['dates']['value']['formatted_iso']; $variables['microdata']['value2']['#attributes']['content'] = $variables['dates']['value2']['formatted_iso']; } else { $variables['add_microdata'] = FALSE; } } } /** * 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']; $show_remaining_days = $variables['show_remaining_days']; $start_date = '' . $date1 . ''; $end_date = '' . $date2 . $timezone . ''; // If microdata attributes for the start date property have been passed in, // add the microdata in meta tags. if (!empty($variables['add_microdata'])) { $start_date .= ''; $end_date .= ''; } // Wrap the result with the attributes. $output = '' . t('!start-date to !end-date', array( '!start-date' => $start_date, '!end-date' => $end_date, )) . ''; // Add remaining message and return. return $output . $show_remaining_days; } /** * 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'], 'interval_display' => $options['interval_display'], 'use_end_date' => !empty($options['use_end_date']) ? $options['use_end_date'] : FALSE, ); if ($return = theme('date_time_ago', $time_ago_vars)) { return '$return"; } else { return ''; } } /** * 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' => field_filter_xss(t($element['#title'])) . ($element['#delta'] > 0 ? ' ' . intval($element['#delta'] + 1) : ''), '#value' => '', '#description' => !empty($element['#description']) ? $element['#description'] : '', '#attributes' => array('class' => array('date-combo')), '#children' => $element['#children'], ); // Add marker to required date fields. if ($element['#required']) { $fieldset['#title'] .= " " . theme('form_required_marker'); } 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); } } /** * Render a date combo as a form element. */ function theme_date_form_element($variables) { $element = &$variables['element']; // Detect whether element is multiline. $count = preg_match_all('`<(?:div|span)\b[^>]* class="[^"]*\b(?:date-no-float|date-clear)\b`', $element['#children'], $matches, PREG_OFFSET_CAPTURE); $multiline = FALSE; if ($count > 1) { $multiline = TRUE; } elseif ($count) { $before = substr($element['#children'], 0, $matches[0][0][1]); if (preg_match('`<(?:div|span)\b[^>]* class="[^"]*\bdate-float\b`', $before)) { $multiline = TRUE; } } // Detect if there is more than one subfield. $count = count(explode(''. $element['#children'] .''; return theme('form_element', $variables); } /** * Returns HTML for remaining message. */ function theme_date_display_remaining($variables) { $remaining_days = $variables['remaining_days']; $output = ''; $show_remaining_text = t('The upcoming date less then 1 day.'); if ($remaining_days) { $show_remaining_text = format_plural($remaining_days, 'To event remaining 1 day', 'To event remaining @count days'); } return '
' . $show_remaining_text . '
'; } /** @} End of addtogroup themeable */