View source
<?php
module_load_include('theme', 'date', 'date');
module_load_include('inc', 'date', '/date.field');
module_load_include('inc', 'date', '/date_elements');
function date_menu() {
$items = array();
if (!module_exists('date_repeat')) {
return $items;
}
$items['node/%node/repeats'] = array(
'title' => 'Repeats',
'page callback' => 'date_repeat_page',
'page arguments' => array(
1,
'node',
),
'access callback' => 'date_repeat_entity',
'access arguments' => array(
1,
'node',
),
'type' => MENU_LOCAL_TASK,
);
return $items;
}
function date_permission() {
return array(
'view date repeats' => array(
'title' => t('View Repeating Dates'),
'description' => t('Allow user to see a tab with all the times this date repeats.'),
),
);
}
function date_repeat_entity($entity, $entity_type = 'node') {
if (date_repeat_type($entity, $entity_type = 'node')) {
return user_access('view date repeats');
}
return FALSE;
}
function date_repeat_type($entity, $entity_type = 'node') {
$bundle = '';
switch ($entity_type) {
case 'node':
$bundle = $entity->type;
break;
}
$type = field_info_instances($entity_type, $bundle);
foreach ($type as $field_name => $field) {
$field = field_info_field($field_name);
if (in_array($field['type'], array(
'date',
'datestamp',
'datetime',
)) && $field['settings']['repeat']) {
return TRUE;
}
}
return FALSE;
}
function date_repeat_fields($entity, $entity_type = 'node') {
$bundle = '';
switch ($entity_type) {
case 'node':
$bundle = $entity->type;
break;
}
$type = field_info_instances($entity_type, $bundle);
$fields = array();
foreach ($type as $field_name => $field) {
$field = field_info_field($field_name);
if (in_array($field['type'], array(
'date',
'datestamp',
'datetime',
)) && $field['settings']['repeat']) {
$fields[] = $field_name;
}
}
return $fields;
}
function date_repeat_page($entity, $entity_type = 'node') {
drupal_set_title($entity->title);
$entity->date_repeat_show_all = TRUE;
$entity->content = array();
$field_names = date_repeat_fields($entity, $entity_type);
$output = '';
foreach ($field_names as $field_name) {
$output .= drupal_render(field_view_field($entity_type, $entity, $field_name, 'full'));
}
return $output;
}
function date_is_repeat_field($field, $instance) {
$repeat_widgets = array(
'date_select_repeat',
'date_text_repeat',
'date_popup_repeat',
);
if (in_array($instance['widget']['type'], $repeat_widgets)) {
return TRUE;
}
elseif (in_array($instance['widget']['type']['#value'], $repeat_widgets)) {
return TRUE;
}
return FALSE;
}
function date_default_format($type) {
if (stristr($type, 'date_popup') && module_exists('date_popup')) {
$formats = date_popup_formats();
$default_format = array_shift($formats);
}
else {
$default_format = str_replace('i', 'i:s', variable_get('date_format_short', 'm/d/Y - H:i'));
}
return $default_format;
}
function date_input_date($field, $instance, $element, $input) {
switch ($instance['widget']['type']) {
case 'date_text':
case 'date_text_repeat':
$function = 'date_text_input_date';
break;
case 'date_popup':
case 'date_popup_repeat':
$function = 'date_popup_input_date';
break;
default:
$function = 'date_select_input_date';
}
return $function($element, $input);
}
function date_theme() {
$path = drupal_get_path('module', 'date');
module_load_include('theme', 'date', 'date');
$base = array(
'file' => 'date.theme',
'path' => "{$path}",
);
$themes = array(
'date_combo' => $base + array(
'render element' => 'element',
),
'date_text_parts' => $base + array(
'render element' => 'element',
),
'date' => $base + array(
'render element' => 'element',
),
'date_all_day' => $base + array(
'variables' => array(
'field' => NULL,
'instance' => NULL,
'which' => NULL,
'date1' => NULL,
'date2' => NULL,
'format' => NULL,
'entity_type' => NULL,
'entity' => NULL,
'view' => NULL,
),
),
'date_all_day_label' => $base + array(
'variables' => array(),
),
'date_display_single' => $base + array(
'variables' => array(
'date' => NULL,
'timezone' => NULL,
),
),
'date_display_range' => $base + array(
'variables' => array(
'date1' => NULL,
'date2' => NULL,
'timezone' => NULL,
),
),
'date_repeat_display' => $base + array(
'variables' => array(
'field' => NULL,
'item' => NULL,
'entity_type' => NULL,
'entity' => NULL,
'dates' => NULL,
),
'function' => 'theme_date_repeat_display',
),
'date_display_combination' => $base + array(
'variables' => array(
'entity_type' => NULL,
'entity' => NULL,
'field' => NULL,
'instance' => NULL,
'langcode' => NULL,
'item' => NULL,
'delta' => NULL,
'display' => NULL,
'dates' => NULL,
),
),
'date_display_interval' => $base + array(
'variables' => array(
'entity_type' => NULL,
'entity' => NULL,
'field' => NULL,
'instance' => NULL,
'langcode' => NULL,
'item' => NULL,
'delta' => NULL,
'display' => NULL,
'dates' => NULL,
),
),
);
return $themes;
}
function date_element_info() {
$type = array();
$type['date_combo'] = array(
'#input' => TRUE,
'#delta' => 0,
'#columns' => array(
'value',
'value2',
'timezone',
'offset',
'offset2',
),
'#process' => array(
'date_combo_element_process',
),
'#element_validate' => array(
'date_combo_validate',
),
'#value_callback' => 'date_combo_value_callback',
'#theme_wrappers' => array(
'date_combo',
),
);
return $type;
}
function date_formatter_process($formatter, $entity_type, $entity, $field, $instance, $langcode, $item, $display) {
$dates = array();
$timezone = date_default_timezone();
if (empty($timezone)) {
return $dates;
}
$granularity = date_granularity($field);
$settings = $display['settings'];
$field_name = $field['field_name'];
$format = date_formatter_format($formatter, $settings, $granularity, $langcode);
$timezone = isset($item['timezone']) ? $item['timezone'] : '';
$timezone = date_get_timezone($field['settings']['tz_handling'], $timezone);
$timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
$process = date_process_values($field);
foreach ($process as $processed) {
if (empty($item[$processed])) {
$dates[$processed] = NULL;
}
else {
$value = $item[$processed];
if ($field['type'] == DATE_ISO) {
}
$date = new DateObject($value, $timezone_db);
$date
->limitGranularity($field['settings']['granularity']);
$dates[$processed] = array();
$dates[$processed]['db']['object'] = $date;
$dates[$processed]['db']['datetime'] = date_format($date, DATE_FORMAT_DATETIME);
date_timezone_set($date, timezone_open($timezone));
$dates[$processed]['local']['object'] = $date;
$dates[$processed]['local']['datetime'] = date_format($date, DATE_FORMAT_DATETIME);
$dates[$processed]['local']['timezone'] = $timezone;
$dates[$processed]['local']['offset'] = date_offset_get($date);
$dates[$processed]['formatted'] = '';
if (is_object($date)) {
if ($format == 'format_interval') {
$dates[$processed]['interval'] = date_format_interval($date);
}
elseif ($format == 'format_calendar_day') {
$dates[$processed]['calendar_day'] = date_format_calendar_day($date);
}
elseif ($format == 'U') {
$dates[$processed]['formatted'] = date_format_date($date, 'custom', $format);
$dates[$processed]['formatted_date'] = date_format_date($date, 'custom', $format);
$dates[$processed]['formatted_time'] = '';
$dates[$processed]['formatted_timezone'] = '';
}
elseif (!empty($format)) {
$dates[$processed]['formatted'] = date_format_date($date, 'custom', $format);
$dates[$processed]['formatted_date'] = date_format_date($date, 'custom', date_limit_format($format, array(
'year',
'month',
'day',
)));
$dates[$processed]['formatted_time'] = date_format_date($date, 'custom', date_limit_format($format, array(
'hour',
'minute',
'second',
)));
$dates[$processed]['formatted_timezone'] = date_format_date($date, 'custom', date_limit_format($format, array(
'timezone',
)));
}
}
}
}
if (empty($dates['value2'])) {
$dates['value2'] = $dates['value'];
}
$date1 = $dates['value']['local']['object'];
$date2 = $dates['value2']['local']['object'];
$all_day = '';
$all_day2 = '';
if ($format != 'format_interval') {
$all_day1 = theme('date_all_day', array(
'field' => $field,
'which' => 'date1',
'date1' => $date1,
'date2' => $date2,
'format' => $format,
'entity_type' => $entity_type,
'entity' => $entity,
));
$all_day2 = theme('date_all_day', array(
'field' => $field,
'which' => 'date2',
'date1' => $date1,
'date2' => $date2,
'format' => $format,
'entity_type' => $entity_type,
'entity' => $entity,
));
}
if (!empty($all_day1) && $all_day1 != $dates['value']['formatted'] || !empty($all_day2) && $all_day2 != $dates['value2']['formatted']) {
$dates['value']['formatted_time'] = theme('date_all_day_label');
$dates['value2']['formatted_time'] = theme('date_all_day_label');
$dates['value']['formatted'] = $all_day1;
$dates['value2']['formatted'] = $all_day2;
}
$dates['format'] = $format;
return $dates;
}
function date_granularity($field) {
if (!is_array($field) || !is_array($field['settings']['granularity'])) {
$field['settings']['granularity'] = drupal_map_assoc(array(
'year',
'month',
'day',
));
}
return array_values(array_filter($field['settings']['granularity']));
}
function date_process_values($field) {
return $field['settings']['todate'] ? array(
'value',
'value2',
) : array(
'value',
);
}
function date_help($path, $arg) {
switch ($path) {
case 'admin/help#date':
return '<p>' . t('Complete documentation for the Date and Date API modules is available at <a href="@link">http://drupal.org/node/92460</a>.', array(
'@link' => 'http://drupal.org/node/92460',
)) . '</p>';
break;
}
}
function date_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'field_ui_field_edit_form') {
$field = $form['field'];
$instance = $form['instance'];
if (module_exists('date_repeat') && date_is_repeat_field($field, $instance)) {
$form['field']['cardinality'] = array(
'#type' => 'hidden',
'#value' => FIELD_CARDINALITY_UNLIMITED,
);
}
}
}
function date_field_widget_error($element, $error, $form, &$form_state) {
form_error($element[$error['error']], $error['message']);
}
function date_formatter_format($formatter, $settings, $granularity = NULL, $langcode = NULL) {
$default = variable_get('date_format_medium', 'D, m/d/Y - H:i');
$format_type = !empty($settings['format_type']) ? $settings['format_type'] : 'format_interval';
switch ($formatter) {
case 'format_interval':
return 'format_interval';
break;
case 'date_default':
$format = system_date_format_locale($langcode, $format_type);
if (empty($format)) {
$format = variable_get('date_format_' . $format_type, $default);
}
break;
default:
$type = str_replace('date_', '', $formatter);
$format = system_date_format_locale($langcode, $type);
if (empty($format)) {
$format = variable_get('date_format_' . $type, $default);
}
break;
}
array_push($granularity, 'timezone');
return date_limit_format($format, $granularity);
}
function date_prepare_entity($formatter, $entity_type, $entity, $field, $instance, $langcode, $item, $display) {
$field_name = $field['field_name'];
$options = $display['settings'];
$max_count = $options['multiple_number'];
if (is_numeric($max_count) && $max_count == 0) {
$entity->{$field_name} = array();
return $entity;
}
if (!empty($options['multiple_from']) || !empty($options['multiple_to']) || !empty($max_count)) {
$format = date_type_format($field['type']);
include_once drupal_get_path('module', 'date_api') . '/date_api_sql.inc';
$date_handler = new date_sql_handler($field);
$arg0 = !empty($options['multiple_from']) ? $date_handler
->arg_replace($options['multiple_from']) : variable_get('date_min_year', 100) . '-01-01T00:00:00';
$arg1 = !empty($options['multiple_to']) ? $date_handler
->arg_replace($options['multiple_to']) : variable_get('date_max_year', 4000) . '-12-31T23:59:59';
if (!empty($arg0) && !empty($arg1)) {
$arg = $arg0 . '--' . $arg1;
}
elseif (!empty($arg0)) {
$arg = $arg0;
}
elseif (!empty($arg1)) {
$arg = $arg1;
}
if (!empty($arg)) {
$range = $date_handler
->arg_range($arg);
$start = date_format($range[0], $format);
$end = date_format($range[1], $format);
$count = 0;
foreach ($entity->{$field_name}[$langcode] as $delta => $value) {
if (!empty($entity->date_repeat_show_all)) {
break;
}
elseif (!empty($max_count) && is_numeric($max_count) && $count >= $max_count || !empty($value['value']) && $value['value'] < $start || !empty($value['value2']) && $value['value2'] > $end) {
unset($entity->{$field_name}[$langcode][$delta]);
}
else {
$count++;
}
}
}
}
return $entity;
}
function date_field_get_sql_handler($field, $compare_tz = NULL) {
module_load_include('inc', 'date_api', 'date_api_sql');
$db_info = date_api_database_info($field);
$handler = new date_sql_handler();
$handler
->construct($field['type']);
if ($field['settings']['tz_handling'] == 'date') {
$handler->db_timezone_field = $db_info['columns']['timezone']['column'];
}
else {
$handler->db_timezone = date_get_timezone_db($field['settings']['tz_handling']);
}
if (empty($compare_tz)) {
$compare_tz = date_get_timezone($field['settings']['tz_handling']);
}
$handler->local_timezone = $compare_tz;
$handler
->set_db_timezone();
return $handler;
}
function date_entity_metadata_property_info_alter(&$info, $entity_type, $field, $instance, $field_type) {
$name = $field['field_name'];
$property =& $info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name];
if ($field['type'] != 'datestamp' || $field['settings']['timezone_db'] != 'UTC') {
$property['getter callback'] = 'date_entity_metadata_field_getter';
unset($property['query callback']);
unset($property['setter callback']);
}
if (!empty($field['settings']['todate'])) {
$property['type'] = $field['cardinality'] != 1 ? 'list<struct>' : 'struct';
$property['getter callback'] = 'entity_metadata_field_verbatim_get';
$property['property info'] = array(
'value' => array(
'type' => 'date',
'label' => t('From date'),
'getter callback' => 'date_entity_metadata_struct_getter',
),
'value2' => array(
'type' => 'date',
'label' => t('To date'),
'getter callback' => 'date_entity_metadata_struct_getter',
),
'duration' => array(
'type' => 'duration',
'label' => t('Duration'),
'desription' => t('The duration of the time period given by the dates.'),
'getter callback' => 'date_entity_metadata_duration_getter',
),
);
unset($property['query callback']);
unset($property['setter callback']);
}
}
function date_entity_metadata_field_getter($object, array $options, $name, $obj_type, &$context) {
$return = entity_metadata_field_verbatim_get($object, $options, $name, $obj_type, $context);
$items = $context['field']['cardinality'] == 1 ? array(
$return,
) : $return;
foreach ($items as $key => $item) {
$items[$key] = date_entity_metadata_struct_getter($item, $options, 'value', 'struct');
}
return $context['field']['cardinality'] == 1 ? $items[0] : $items;
}
function date_entity_metadata_struct_getter($item, array $options, $name, $type) {
$value = trim($item[$name]);
$timezone_db = !empty($item['timezone_db']) ? $item['timezone_db'] : 'UTC';
$date = new DateObject($value, $timezone_db);
return !empty($date) ? date_format_date($date, 'custom', 'U') : NULL;
}
function date_entity_metadata_duration_getter($item, array $options, $name, $type) {
$value = date_entity_metadata_struct_getter($item, $options, 'value', 'struct');
$value2 = date_entity_metadata_struct_getter($item, $options, 'value2', 'struct');
if ($value && $value2) {
return $value2 - $value;
}
}
function date_field_all_day($field, $instance, $date1, $date2 = NULL) {
if (empty($date1) || !is_object($date1)) {
return FALSE;
}
elseif (!date_has_time($field['settings']['granularity'])) {
return FALSE;
}
if (empty($date2)) {
$date2 = $date1;
}
$granularity = $field['settings']['granularity'];
$granularity = array_pop($granularity);
$increment = isset($instance['widget']['increment']) ? $instance['widget']['increment'] : 1;
return date_is_all_day(date_format($date1, DATE_FORMAT_DATETIME), date_format($date1, DATE_FORMAT_DATETIME), $granularity, $increment);
}