You are here

public function DateFieldWidgetBase::formElement in Date 8

Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().

The widget builds out a complex date element in the following way:

  • A field is pulled out of the database which is comprised of one or more collections of start/end dates.
  • The dates in this field are all converted from the UTC values stored in the database back to the local time. This is done in #process to avoid making this change to dates that are not being processed, like those hidden with #access.
  • If values are empty, the field settings rules are used to determine if the default_values should be empty, now, the same, or use strtotime.
  • Each start/end combination is created using the date_combo element type defined by the date module. If the timezone is date-specific, a timezone selector is added to the first combo element.
  • The date combo element creates two individual date elements, one each for the start and end field, using the appropriate individual Date API date elements, like selects, textfields, or popups.
  • In the individual element validation, the data supplied by the user is used to update the individual date values.
  • In the combo date validation, the timezone is updated, if necessary, then the user input date values are used with that timezone to create date objects, which are used update combo date timezone and offset values.
  • In the field's submission processing, the new date values, which are in the local timezone, are converted back to their UTC values and stored.
2 calls to DateFieldWidgetBase::formElement()
DateFieldDatepickerWidget::formElement in date_field/lib/Drupal/date_field/Plugin/field/widget/DateFieldDatepickerWidget.php
Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
DateFieldListWidget::formElement in date_field/lib/Drupal/date_field/Plugin/field/widget/DateFieldListWidget.php
Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
2 methods override DateFieldWidgetBase::formElement()
DateFieldDatepickerWidget::formElement in date_field/lib/Drupal/date_field/Plugin/field/widget/DateFieldDatepickerWidget.php
Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
DateFieldListWidget::formElement in date_field/lib/Drupal/date_field/Plugin/field/widget/DateFieldListWidget.php
Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().

File

date_field/lib/Drupal/date_field/Plugin/field/widget/DateFieldWidgetBase.php, line 140
Definition of Drupal\date_field\Plugin\field\widget\DateFieldWidgetBase.

Class

DateFieldWidgetBase
Abstract class for all date widgets.

Namespace

Drupal\date_field\Plugin\field\widget

Code

public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
  $field = $this->field;
  $instance = $this->instance;
  $field_name = $field['field_name'];
  $entity_type = $instance['entity_type'];
  module_load_include('inc', 'date_api', 'date_api_elements');
  $timezone = date_get_timezone($field['settings']['tz_handling'], isset($items[0]['timezone']) ? $items[0]['timezone'] : drupal_get_user_timezone());
  $element += array(
    '#weight' => $delta,
    '#default_value' => isset($items[$delta]) ? $items[$delta] : '',
    '#date_timezone' => $timezone,
    '#element_validate' => array(
      'date_combo_validate',
    ),
    '#required' => $element['#required'],
    // Store the original values, for use with disabled and hidden fields.
    '#date_items' => isset($items[$delta]) ? $items[$delta] : '',
  );
  $element['#title'] = $instance['label'];
  if ($field['settings']['tz_handling'] == 'date') {
    $element['timezone'] = array(
      '#type' => 'date_timezone',
      '#theme_wrappers' => array(
        'date_timezone',
      ),
      '#delta' => $delta,
      '#default_value' => $timezone,
      '#weight' => $instance['widget']['weight'] + 1,
      '#attributes' => array(
        'class' => array(
          'date-no-float',
        ),
      ),
      '#date_label_position' => $instance['widget']['settings']['label_position'],
    );
  }
  return $element;
}