You are here

private static function CalendarSystemsDateTime::xProcessDatetime in Calendar Systems 8.3

1 call to CalendarSystemsDateTime::xProcessDatetime()
CalendarSystemsDateTime::processDatetime in src/Element/CalendarSystemsDateTime.php
Expands a datetime element type into date and/or time elements.

File

src/Element/CalendarSystemsDateTime.php, line 126

Class

CalendarSystemsDateTime
Plugin annotation @FormElement("datetime");

Namespace

Drupal\calendar_systems\Element

Code

private static function xProcessDatetime(&$element, FormStateInterface $form_state, &$complete_form) {
  $format_settings = [];

  // 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'] = date_default_timezone_get();
  }
  $element['#tree'] = TRUE;
  if ($element['#date_date_element'] != 'none') {
    $date_format = $element['#date_date_element'] != 'none' ? static::getHtml5DateFormat($element) : '';
    $date_value = !empty($date) ? $date
      ->format($date_format, $format_settings) : $element['#value']['date'];

    // Creating format examples on every individual date item is messy, and
    // placeholders are invalid for HTML5 date and datetime, so an example
    // format is appended to the title to appear in tooltips.
    $extra_attributes = [
      'title' => t('Date (e.g. @format)', [
        '@format' => static::formatExample($date_format),
      ]),
      'type' => $element['#date_date_element'],
    ];

    // Adds the HTML5 date attributes.
    if ($date instanceof DrupalDateTime && !$date
      ->hasErrors()) {
      $html5_min = clone $date;
      $range = CalendarSystemsDateList::calendarSystemsDatetimeRangeYears($element['#date_year_range'], DrupalDateTime::createFromTimestamp($date
        ->getTimestamp()));
      $html5_min
        ->setDate($range[0], 1, 1)
        ->setTime(0, 0, 0);
      $html5_max = clone $date;
      $html5_max
        ->setDate($range[1], 12, 31)
        ->setTime(23, 59, 59);
      $extra_attributes += [
        'min' => $html5_min
          ->format($date_format, $format_settings),
        'max' => $html5_max
          ->format($date_format, $format_settings),
      ];
    }
    $element['date'] = [
      '#type' => 'date',
      '#title' => t('Date'),
      '#title_display' => 'invisible',
      '#value' => $date_value,
      '#attributes' => $element['#attributes'] + $extra_attributes,
      '#required' => $element['#required'],
      '#size' => max(12, strlen($element['#value']['date'])),
      '#error_no_message' => TRUE,
      '#date_date_format' => $element['#date_date_format'],
    ];

    // 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);
        }
      }
    }
  }
  if ($element['#date_time_element'] != 'none') {
    $time_format = $element['#date_time_element'] != 'none' ? static::getHtml5TimeFormat($element) : '';
    $time_value = !empty($date) ? $date
      ->format($time_format, $format_settings) : $element['#value']['time'];

    // Adds the HTML5 attributes.
    $extra_attributes = [
      'title' => t('Time (e.g. @format)', [
        '@format' => static::formatExample($time_format),
      ]),
      'type' => $element['#date_time_element'],
      'step' => $element['#date_increment'],
    ];
    $element['time'] = [
      '#type' => 'date',
      '#title' => t('Time'),
      '#title_display' => 'invisible',
      '#value' => $time_value,
      '#attributes' => $element['#attributes'] + $extra_attributes,
      '#required' => $element['#required'],
      '#size' => 12,
      '#error_no_message' => TRUE,
    ];

    // Allows custom callbacks to alter the element.
    if (!empty($element['#date_time_callbacks'])) {
      foreach ($element['#date_time_callbacks'] as $callback) {
        if (function_exists($callback)) {
          $callback($element, $form_state, $date);
        }
      }
    }
  }
  return $element;
}