You are here

public static function DateBase::preValidateDate in Webform 6.x

Same name and namespace in other branches
  1. 8.5 src/Plugin/WebformElement/DateBase.php \Drupal\webform\Plugin\WebformElement\DateBase::preValidateDate()

Webform element pre validation handler for Date elements.

File

src/Plugin/WebformElement/DateBase.php, line 476

Class

DateBase
Provides a base 'date' class.

Namespace

Drupal\webform\Plugin\WebformElement

Code

public static function preValidateDate(&$element, FormStateInterface $form_state, &$complete_form) {

  // ISSUE #2723159:
  // Datetime form element cannot validate when using a
  // format without seconds.
  // WORKAROUND:
  // Append the second format before the time element is validated.
  //
  // @see \Drupal\Core\Datetime\Element\Datetime::valueCallback
  // @see https://www.drupal.org/node/2723159
  if ($element['#type'] === 'datetime' && $element['#date_time_format'] === 'H:i' && strlen($element['#value']['time']) === 8) {
    $element['#date_time_format'] = 'H:i:s';
  }

  // ISSUE:
  // Date list in composite element is missing the date object.
  //
  // WORKAROUND:
  // Manually set the date object.
  $date_element_types = [
    'datelist' => '\\Drupal\\Core\\Datetime\\Element\\Datelist',
    'datetime' => '\\Drupal\\Core\\Datetime\\Element\\Datetime',
  ];
  if (isset($date_element_types[$element['#type']])) {
    $date_class = $date_element_types[$element['#type']];
    $input_exists = FALSE;
    $input = NestedArray::getValue($form_state
      ->getValues(), $element['#parents'], $input_exists);
    if (!isset($input['object'])) {

      // Time picker converts all submitted time values to H:i:s format.
      // @see \Drupal\webform\Element\WebformTime::validateWebformTime
      if (isset($element['#date_time_element']) && $element['#date_time_element'] === 'timepicker') {
        $element['#date_time_format'] = 'H:i:s';
      }
      $input = $date_class::valueCallback($element, $input, $form_state);
      $form_state
        ->setValueForElement($element, $input);
      $element['#value'] = $input;
    }
  }
}