public static function CalendarSystemsDateList::valueCallback in Calendar Systems 8.3
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.
Overrides Datelist::valueCallback
File
- src/
Element/ CalendarSystemsDateList.php, line 20
Class
- CalendarSystemsDateList
- Plugin annotation @FormElement("datelist");
Namespace
Drupal\calendar_systems\ElementCode
public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
$parts = $element['#date_part_order'];
$increment = $element['#date_increment'];
$date = NULL;
if ($input !== FALSE) {
$return = $input;
if (empty(static::checkEmptyInputs($input, $parts))) {
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;
try {
$date = DrupalDateTime::createFromArray($input, $timezone);
} catch (Exception $e) {
$form_state
->setError($element, t('Selected combination of day and month is not valid.'));
}
if ($date instanceof DrupalDateTime && !$date
->hasErrors()) {
static::incrementRound($date, $increment);
}
}
}
else {
$return = array_fill_keys($parts, '');
if (!empty($element['#default_value'])) {
$date = $element['#default_value'];
if ($date instanceof DrupalDateTime && !$date
->hasErrors()) {
static::incrementRound($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';
break;
default:
$format = '';
}
$return[$part] = $date
->format($format);
}
}
}
}
$timezone = isset($timezone) ? $timezone : NULL;
$calendar = _calendar_systems_factory($timezone, 'en');
if ($calendar && $date && $date
->format('Y') < 1600) {
$ok = $calendar
->parse($date
->format('Y m d H i s'), 'Y m d H i s');
if (!$ok) {
$form_state
->setError($element, t('Selected combination of day and month is invalid.'));
}
else {
$date = DrupalDateTime::createFromTimestamp($calendar
->getTimestamp(), $timezone);
}
}
$return['object'] = $date;
return $return;
}