Element value callback for datelist element.
Validates the date type to adjust 12 hour time and prevent invalid dates. If the date is valid, the date is set in the form.
array $element: The element being processed.
array|false $input:
array $form_state: (optional) The current state of the form. Defaults to an empty array.
array
function form_type_datelist_value($element, $input = FALSE, &$form_state = array()) {
$parts = $element['#date_part_order'];
$increment = $element['#date_increment'];
$date = NULL;
if ($input !== FALSE) {
$return = $input;
if (isset($input['ampm'])) {
if ($input['ampm'] == 'pm' && $input['hour'] < 12) {
$input['hour'] += 12;
}
elseif ($input['ampm'] == 'am' && $input['hour'] == 12) {
$input['hour'] -= 12;
}
unset($input['ampm']);
}
$timezone = !empty($element['#date_timezone']) ? $element['#date_timezone'] : NULL;
$date = new DrupalDateTime($input, $timezone);
if ($date instanceof DrupalDateTime && !$date
->hasErrors()) {
date_increment_round($date, $increment);
}
}
else {
$return = array_fill_keys($parts, '');
if (!empty($element['#default_value'])) {
$date = $element['#default_value'];
if ($date instanceof DrupalDateTime && !$date
->hasErrors()) {
date_increment_round($date, $increment);
foreach ($parts as $part) {
switch ($part) {
case 'day':
$format = 'j';
break;
case 'month':
$format = 'n';
break;
case 'year':
$format = 'Y';
break;
case 'hour':
$format = in_array('ampm', $element['#date_part_order']) ? 'g' : 'G';
break;
case 'minute':
$format = 'i';
break;
case 'second':
$format = 's';
break;
case 'ampm':
$format = 'a';
}
$return[$part] = $date
->format($format);
}
}
}
}
$return['object'] = $date;
return $return;
}