DateTimeFormatterBase.php

Same filename in other branches
  1. 8.9.x core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php
  2. 10 core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php
  3. 11.x core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php

Namespace

Drupal\datetime\Plugin\Field\FieldFormatter

File

core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php

View source
<?php

namespace Drupal\datetime\Plugin\Field\FieldFormatter;

use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Base class for 'DateTime Field formatter' plugin implementations.
 */
abstract class DateTimeFormatterBase extends FormatterBase {
    
    /**
     * The date formatter service.
     *
     * @var \Drupal\Core\Datetime\DateFormatterInterface
     */
    protected $dateFormatter;
    
    /**
     * The date format entity storage.
     *
     * @var \Drupal\Core\Entity\EntityStorageInterface
     */
    protected $dateFormatStorage;
    
    /**
     * Constructs a new DateTimeDefaultFormatter.
     *
     * @param string $plugin_id
     *   The plugin_id for the formatter.
     * @param mixed $plugin_definition
     *   The plugin implementation definition.
     * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
     *   The definition of the field to which the formatter is associated.
     * @param array $settings
     *   The formatter settings.
     * @param string $label
     *   The formatter label display setting.
     * @param string $view_mode
     *   The view mode.
     * @param array $third_party_settings
     *   Third party settings.
     * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
     *   The date formatter service.
     * @param \Drupal\Core\Entity\EntityStorageInterface $date_format_storage
     *   The date format entity storage.
     */
    public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, DateFormatterInterface $date_formatter, EntityStorageInterface $date_format_storage) {
        parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
        $this->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_type.manager')
            ->getStorage('date_format'));
    }
    
    /**
     * {@inheritdoc}
     */
    public static function defaultSettings() {
        return [
            'timezone_override' => '',
        ] + parent::defaultSettings();
    }
    
    /**
     * {@inheritdoc}
     */
    public function settingsForm(array $form, FormStateInterface $form_state) {
        $form = parent::settingsForm($form, $form_state);
        $form['timezone_override'] = [
            '#type' => 'select',
            '#title' => $this->t('Time zone override'),
            '#description' => $this->t('The time zone selected here will always be used'),
            '#options' => system_time_zones(TRUE, TRUE),
            '#default_value' => $this->getSetting('timezone_override'),
        ];
        return $form;
    }
    
    /**
     * {@inheritdoc}
     */
    public function settingsSummary() {
        $summary = parent::settingsSummary();
        if ($override = $this->getSetting('timezone_override')) {
            $summary[] = $this->t('Time zone: @timezone', [
                '@timezone' => $override,
            ]);
        }
        return $summary;
    }
    
    /**
     * {@inheritdoc}
     */
    public function viewElements(FieldItemListInterface $items, $langcode) {
        $elements = [];
        foreach ($items as $delta => $item) {
            if ($item->date) {
                
                /** @var \Drupal\Core\Datetime\DrupalDateTime $date */
                $date = $item->date;
                $elements[$delta] = $this->buildDateWithIsoAttribute($date);
                if (!empty($item->_attributes)) {
                    $elements[$delta]['#attributes'] += $item->_attributes;
                    // Unset field item attributes since they have been included in the
                    // formatter output and should not be rendered in the field template.
                    unset($item->_attributes);
                }
            }
        }
        return $elements;
    }
    
    /**
     * Creates a formatted date value as a string.
     *
     * @param object $date
     *   A date object.
     *
     * @return string
     *   A formatted date string using the chosen format.
     */
    protected abstract function formatDate($date);
    
    /**
     * Sets the proper time zone on a DrupalDateTime object for the current user.
     *
     * A DrupalDateTime object loaded from the database will have the UTC time
     * zone applied to it.  This method will apply the time zone for the current
     * user, based on system and user settings.
     *
     * @param \Drupal\Core\Datetime\DrupalDateTime $date
     *   A DrupalDateTime object.
     */
    protected function setTimeZone(DrupalDateTime $date) {
        if ($this->getFieldSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
            // A date without time has no timezone conversion.
            $timezone = DateTimeItemInterface::STORAGE_TIMEZONE;
        }
        else {
            $timezone = date_default_timezone_get();
        }
        $date->setTimeZone(timezone_open($timezone));
    }
    
    /**
     * Gets a settings array suitable for DrupalDateTime::format().
     *
     * @return array
     *   The settings array that can be passed to DrupalDateTime::format().
     */
    protected function getFormatSettings() {
        $settings = [];
        if ($this->getSetting('timezone_override') != '') {
            $settings['timezone'] = $this->getSetting('timezone_override');
        }
        return $settings;
    }
    
    /**
     * Creates a render array from a date object.
     *
     * @param \Drupal\Core\Datetime\DrupalDateTime $date
     *   A date object.
     *
     * @return array
     *   A render array.
     */
    protected function buildDate(DrupalDateTime $date) {
        $this->setTimeZone($date);
        $build = [
            '#markup' => $this->formatDate($date),
            '#cache' => [
                'contexts' => [
                    'timezone',
                ],
            ],
        ];
        return $build;
    }
    
    /**
     * Creates a render array from a date object with ISO date attribute.
     *
     * @param \Drupal\Core\Datetime\DrupalDateTime $date
     *   A date object.
     *
     * @return array
     *   A render array.
     */
    protected function buildDateWithIsoAttribute(DrupalDateTime $date) {
        // Create the ISO date in Universal Time.
        $iso_date = $date->format("Y-m-d\\TH:i:s") . 'Z';
        $this->setTimeZone($date);
        $build = [
            '#theme' => 'time',
            '#text' => $this->formatDate($date),
            '#attributes' => [
                'datetime' => $iso_date,
            ],
            '#cache' => [
                'contexts' => [
                    'timezone',
                ],
            ],
        ];
        return $build;
    }

}

Classes

Title Deprecated Summary
DateTimeFormatterBase Base class for 'DateTime Field formatter' plugin implementations.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.