You are here

public static function DateBase::validateDate in Webform 8.5

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

Webform element validation handler for date elements.

Note that #required is validated by _form_validate() already.

See also

\Drupal\Core\Render\Element\Number::validateNumber

File

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

Class

DateBase
Provides a base 'date' class.

Namespace

Drupal\webform\Plugin\WebformElement

Code

public static function validateDate(&$element, FormStateInterface $form_state, &$complete_form) {
  $value = $element['#value'];
  $name = empty($element['#title']) ? $element['#parents'][0] : $element['#title'];
  $date_date_format = !empty($element['#date_date_format']) ? $element['#date_date_format'] : DateFormat::load('html_date')
    ->getPattern();
  $date_time_format = !empty($element['#date_time_format']) ? $element['#date_time_format'] : DateFormat::load('html_time')
    ->getPattern();

  // Convert DrupalDateTime array and object to ISO datetime.
  if (is_array($value)) {
    $value = $value['object'] ? $value['object']
      ->format(DateFormat::load('html_datetime')
      ->getPattern()) : '';
  }
  elseif ($value) {
    $datetime = WebformDateHelper::createFromFormat($date_date_format, $value);
    if ($datetime === FALSE || static::formatDate($date_date_format, $datetime
      ->getTimestamp()) !== $value) {
      $form_state
        ->setError($element, t('%name must be a valid date.', [
        '%name' => $name,
      ]));
      $value = '';
    }
    else {

      // Clear timestamp to date elements.
      if ($element['#type'] === 'date') {
        $datetime
          ->setTime(0, 0, 0);
        $value = $datetime
          ->format(DateFormat::load('html_date')
          ->getPattern());
      }
      else {
        $value = $datetime
          ->format(DateFormat::load('html_datetime')
          ->getPattern());
      }
    }
  }
  $form_state
    ->setValueForElement($element, $value);
  if ($value === '') {
    return;
  }
  $time = strtotime($value);

  // Ensure that the input is greater than the #date_date_min property, if set.
  if (isset($element['#date_date_min'])) {
    $min = strtotime(static::formatDate('Y-m-d', strtotime($element['#date_date_min'])));
    if ($time < $min) {
      $form_state
        ->setError($element, t('%name must be on or after %min.', [
        '%name' => $name,
        '%min' => static::formatDate($date_date_format, $min),
      ]));
    }
  }

  // Ensure that the input is less than the #date_date_max property, if set.
  if (isset($element['#date_date_max'])) {
    $max = strtotime(static::formatDate('Y-m-d 23:59:59', strtotime($element['#date_date_max'])));
    if ($time > $max) {
      $form_state
        ->setError($element, t('%name must be on or before %max.', [
        '%name' => $name,
        '%max' => static::formatDate($date_date_format, $max),
      ]));
    }
  }

  // Ensure that the input is greater than the #date_min property, if set.
  if (isset($element['#date_min'])) {
    $min = strtotime($element['#date_min']);
    if ($time < $min) {
      $form_state
        ->setError($element, t('%name must be on or after %min.', [
        '%name' => $name,
        '%min' => static::formatDate($date_date_format, $min) . ' ' . static::formatDate($date_time_format, $min),
      ]));
    }
  }

  // Ensure that the input is less than the #date_max property, if set.
  if (isset($element['#date_max'])) {
    $max = strtotime($element['#date_max']);
    if ($time > $max) {
      $form_state
        ->setError($element, t('%name must be on or before %max.', [
        '%name' => $name,
        '%max' => static::formatDate($date_date_format, $max) . ' ' . static::formatDate($date_time_format, $max),
      ]));
    }
  }

  // Ensure that the input is a day of week.
  if (!empty($element['#date_days'])) {
    $days = $element['#date_days'];
    $day = date('w', $time);
    if (!in_array($day, $days)) {
      $form_state
        ->setError($element, t('%name must be a %days.', [
        '%name' => $name,
        '%days' => WebformArrayHelper::toString(array_intersect_key(DateHelper::weekDays(TRUE), array_combine($days, $days)), t('or')),
      ]));
    }
  }
}