diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php index d694c28..ed535d1 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php @@ -25,6 +25,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $element['#theme_wrappers'][] = 'datetime_wrapper'; $element['#attributes']['class'][] = 'container-inline'; + $element['#element_validate'][] = [$this, 'validateStartEnd']; $element['start_value'] = array( '#title' => $this->t('Start'), @@ -127,4 +128,24 @@ public function massageFormValues(array $values, array $form, FormStateInterface return $values; } + /** + * Validates that the start <= the end date. + */ + public function validateStartEnd($element, FormStateInterface $form_state) { + $start_date = $element['start_value']['#value']['object']; + $end_date = $element['end_value']['#value']['object']; + + if ($start_date instanceof DrupalDateTime && $end_date instanceof DrupalDateTime) { + /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ + /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ + + if ($start_date->format('U') !== $end_date->format('U')) { + $interval = $start_date->diff($end_date); + if ($interval->invert === 1) { + $form_state->setError($element, $this->t('Start date should be equal to, or before, end date')); + } + } + } + } + }