dateFormatter = $date_formatter; $this->dateFormatStorage = $date_format_storage; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], $container->get('date.formatter'), $container->get('entity.manager')->getStorage('date_format') ); } /** * {@inheritdoc} */ public static function defaultSettings() { return [ 'date_format' => 'medium', 'custom_date_format' => '', 'timezone' => '', ] + parent::defaultSettings(); } /** * {@inheritdoc} */ public function settingsForm(array $form, FormStateInterface $form_state) { $elements = parent::settingsForm($form, $form_state); $date_formats = []; foreach ($this->dateFormatStorage->loadMultiple() as $machine_name => $value) { $date_formats[$machine_name] = $this->t('@name format: @date', ['@name' => $value->label(), '@date' => $this->dateFormatter->format(REQUEST_TIME, $machine_name)]); } $date_formats['custom'] = $this->t('Custom'); $elements['date_format'] = [ '#type' => 'select', '#title' => $this->t('Date format'), '#options' => $date_formats, '#default_value' => $this->getSetting('date_format') ?: 'medium', ]; $elements['custom_date_format'] = [ '#type' => 'textfield', '#title' => $this->t('Custom date format'), '#description' => $this->t('See the documentation for PHP date formats.'), '#default_value' => $this->getSetting('custom_date_format') ?: '', ]; $elements['custom_date_format']['#states']['visible'][] = [ ':input[name="fields[' . $this->fieldDefinition->getName() . '][settings_edit_form][settings][date_format]"]' => ['value' => 'custom'], ]; $elements['timezone'] = [ '#type' => 'select', '#title' => $this->t('Time zone'), '#options' => ['' => $this->t('- Default site/user time zone -')] + system_time_zones(FALSE, TRUE), '#default_value' => $this->getSetting('timezone'), ]; return $elements; } /** * {@inheritdoc} */ public function settingsSummary() { $summary = parent::settingsSummary(); $date_format = $this->getSetting('date_format'); $summary[] = $this->t('Date format: @date_format', ['@date_format' => $date_format]); if ($this->getSetting('date_format') === 'custom' && ($custom_date_format = $this->getSetting('custom_date_format'))) { $summary[] = $this->t('Custom date format: @custom_date_format', ['@custom_date_format' => $custom_date_format]); } if ($timezone = $this->getSetting('timezone')) { $summary[] = $this->t('Time zone: @timezone', ['@timezone' => $timezone]); } return $summary; } /** * {@inheritdoc} */ public function viewElements(FieldItemListInterface $items, $langcode) { $elements = []; $date_format = $this->getSetting('date_format'); $custom_date_format = ''; $timezone = $this->getSetting('timezone') ?: NULL; $langcode = NULL; // If an RFC2822 date format is requested, then the month and day have to // be in English. @see http://www.faqs.org/rfcs/rfc2822.html if ($date_format === 'custom' && ($custom_date_format = $this->getSetting('custom_date_format')) === 'r') { $langcode = 'en'; } foreach ($items as $delta => $item) { $elements[$delta] = [ '#cache' => [ 'contexts' => [ 'timezone', ], ], '#markup' => $this->dateFormatter->format($item->value, $date_format, $custom_date_format, $timezone, $langcode), ]; } return $elements; } }