Expands a date element into an array of individual elements.
Required settings:
Optional properties include:
Example usage:
$form = array(
'#type' => 'datelist',
'#default_value' => new DrupalDateTime('2000-01-01 00:00:00'),
'#date_part_order' => array(
'month',
'day',
'year',
'hour',
'minute',
'ampm',
),
'#date_text_parts' => array(
'year',
),
'#date_year_range' => '2010:2020',
'#date_increment' => 15,
);
array $element: The form element whose value is being processed.
array $form_state: The current state of the form.
function datetime_datelist_form_process($element, &$form_state) {
// Load translated date part labels from the appropriate calendar plugin.
$date_helper = new DateHelper();
// The value callback has populated the #value array.
$date = !empty($element['#value']['object']) ? $element['#value']['object'] : NULL;
// Set a fallback timezone.
if ($date instanceof DrupalDateTime) {
$element['#date_timezone'] = $date
->getTimezone()
->getName();
}
elseif (!empty($element['#timezone'])) {
$element['#date_timezone'] = $element['#date_timezone'];
}
else {
$element['#date_timezone'] = drupal_get_user_timezone();
}
$element['#tree'] = TRUE;
// Determine the order of the date elements.
$order = !empty($element['#date_part_order']) ? $element['#date_part_order'] : array(
'year',
'month',
'day',
);
$text_parts = !empty($element['#date_text_parts']) ? $element['#date_text_parts'] : array();
$has_time = FALSE;
// Output multi-selector for date.
foreach ($order as $part) {
switch ($part) {
case 'day':
$options = $date_helper
->days($element['#required']);
$format = 'j';
$title = t('Day');
break;
case 'month':
$options = $date_helper
->monthNamesAbbr($element['#required']);
$format = 'n';
$title = t('Month');
break;
case 'year':
$range = datetime_range_years($element['#date_year_range'], $date);
$options = $date_helper
->years($range[0], $range[1], $element['#required']);
$format = 'Y';
$title = t('Year');
break;
case 'hour':
$format = in_array('ampm', $element['#date_part_order']) ? 'g' : 'G';
$options = $date_helper
->hours($format, $element['#required']);
$has_time = TRUE;
$title = t('Hour');
break;
case 'minute':
$format = 'i';
$options = $date_helper
->minutes($format, $element['#required'], $element['#date_increment']);
$has_time = TRUE;
$title = t('Minute');
break;
case 'second':
$format = 's';
$options = $date_helper
->seconds($format, $element['#required'], $element['#date_increment']);
$has_time = TRUE;
$title = t('Second');
break;
case 'ampm':
$format = 'a';
$options = $date_helper
->ampm($element['#required']);
$has_time = TRUE;
$title = t('AM/PM');
}
$default = !empty($element['#value'][$part]) ? $element['#value'][$part] : '';
$value = $date instanceof DrupalDateTime && !$date
->hasErrors() ? $date
->format($format) : $default;
if (!empty($value) && $part != 'ampm') {
$value = intval($value);
}
$element['#attributes']['title'] = $title;
$element[$part] = array(
'#type' => in_array($part, $text_parts) ? 'textfield' : 'select',
'#title' => $title,
'#title_display' => 'invisible',
'#value' => $value,
'#attributes' => $element['#attributes'],
'#options' => $options,
'#required' => $element['#required'],
);
}
// Allows custom callbacks to alter the element.
if (!empty($element['#date_date_callbacks'])) {
foreach ($element['#date_date_callbacks'] as $callback) {
if (function_exists($callback)) {
$callback($element, $form_state, $date);
}
}
}
return $element;
}