diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php index 31d7dc5..0695982 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php @@ -92,6 +92,9 @@ public static function defaultSettings() { public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); + // @todo There should be a way to specify/change which timezone the date + // is displayed with (eg, for an event site that spans multiple timezones, + // transforming the time into the site/user's timezone may not make sense). $form['timezone_override'] = array( '#type' => 'select', '#title' => $this->t('Time zone override'), diff --git a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php index b56fd84..6ae7595 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php +++ b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php @@ -57,7 +57,6 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel ->setClass('\Drupal\datetime\DateTimeComputed') ->setSetting('date source', 'value'); - // @todo Shouldn't this only be needed if `$field_definition->getSetting('timezone_handling') === TRUE`? $properties['timezone'] = DataDefinition::create('string') ->setLabel(t('Timezone')); @@ -75,21 +74,17 @@ public static function schema(FieldStorageDefinitionInterface $field_definition) 'type' => 'varchar', 'length' => 20, ), + 'timezone' => array( + 'description' => 'The date timezone', + 'type' => 'varchar', + 'length' => 50, + ), ), 'indexes' => array( - 'value' => array('value'), + 'value' => array('value', 'timezone'), ), ); - // Store the timezone if timezone handling is per-date. - if ($field_definition->getSetting('timezone_handling') === 'date') { - $schema['columns']['timezone'] = array( - 'description' => 'The date timezone', - 'type' => 'varchar', - 'length' => 50, - ); - } - return $schema; } @@ -123,6 +118,15 @@ public function storageSettingsForm(array &$form, FormStateInterface $form_state ), '#default_value' => $this->getSetting('timezone_handling'), '#required' => TRUE, + '#states' => array( + 'visible' => array( + ':input[name="settings[datetime_type]"]' => ['value' => static::DATETIME_TYPE_DATETIME], + ), + 'disabled' => array( + ':input[name="settings[datetime_type]"]' => ['value' => static::DATETIME_TYPE_DATE], + ), + ), + '#disabled' => $has_data, ); return $element; diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php index 864a0d3..d382f04 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php @@ -30,20 +30,21 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#type' => 'datetime', '#default_value' => NULL, '#date_increment' => 1, - '#date_timezone' => drupal_get_user_timezone(), + '#date_timezone' => $items[$delta]->timezone ?: drupal_get_user_timezone(), '#required' => $element['#required'], ); if ($this->getFieldSetting('timezone_handling') === 'date') { $element['timezone'] = array( '#type' => 'select', - '#options' => \DateTimeZone::listIdentifiers(), + '#options' => array_combine(\DateTimeZone::listIdentifiers(), \DateTimeZone::listIdentifiers()), // Default to user's timezone. '#default_value' => drupal_get_user_timezone(), ); } if ($items[$delta]->date) { + /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ $date = $items[$delta]->date; // The date was created and verified during field_load(), so it is safe to // use without further inspection. @@ -54,6 +55,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen } $date->setTimezone(new \DateTimeZone($element['value']['#date_timezone'])); $element['value']['#default_value'] = $date; + $element['timezone']['#default_value'] = $date->format('e'); } return $element;