Update Composer, update everything
This commit is contained in:
parent
ea3e94409f
commit
dda5c284b6
19527 changed files with 1135420 additions and 351004 deletions
|
|
@ -5,6 +5,7 @@ namespace Drupal\datetime\Plugin\Field\FieldFormatter;
|
|||
use Drupal\Core\Datetime\DrupalDateTime;
|
||||
use Drupal\Core\Field\FieldItemListInterface;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
|
||||
|
||||
/**
|
||||
* Plugin implementation of the 'Custom' formatter for 'datetime' fields.
|
||||
|
|
@ -24,7 +25,7 @@ class DateTimeCustomFormatter extends DateTimeFormatterBase {
|
|||
*/
|
||||
public static function defaultSettings() {
|
||||
return [
|
||||
'date_format' => DATETIME_DATETIME_STORAGE_FORMAT,
|
||||
'date_format' => DateTimeItemInterface::DATETIME_STORAGE_FORMAT,
|
||||
] + parent::defaultSettings();
|
||||
}
|
||||
|
||||
|
|
@ -32,30 +33,18 @@ class DateTimeCustomFormatter extends DateTimeFormatterBase {
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
public function viewElements(FieldItemListInterface $items, $langcode) {
|
||||
// @todo Evaluate removing this method in
|
||||
// https://www.drupal.org/node/2793143 to determine if the behavior and
|
||||
// markup in the base class implementation can be used instead.
|
||||
$elements = [];
|
||||
|
||||
foreach ($items as $delta => $item) {
|
||||
$output = '';
|
||||
if (!empty($item->date)) {
|
||||
/** @var \Drupal\Core\Datetime\DrupalDateTime $date */
|
||||
$date = $item->date;
|
||||
|
||||
if ($this->getFieldSetting('datetime_type') == 'date') {
|
||||
// A date without time will pick up the current time, use the default.
|
||||
datetime_date_default_time($date);
|
||||
}
|
||||
$this->setTimeZone($date);
|
||||
|
||||
$output = $this->formatDate($date);
|
||||
$elements[$delta] = $this->buildDate($date);
|
||||
}
|
||||
$elements[$delta] = [
|
||||
'#markup' => $output,
|
||||
'#cache' => [
|
||||
'contexts' => [
|
||||
'timezone',
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
namespace Drupal\datetime\Plugin\Field\FieldFormatter;
|
||||
|
||||
use Drupal\Core\Datetime\DrupalDateTime;
|
||||
use Drupal\Core\Field\FieldItemListInterface;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
|
||||
/**
|
||||
|
|
@ -28,59 +27,6 @@ class DateTimeDefaultFormatter extends DateTimeFormatterBase {
|
|||
] + parent::defaultSettings();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function viewElements(FieldItemListInterface $items, $langcode) {
|
||||
$elements = [];
|
||||
|
||||
foreach ($items as $delta => $item) {
|
||||
$output = '';
|
||||
$iso_date = '';
|
||||
|
||||
if ($item->date) {
|
||||
/** @var \Drupal\Core\Datetime\DrupalDateTime $date */
|
||||
$date = $item->date;
|
||||
|
||||
if ($this->getFieldSetting('datetime_type') == 'date') {
|
||||
// A date without time will pick up the current time, use the default.
|
||||
datetime_date_default_time($date);
|
||||
}
|
||||
|
||||
// Create the ISO date in Universal Time.
|
||||
$iso_date = $date->format("Y-m-d\TH:i:s") . 'Z';
|
||||
|
||||
$this->setTimeZone($date);
|
||||
|
||||
$output = $this->formatDate($date);
|
||||
}
|
||||
|
||||
// Display the date using theme datetime.
|
||||
$elements[$delta] = [
|
||||
'#cache' => [
|
||||
'contexts' => [
|
||||
'timezone',
|
||||
],
|
||||
],
|
||||
'#theme' => 'time',
|
||||
'#text' => $output,
|
||||
'#html' => FALSE,
|
||||
'#attributes' => [
|
||||
'datetime' => $iso_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;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
@ -122,7 +68,7 @@ class DateTimeDefaultFormatter extends DateTimeFormatterBase {
|
|||
$summary = parent::settingsSummary();
|
||||
|
||||
$date = new DrupalDateTime();
|
||||
$summary[] = t('Format: @display', ['@display' => $this->formatDate($date, $this->getFormatSettings())]);
|
||||
$summary[] = t('Format: @display', ['@display' => $this->formatDate($date)]);
|
||||
|
||||
return $summary;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,13 +6,14 @@ 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\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
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.
|
||||
*/
|
||||
|
|
@ -97,7 +98,7 @@ abstract class DateTimeFormatterBase extends FormatterBase implements ContainerF
|
|||
'#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),
|
||||
'#options' => system_time_zones(TRUE, TRUE),
|
||||
'#default_value' => $this->getSetting('timezone_override'),
|
||||
];
|
||||
|
||||
|
|
@ -117,6 +118,30 @@ abstract class DateTimeFormatterBase extends FormatterBase implements ContainerF
|
|||
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.
|
||||
*
|
||||
|
|
@ -143,7 +168,7 @@ abstract class DateTimeFormatterBase extends FormatterBase implements ContainerF
|
|||
protected function setTimeZone(DrupalDateTime $date) {
|
||||
if ($this->getFieldSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
// A date without time has no timezone conversion.
|
||||
$timezone = DATETIME_STORAGE_TIMEZONE;
|
||||
$timezone = DateTimeItemInterface::STORAGE_TIMEZONE;
|
||||
}
|
||||
else {
|
||||
$timezone = drupal_get_user_timezone();
|
||||
|
|
@ -167,4 +192,60 @@ abstract class DateTimeFormatterBase extends FormatterBase implements ContainerF
|
|||
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),
|
||||
'#html' => FALSE,
|
||||
'#attributes' => [
|
||||
'datetime' => $iso_date,
|
||||
],
|
||||
'#cache' => [
|
||||
'contexts' => [
|
||||
'timezone',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
return $build;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace Drupal\datetime\Plugin\Field\FieldFormatter;
|
|||
|
||||
use Drupal\Core\Field\FieldItemListInterface;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
|
||||
|
||||
/**
|
||||
* Plugin implementation of the 'Plain' formatter for 'datetime' fields.
|
||||
|
|
@ -25,27 +26,12 @@ class DateTimePlainFormatter extends DateTimeFormatterBase {
|
|||
$elements = [];
|
||||
|
||||
foreach ($items as $delta => $item) {
|
||||
$output = '';
|
||||
if (!empty($item->date)) {
|
||||
/** @var \Drupal\Core\Datetime\DrupalDateTime $date */
|
||||
$date = $item->date;
|
||||
|
||||
if ($this->getFieldSetting('datetime_type') == 'date') {
|
||||
// A date without time will pick up the current time, use the default.
|
||||
datetime_date_default_time($date);
|
||||
}
|
||||
$this->setTimeZone($date);
|
||||
|
||||
$output = $this->formatDate($date);
|
||||
$elements[$delta] = $this->buildDate($date);
|
||||
}
|
||||
$elements[$delta] = [
|
||||
'#cache' => [
|
||||
'contexts' => [
|
||||
'timezone',
|
||||
],
|
||||
],
|
||||
'#markup' => $output,
|
||||
];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
|
|
@ -55,7 +41,7 @@ class DateTimePlainFormatter extends DateTimeFormatterBase {
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
protected function formatDate($date) {
|
||||
$format = $this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT;
|
||||
$format = $this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE ? DateTimeItemInterface::DATE_STORAGE_FORMAT : DateTimeItemInterface::DATETIME_STORAGE_FORMAT;
|
||||
$timezone = $this->getSetting('timezone_override');
|
||||
return $this->dateFormatter->format($date->getTimestamp(), 'custom', $format, $timezone != '' ? $timezone : NULL);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,17 +2,9 @@
|
|||
|
||||
namespace Drupal\datetime\Plugin\Field\FieldFormatter;
|
||||
|
||||
use Drupal\Component\Utility\SafeMarkup;
|
||||
use Drupal\Core\Cache\CacheableMetadata;
|
||||
use Drupal\Core\Datetime\DateFormatterInterface;
|
||||
use Drupal\Core\Datetime\DrupalDateTime;
|
||||
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\HttpFoundation\Request;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Drupal\Core\Field\Plugin\Field\FieldFormatter\TimestampAgoFormatter;
|
||||
|
||||
/**
|
||||
* Plugin implementation of the 'Time ago' formatter for 'datetime' fields.
|
||||
|
|
@ -25,80 +17,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
|||
* }
|
||||
* )
|
||||
*/
|
||||
class DateTimeTimeAgoFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
|
||||
|
||||
/**
|
||||
* The date formatter service.
|
||||
*
|
||||
* @var \Drupal\Core\Datetime\DateFormatterInterface
|
||||
*/
|
||||
protected $dateFormatter;
|
||||
|
||||
/**
|
||||
* The current Request object.
|
||||
*
|
||||
* @var \Symfony\Component\HttpFoundation\Request
|
||||
*/
|
||||
protected $request;
|
||||
|
||||
/**
|
||||
* Constructs a DateTimeTimeAgoFormatter object.
|
||||
*
|
||||
* @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 \Symfony\Component\HttpFoundation\Request $request
|
||||
* The current request.
|
||||
*/
|
||||
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, DateFormatterInterface $date_formatter, Request $request) {
|
||||
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
|
||||
|
||||
$this->dateFormatter = $date_formatter;
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function defaultSettings() {
|
||||
$settings = [
|
||||
'future_format' => '@interval hence',
|
||||
'past_format' => '@interval ago',
|
||||
'granularity' => 2,
|
||||
] + parent::defaultSettings();
|
||||
|
||||
return $settings;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@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('request_stack')->getCurrentRequest()
|
||||
);
|
||||
}
|
||||
class DateTimeTimeAgoFormatter extends TimestampAgoFormatter {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
|
|
@ -110,10 +29,6 @@ class DateTimeTimeAgoFormatter extends FormatterBase implements ContainerFactory
|
|||
$date = $item->date;
|
||||
$output = [];
|
||||
if (!empty($item->date)) {
|
||||
if ($this->getFieldSetting('datetime_type') == 'date') {
|
||||
// A date without time will pick up the current time, use the default.
|
||||
datetime_date_default_time($date);
|
||||
}
|
||||
$output = $this->formatDate($date);
|
||||
}
|
||||
$elements[$delta] = $output;
|
||||
|
|
@ -122,50 +37,6 @@ class DateTimeTimeAgoFormatter extends FormatterBase implements ContainerFactory
|
|||
return $elements;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function settingsForm(array $form, FormStateInterface $form_state) {
|
||||
$form = parent::settingsForm($form, $form_state);
|
||||
|
||||
$form['future_format'] = [
|
||||
'#type' => 'textfield',
|
||||
'#title' => $this->t('Future format'),
|
||||
'#default_value' => $this->getSetting('future_format'),
|
||||
'#description' => $this->t('Use <em>@interval</em> where you want the formatted interval text to appear.'),
|
||||
];
|
||||
|
||||
$form['past_format'] = [
|
||||
'#type' => 'textfield',
|
||||
'#title' => $this->t('Past format'),
|
||||
'#default_value' => $this->getSetting('past_format'),
|
||||
'#description' => $this->t('Use <em>@interval</em> where you want the formatted interval text to appear.'),
|
||||
];
|
||||
|
||||
$form['granularity'] = [
|
||||
'#type' => 'number',
|
||||
'#title' => $this->t('Granularity'),
|
||||
'#default_value' => $this->getSetting('granularity'),
|
||||
'#description' => $this->t('How many time units should be shown in the formatted output.'),
|
||||
];
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function settingsSummary() {
|
||||
$summary = parent::settingsSummary();
|
||||
|
||||
$future_date = new DrupalDateTime('1 year 1 month 1 week 1 day 1 hour 1 minute');
|
||||
$past_date = new DrupalDateTime('-1 year -1 month -1 week -1 day -1 hour -1 minute');
|
||||
$summary[] = t('Future date: %display', ['%display' => $this->formatDate($future_date)]);
|
||||
$summary[] = t('Past date: %display', ['%display' => $this->formatDate($past_date)]);
|
||||
|
||||
return $summary;
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a date/time as a time interval.
|
||||
*
|
||||
|
|
@ -176,27 +47,7 @@ class DateTimeTimeAgoFormatter extends FormatterBase implements ContainerFactory
|
|||
* The formatted date/time string using the past or future format setting.
|
||||
*/
|
||||
protected function formatDate(DrupalDateTime $date) {
|
||||
$granularity = $this->getSetting('granularity');
|
||||
$timestamp = $date->getTimestamp();
|
||||
$options = [
|
||||
'granularity' => $granularity,
|
||||
'return_as_object' => TRUE,
|
||||
];
|
||||
|
||||
if ($this->request->server->get('REQUEST_TIME') > $timestamp) {
|
||||
$result = $this->dateFormatter->formatTimeDiffSince($timestamp, $options);
|
||||
$build = [
|
||||
'#markup' => SafeMarkup::format($this->getSetting('past_format'), ['@interval' => $result->getString()]),
|
||||
];
|
||||
}
|
||||
else {
|
||||
$result = $this->dateFormatter->formatTimeDiffUntil($timestamp, $options);
|
||||
$build = [
|
||||
'#markup' => SafeMarkup::format($this->getSetting('future_format'), ['@interval' => $result->getString()]),
|
||||
];
|
||||
}
|
||||
CacheableMetadata::createFromObject($result)->applyTo($build);
|
||||
return $build;
|
||||
return parent::formatTimestamp($date->getTimestamp());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,9 +51,9 @@ class DateTimeFieldItemList extends FieldItemList {
|
|||
'#states' => [
|
||||
'visible' => [
|
||||
':input[id="edit-default-value-input-default-date-type"]' => ['value' => static::DEFAULT_VALUE_CUSTOM],
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
return $element;
|
||||
|
|
@ -96,13 +96,13 @@ class DateTimeFieldItemList extends FieldItemList {
|
|||
// A default date only value should be in the format used for date
|
||||
// storage but in the user's local timezone.
|
||||
$date = new DrupalDateTime($default_value[0]['default_date'], drupal_get_user_timezone());
|
||||
$format = DATETIME_DATE_STORAGE_FORMAT;
|
||||
$format = DateTimeItemInterface::DATE_STORAGE_FORMAT;
|
||||
}
|
||||
else {
|
||||
// A default date+time value should be in the format and timezone used
|
||||
// for date storage.
|
||||
$date = new DrupalDateTime($default_value[0]['default_date'], DATETIME_STORAGE_TIMEZONE);
|
||||
$format = DATETIME_DATETIME_STORAGE_FORMAT;
|
||||
$date = new DrupalDateTime($default_value[0]['default_date'], DateTimeItemInterface::STORAGE_TIMEZONE);
|
||||
$format = DateTimeItemInterface::DATETIME_STORAGE_FORMAT;
|
||||
}
|
||||
$value = $date->format($format);
|
||||
// We only provide a default value for the first item, as do all fields.
|
||||
|
|
@ -112,7 +112,7 @@ class DateTimeFieldItemList extends FieldItemList {
|
|||
[
|
||||
'value' => $value,
|
||||
'date' => $date,
|
||||
]
|
||||
],
|
||||
];
|
||||
}
|
||||
return $default_value;
|
||||
|
|
|
|||
|
|
@ -17,10 +17,11 @@ use Drupal\Core\Field\FieldItemBase;
|
|||
* description = @Translation("Create and store date values."),
|
||||
* default_widget = "datetime_default",
|
||||
* default_formatter = "datetime_default",
|
||||
* list_class = "\Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList"
|
||||
* list_class = "\Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList",
|
||||
* constraints = {"DateTimeFormat" = {}}
|
||||
* )
|
||||
*/
|
||||
class DateTimeItem extends FieldItemBase {
|
||||
class DateTimeItem extends FieldItemBase implements DateTimeItemInterface {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
|
|
@ -108,10 +109,10 @@ class DateTimeItem extends FieldItemBase {
|
|||
// type.
|
||||
$timestamp = REQUEST_TIME - mt_rand(0, 86400 * 365);
|
||||
if ($type == DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
$values['value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $timestamp);
|
||||
$values['value'] = gmdate(static::DATE_STORAGE_FORMAT, $timestamp);
|
||||
}
|
||||
else {
|
||||
$values['value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $timestamp);
|
||||
$values['value'] = gmdate(static::DATETIME_STORAGE_FORMAT, $timestamp);
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Plugin\Field\FieldType;
|
||||
|
||||
/**
|
||||
* Interface definition for Datetime items.
|
||||
*/
|
||||
interface DateTimeItemInterface {
|
||||
|
||||
/**
|
||||
* Defines the timezone that dates should be stored in.
|
||||
*/
|
||||
const STORAGE_TIMEZONE = 'UTC';
|
||||
|
||||
/**
|
||||
* Defines the format that date and time should be stored in.
|
||||
*/
|
||||
const DATETIME_STORAGE_FORMAT = 'Y-m-d\TH:i:s';
|
||||
|
||||
/**
|
||||
* Defines the format that dates should be stored in.
|
||||
*/
|
||||
const DATE_STORAGE_FORMAT = 'Y-m-d';
|
||||
|
||||
}
|
||||
|
|
@ -7,6 +7,7 @@ use Drupal\Core\Field\FieldItemListInterface;
|
|||
use Drupal\Core\Field\WidgetBase;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
|
||||
|
||||
/**
|
||||
* Base class for the 'datetime_*' widgets.
|
||||
|
|
@ -28,20 +29,15 @@ class DateTimeWidgetBase extends WidgetBase {
|
|||
if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
// A date-only field should have no timezone conversion performed, so
|
||||
// use the same timezone as for storage.
|
||||
$element['value']['#date_timezone'] = DATETIME_STORAGE_TIMEZONE;
|
||||
$element['value']['#date_timezone'] = DateTimeItemInterface::STORAGE_TIMEZONE;
|
||||
}
|
||||
|
||||
if ($items[$delta]->date) {
|
||||
$date = $items[$delta]->date;
|
||||
// The date was created and verified during field_load(), so it is safe to
|
||||
// use without further inspection.
|
||||
if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
// A date without time will pick up the current time, use the default
|
||||
// time.
|
||||
datetime_date_default_time($date);
|
||||
}
|
||||
$date->setTimezone(new \DateTimeZone($element['value']['#date_timezone']));
|
||||
$element['value']['#default_value'] = $date;
|
||||
$element['value']['#default_value'] = $this->createDefaultValue($date, $element['value']['#date_timezone']);
|
||||
}
|
||||
|
||||
return $element;
|
||||
|
|
@ -59,22 +55,43 @@ class DateTimeWidgetBase extends WidgetBase {
|
|||
$date = $item['value'];
|
||||
switch ($this->getFieldSetting('datetime_type')) {
|
||||
case DateTimeItem::DATETIME_TYPE_DATE:
|
||||
// If this is a date-only field, set it to the default time so the
|
||||
// timezone conversion can be reversed.
|
||||
datetime_date_default_time($date);
|
||||
$format = DATETIME_DATE_STORAGE_FORMAT;
|
||||
$format = DateTimeItemInterface::DATE_STORAGE_FORMAT;
|
||||
break;
|
||||
|
||||
default:
|
||||
$format = DATETIME_DATETIME_STORAGE_FORMAT;
|
||||
$format = DateTimeItemInterface::DATETIME_STORAGE_FORMAT;
|
||||
break;
|
||||
}
|
||||
// Adjust the date for storage.
|
||||
$date->setTimezone(new \DateTimezone(DATETIME_STORAGE_TIMEZONE));
|
||||
$date->setTimezone(new \DateTimezone(DateTimeItemInterface::STORAGE_TIMEZONE));
|
||||
$item['value'] = $date->format($format);
|
||||
}
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a date object for use as a default value.
|
||||
*
|
||||
* This will take a default value, apply the proper timezone for display in
|
||||
* a widget, and set the default time for date-only fields.
|
||||
*
|
||||
* @param \Drupal\Core\Datetime\DrupalDateTime $date
|
||||
* The UTC default date.
|
||||
* @param string $timezone
|
||||
* The timezone to apply.
|
||||
*
|
||||
* @return \Drupal\Core\Datetime\DrupalDateTime
|
||||
* A date object for use as a default value in a field widget.
|
||||
*/
|
||||
protected function createDefaultValue($date, $timezone) {
|
||||
// The date was created and verified during field_load(), so it is safe to
|
||||
// use without further inspection.
|
||||
if ($this->getFieldSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
$date->setDefaultDateTime();
|
||||
}
|
||||
$date->setTimezone(new \DateTimeZone($timezone));
|
||||
return $date;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Plugin\Validation\Constraint;
|
||||
|
||||
use Symfony\Component\Validator\Constraint;
|
||||
|
||||
/**
|
||||
* Validation constraint for DateTime items to ensure the format is correct.
|
||||
*
|
||||
* @Constraint(
|
||||
* id = "DateTimeFormat",
|
||||
* label = @Translation("Datetime format valid for datetime type.", context = "Validation"),
|
||||
* )
|
||||
*/
|
||||
class DateTimeFormatConstraint extends Constraint {
|
||||
|
||||
/**
|
||||
* Message for when the value isn't a string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $badType = "The datetime value must be a string.";
|
||||
|
||||
/**
|
||||
* Message for when the value isn't in the proper format.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $badFormat = "The datetime value '@value' is invalid for the format '@format'";
|
||||
|
||||
/**
|
||||
* Message for when the value did not parse properly.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $badValue = "The datetime value '@value' did not parse properly for the format '@format'";
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Plugin\Validation\Constraint;
|
||||
|
||||
use Drupal\Component\Datetime\DateTimePlus;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
|
||||
use Symfony\Component\Validator\Constraint;
|
||||
use Symfony\Component\Validator\ConstraintValidator;
|
||||
|
||||
/**
|
||||
* Constraint validator for DateTime items to ensure the format is correct.
|
||||
*/
|
||||
class DateTimeFormatConstraintValidator extends ConstraintValidator {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function validate($item, Constraint $constraint) {
|
||||
/* @var $item \Drupal\datetime\Plugin\Field\FieldType\DateTimeItem */
|
||||
if (isset($item)) {
|
||||
$value = $item->getValue()['value'];
|
||||
if (!is_string($value)) {
|
||||
$this->context->addViolation($constraint->badType);
|
||||
}
|
||||
else {
|
||||
$datetime_type = $item->getFieldDefinition()->getSetting('datetime_type');
|
||||
$format = $datetime_type === DateTimeItem::DATETIME_TYPE_DATE ? DateTimeItemInterface::DATE_STORAGE_FORMAT : DateTimeItemInterface::DATETIME_STORAGE_FORMAT;
|
||||
$date = NULL;
|
||||
try {
|
||||
$date = DateTimePlus::createFromFormat($format, $value, new \DateTimeZone(DateTimeItemInterface::STORAGE_TIMEZONE));
|
||||
}
|
||||
catch (\InvalidArgumentException $e) {
|
||||
$this->context->addViolation($constraint->badFormat, [
|
||||
'@value' => $value,
|
||||
'@format' => $format,
|
||||
]);
|
||||
return;
|
||||
}
|
||||
catch (\UnexpectedValueException $e) {
|
||||
$this->context->addViolation($constraint->badValue, [
|
||||
'@value' => $value,
|
||||
'@format' => $format,
|
||||
]);
|
||||
return;
|
||||
}
|
||||
if ($date === NULL || $date->hasErrors()) {
|
||||
$this->context->addViolation($constraint->badFormat, [
|
||||
'@value' => $value,
|
||||
'@format' => $format,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Plugin\migrate\field;
|
||||
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate\MigrateException;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
|
||||
|
||||
/**
|
||||
* @MigrateField(
|
||||
* id = "datetime",
|
||||
* type_map = {
|
||||
* "date" = "datetime",
|
||||
* "datestamp" = "timestamp",
|
||||
* "datetime" = "datetime",
|
||||
* },
|
||||
* core = {6,7},
|
||||
* source_module = "date",
|
||||
* destination_module = "datetime"
|
||||
* )
|
||||
*/
|
||||
class DateField extends FieldPluginBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {
|
||||
return [
|
||||
'date_default' => 'datetime_default',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldWidgetMap() {
|
||||
return [
|
||||
'date' => 'datetime_default',
|
||||
'datetime' => 'datetime_default',
|
||||
'datestamp' => 'datetime_timestamp',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data) {
|
||||
switch ($data['type']) {
|
||||
case 'date':
|
||||
$from_format = 'Y-m-d\TH:i:s';
|
||||
$to_format = 'Y-m-d\TH:i:s';
|
||||
break;
|
||||
case 'datestamp':
|
||||
$from_format = 'U';
|
||||
$to_format = 'U';
|
||||
break;
|
||||
case 'datetime':
|
||||
$from_format = 'Y-m-d H:i:s';
|
||||
$to_format = 'Y-m-d\TH:i:s';
|
||||
break;
|
||||
default:
|
||||
throw new MigrateException(sprintf('Field %s of type %s is an unknown date field type.', $field_name, var_export($data['type'], TRUE)));
|
||||
}
|
||||
$process = [
|
||||
'value' => [
|
||||
'plugin' => 'format_date',
|
||||
'from_format' => $from_format,
|
||||
'to_format' => $to_format,
|
||||
'source' => 'value',
|
||||
],
|
||||
];
|
||||
|
||||
$process = [
|
||||
'plugin' => 'sub_process',
|
||||
'source' => $field_name,
|
||||
'process' => $process,
|
||||
];
|
||||
$migration->mergeProcessOfProperty($field_name, $process);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace Drupal\datetime\Plugin\migrate\field\d6;
|
||||
|
||||
@trigger_error('DateField is deprecated in Drupal 8.4.x and will be removed before Drupal 9.0.x. Use \Drupal\datetime\Plugin\migrate\field\DateField instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate\MigrateException;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
|
||||
|
|
@ -14,8 +16,13 @@ use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
|
|||
* "datestamp" = "timestamp",
|
||||
* "datetime" = "datetime",
|
||||
* },
|
||||
* core = {6}
|
||||
* core = {6},
|
||||
* source_module = "date",
|
||||
* destination_module = "datetime"
|
||||
* )
|
||||
*
|
||||
* @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\datetime\Plugin\migrate\field\DateField instead.
|
||||
*/
|
||||
class DateField extends FieldPluginBase {
|
||||
|
||||
|
|
@ -33,16 +40,7 @@ class DateField extends FieldPluginBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {
|
||||
// See d6_field_formatter_settings.yml and
|
||||
// FieldPluginBase::processFieldFormatter().
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
|
||||
public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data) {
|
||||
switch ($data['type']) {
|
||||
case 'date':
|
||||
$from_format = 'Y-m-d\TH:i:s';
|
||||
|
|
@ -69,7 +67,7 @@ class DateField extends FieldPluginBase {
|
|||
];
|
||||
|
||||
$process = [
|
||||
'plugin' => 'iterator',
|
||||
'plugin' => 'sub_process',
|
||||
'source' => $field_name,
|
||||
'process' => $process,
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Plugin\views\Argument;
|
||||
namespace Drupal\datetime\Plugin\views\argument;
|
||||
|
||||
use Drupal\Core\Routing\RouteMatchInterface;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\views\FieldAPIHandlerTrait;
|
||||
use Drupal\views\Plugin\views\argument\Date as NumericDate;
|
||||
|
||||
/**
|
||||
|
|
@ -22,12 +25,36 @@ use Drupal\views\Plugin\views\argument\Date as NumericDate;
|
|||
*/
|
||||
class Date extends NumericDate {
|
||||
|
||||
use FieldAPIHandlerTrait;
|
||||
|
||||
/**
|
||||
* Determines if the timezone offset is calculated.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $calculateOffset = TRUE;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $route_match) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $route_match);
|
||||
|
||||
$definition = $this->getFieldStorageDefinition();
|
||||
if ($definition->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
// Timezone offset calculation is not applicable to dates that are stored
|
||||
// as date-only.
|
||||
$this->calculateOffset = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDateField() {
|
||||
// Return the real field, since it is already in string format.
|
||||
return "$this->tableAlias.$this->realField";
|
||||
// Use string date storage/formatting since datetime fields are stored as
|
||||
// strings rather than UNIX timestamps.
|
||||
return $this->query->getDateField("$this->tableAlias.$this->realField", TRUE, $this->calculateOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2,9 +2,11 @@
|
|||
|
||||
namespace Drupal\datetime\Plugin\views\filter;
|
||||
|
||||
use Drupal\Component\Datetime\DateTimePlus;
|
||||
use Drupal\Core\Datetime\DateFormatterInterface;
|
||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
|
||||
use Drupal\views\FieldAPIHandlerTrait;
|
||||
use Drupal\views\Plugin\views\filter\Date as NumericDate;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
|
@ -38,10 +40,17 @@ class Date extends NumericDate implements ContainerFactoryPluginInterface {
|
|||
*
|
||||
* @see \Drupal\views\Plugin\views\query\Sql::getDateFormat()
|
||||
*/
|
||||
protected $dateFormat = DATETIME_DATETIME_STORAGE_FORMAT;
|
||||
protected $dateFormat = DateTimeItemInterface::DATETIME_STORAGE_FORMAT;
|
||||
|
||||
/**
|
||||
* The request stack used to determin current time.
|
||||
* Determines if the timezone offset is calculated.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $calculateOffset = TRUE;
|
||||
|
||||
/**
|
||||
* The request stack used to determine current time.
|
||||
*
|
||||
* @var \Symfony\Component\HttpFoundation\RequestStack
|
||||
*/
|
||||
|
|
@ -66,10 +75,13 @@ class Date extends NumericDate implements ContainerFactoryPluginInterface {
|
|||
$this->dateFormatter = $date_formatter;
|
||||
$this->requestStack = $request_stack;
|
||||
|
||||
// Date format depends on field storage format.
|
||||
$definition = $this->getFieldStorageDefinition();
|
||||
if ($definition->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
$this->dateFormat = DATETIME_DATE_STORAGE_FORMAT;
|
||||
// Date format depends on field storage format.
|
||||
$this->dateFormat = DateTimeItemInterface::DATE_STORAGE_FORMAT;
|
||||
// Timezone offset calculation is not applicable to dates that are stored
|
||||
// as date-only.
|
||||
$this->calculateOffset = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -90,21 +102,23 @@ class Date extends NumericDate implements ContainerFactoryPluginInterface {
|
|||
* Override parent method, which deals with dates as integers.
|
||||
*/
|
||||
protected function opBetween($field) {
|
||||
$origin = ($this->value['type'] == 'offset') ? $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME') : 0;
|
||||
$a = intval(strtotime($this->value['min'], $origin));
|
||||
$b = intval(strtotime($this->value['max'], $origin));
|
||||
|
||||
// Formatting will vary on date storage.
|
||||
$timezone = $this->getTimezone();
|
||||
$origin_offset = $this->getOffset($this->value['min'], $timezone);
|
||||
|
||||
// Although both 'min' and 'max' values are required, default empty 'min'
|
||||
// value as UNIX timestamp 0.
|
||||
$min = (!empty($this->value['min'])) ? $this->value['min'] : '@0';
|
||||
|
||||
// Convert to ISO format and format for query. UTC timezone is used since
|
||||
// dates are stored in UTC.
|
||||
$a = $this->query->getDateFormat("'" . $this->dateFormatter->format($a, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE) . "'", $this->dateFormat, TRUE);
|
||||
$b = $this->query->getDateFormat("'" . $this->dateFormatter->format($b, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE) . "'", $this->dateFormat, TRUE);
|
||||
$a = new DateTimePlus($min, new \DateTimeZone($timezone));
|
||||
$a = $this->query->getDateFormat($this->query->getDateField("'" . $this->dateFormatter->format($a->getTimestamp() + $origin_offset, 'custom', DateTimeItemInterface::DATETIME_STORAGE_FORMAT, DateTimeItemInterface::STORAGE_TIMEZONE) . "'", TRUE, $this->calculateOffset), $this->dateFormat, TRUE);
|
||||
$b = new DateTimePlus($this->value['max'], new \DateTimeZone($timezone));
|
||||
$b = $this->query->getDateFormat($this->query->getDateField("'" . $this->dateFormatter->format($b->getTimestamp() + $origin_offset, 'custom', DateTimeItemInterface::DATETIME_STORAGE_FORMAT, DateTimeItemInterface::STORAGE_TIMEZONE) . "'", TRUE, $this->calculateOffset), $this->dateFormat, TRUE);
|
||||
|
||||
// This is safe because we are manually scrubbing the values.
|
||||
$operator = strtoupper($this->operator);
|
||||
$field = $this->query->getDateFormat($field, $this->dateFormat, TRUE);
|
||||
$field = $this->query->getDateFormat($this->query->getDateField($field, TRUE, $this->calculateOffset), $this->dateFormat, TRUE);
|
||||
$this->query->addWhereExpression($this->options['group'], "$field $operator $a AND $b");
|
||||
}
|
||||
|
||||
|
|
@ -112,15 +126,57 @@ class Date extends NumericDate implements ContainerFactoryPluginInterface {
|
|||
* Override parent method, which deals with dates as integers.
|
||||
*/
|
||||
protected function opSimple($field) {
|
||||
$origin = (!empty($this->value['type']) && $this->value['type'] == 'offset') ? $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME') : 0;
|
||||
$value = intval(strtotime($this->value['value'], $origin));
|
||||
$timezone = $this->getTimezone();
|
||||
$origin_offset = $this->getOffset($this->value['value'], $timezone);
|
||||
|
||||
// Convert to ISO. UTC is used since dates are stored in UTC.
|
||||
$value = $this->query->getDateFormat("'" . $this->dateFormatter->format($value, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE) . "'", $this->dateFormat, TRUE);
|
||||
// Convert to ISO. UTC timezone is used since dates are stored in UTC.
|
||||
$value = new DateTimePlus($this->value['value'], new \DateTimeZone($timezone));
|
||||
$value = $this->query->getDateFormat($this->query->getDateField("'" . $this->dateFormatter->format($value->getTimestamp() + $origin_offset, 'custom', DateTimeItemInterface::DATETIME_STORAGE_FORMAT, DateTimeItemInterface::STORAGE_TIMEZONE) . "'", TRUE, $this->calculateOffset), $this->dateFormat, TRUE);
|
||||
|
||||
// This is safe because we are manually scrubbing the value.
|
||||
$field = $this->query->getDateFormat($field, $this->dateFormat, TRUE);
|
||||
$field = $this->query->getDateFormat($this->query->getDateField($field, TRUE, $this->calculateOffset), $this->dateFormat, TRUE);
|
||||
$this->query->addWhereExpression($this->options['group'], "$field $this->operator $value");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the proper time zone to use in computations.
|
||||
*
|
||||
* Date-only fields do not have a time zone associated with them, so the
|
||||
* filter input needs to use UTC for reference. Otherwise, use the time zone
|
||||
* for the current user.
|
||||
*
|
||||
* @return string
|
||||
* The time zone name.
|
||||
*/
|
||||
protected function getTimezone() {
|
||||
return $this->dateFormat === DateTimeItemInterface::DATE_STORAGE_FORMAT
|
||||
? DateTimeItemInterface::STORAGE_TIMEZONE
|
||||
: drupal_get_user_timezone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the proper offset from UTC to use in computations.
|
||||
*
|
||||
* @param string $time
|
||||
* A date/time string compatible with \DateTime. It is used as the
|
||||
* reference for computing the offset, which can vary based on the time
|
||||
* zone rules.
|
||||
* @param string $timezone
|
||||
* The time zone that $time is in.
|
||||
*
|
||||
* @return int
|
||||
* The computed offset in seconds.
|
||||
*/
|
||||
protected function getOffset($time, $timezone) {
|
||||
// Date-only fields do not have a time zone or offset from UTC associated
|
||||
// with them. For relative (i.e. 'offset') comparisons, we need to compute
|
||||
// the user's offset from UTC for use in the query.
|
||||
$origin_offset = 0;
|
||||
if ($this->dateFormat === DateTimeItemInterface::DATE_STORAGE_FORMAT && $this->value['type'] === 'offset') {
|
||||
$origin_offset = $origin_offset + timezone_offset_get(new \DateTimeZone(drupal_get_user_timezone()), new \DateTime($time, new \DateTimeZone($timezone)));
|
||||
}
|
||||
|
||||
return $origin_offset;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace Drupal\datetime\Plugin\views\sort;
|
||||
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\views\FieldAPIHandlerTrait;
|
||||
use Drupal\views\Plugin\views\sort\Date as NumericDate;
|
||||
|
||||
/**
|
||||
|
|
@ -14,12 +16,38 @@ use Drupal\views\Plugin\views\sort\Date as NumericDate;
|
|||
*/
|
||||
class Date extends NumericDate {
|
||||
|
||||
use FieldAPIHandlerTrait;
|
||||
|
||||
/**
|
||||
* Determines if the timezone offset is calculated.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $calculateOffset = TRUE;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||
|
||||
$definition = $this->getFieldStorageDefinition();
|
||||
if ($definition->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
|
||||
// Timezone offset calculation is not applicable to dates that are stored
|
||||
// as date-only.
|
||||
$this->calculateOffset = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* Override to account for dates stored as strings.
|
||||
*/
|
||||
public function getDateField() {
|
||||
// Return the real field, since it is already in string format.
|
||||
return "$this->tableAlias.$this->realField";
|
||||
// Use string date storage/formatting since datetime fields are stored as
|
||||
// strings rather than UNIX timestamps.
|
||||
return $this->query->getDateField("$this->tableAlias.$this->realField", TRUE, $this->calculateOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Reference in a new issue