function form_type_datelist_value

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.

Parameters

array $element: The element being processed.

array|false $input:

array $form_state: (optional) The current state of the form. Defaults to an empty array.

Return value

array

File

drupal/core/modules/datetime/datetime.module, line 926
Field hooks to implement a simple datetime field.

Code

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;
}