View source
<?php
namespace Drupal\commerce_store\Plugin\Field\FieldFormatter;
use Drupal\commerce_store\CurrentStoreInterface;
use Drupal\commerce_store\Entity\Store;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class StoreDateTimeFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
protected $currentStore;
protected $dateFormatStorage;
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, CurrentStoreInterface $current_store, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
$this->currentStore = $current_store;
$this->dateFormatStorage = $entity_type_manager
->getStorage('date_format');
}
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('commerce_store.current_store'), $container
->get('entity_type.manager'));
}
public static function defaultSettings() {
return [
'date_format' => 'medium',
] + parent::defaultSettings();
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$form = parent::settingsForm($form, $form_state);
$date = new DrupalDateTime('now', $this
->getTimezone());
$date_formats = $this->dateFormatStorage
->loadMultiple();
$options = [];
foreach ($date_formats as $type => $date_format) {
$example = $date
->format($date_format
->getPattern());
$options[$type] = $date_format
->label() . ' (' . $example . ')';
}
$form['date_format'] = [
'#type' => 'select',
'#title' => $this
->t('Date format'),
'#description' => $this
->t('Choose a format for displaying the date. Be sure to set a format appropriate for the field, i.e. omitting time for a field that only has a date.'),
'#options' => $options,
'#default_value' => $this
->getSetting('date_format'),
];
return $form;
}
public function settingsSummary() {
$summary = parent::settingsSummary();
$date_format = $this
->getDateFormat();
$date = new DrupalDateTime('now', $this
->getTimezone());
$summary[] = $this
->t('Format: @date_format', [
'@date_format' => $date
->format($date_format
->getPattern()),
]);
return $summary;
}
public function viewElements(FieldItemListInterface $items, $langcode) {
$date_pattern = $this
->getDateFormat()
->getPattern();
$timezone = $this
->getTimezone();
$store = $this->currentStore
->getStore();
$elements = [];
foreach ($items as $delta => $item) {
if ($item->value) {
$date = new DrupalDateTime($item->value, $timezone);
$elements[$delta] = [
'#theme' => 'time',
'#text' => $date
->format($date_pattern),
'#html' => FALSE,
'#attributes' => [
'datetime' => $date
->format('Y-m-d\\TH:i:sP'),
],
'#cache' => [
'contexts' => [
'store',
],
],
];
if ($store) {
$cacheability = new CacheableMetadata();
$cacheability
->addCacheableDependency($store);
$cacheability
->applyTo($elements[$delta]);
}
if (!empty($item->_attributes)) {
$elements[$delta]['#attributes'] += $item->_attributes;
unset($item->_attributes);
}
}
}
return $elements;
}
protected function getDateFormat() {
$date_format = $this->dateFormatStorage
->load($this
->getSetting('date_format'));
if (!$date_format) {
$date_format = $this->dateFormatStorage
->load('fallback');
}
return $date_format;
}
protected function getTimezone() {
$store = $this->currentStore
->getStore();
if ($store) {
$timezone = $store
->getTimezone();
}
else {
$site_timezone = Store::getSiteTimezone();
$timezone = reset($site_timezone);
}
return $timezone;
}
}