12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- <?php
- namespace Drupal\datetime;
- use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
- use Drupal\Core\Datetime\DrupalDateTime;
- use Drupal\Core\TypedData\DataDefinitionInterface;
- use Drupal\Core\TypedData\TypedDataInterface;
- use Drupal\Core\TypedData\TypedData;
- /**
- * A computed property for dates of date time field items.
- *
- * Required settings (below the definition's 'settings' key) are:
- * - date source: The date property containing the to be computed date.
- */
- class DateTimeComputed extends TypedData {
- /**
- * Cached computed date.
- *
- * @var \DateTime|null
- */
- protected $date = NULL;
- /**
- * {@inheritdoc}
- */
- public function __construct(DataDefinitionInterface $definition, $name = NULL, TypedDataInterface $parent = NULL) {
- parent::__construct($definition, $name, $parent);
- if (!$definition->getSetting('date source')) {
- throw new \InvalidArgumentException("The definition's 'date source' key has to specify the name of the date property to be computed.");
- }
- }
- /**
- * {@inheritdoc}
- */
- public function getValue($langcode = NULL) {
- if ($this->date !== NULL) {
- return $this->date;
- }
- /** @var \Drupal\Core\Field\FieldItemInterface $item */
- $item = $this->getParent();
- $value = $item->{($this->definition->getSetting('date source'))};
- $datetime_type = $item->getFieldDefinition()->getSetting('datetime_type');
- $storage_format = $datetime_type === DateTimeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT;
- try {
- $date = DrupalDateTime::createFromFormat($storage_format, $value, DATETIME_STORAGE_TIMEZONE);
- if ($date instanceof DrupalDateTime && !$date->hasErrors()) {
- $this->date = $date;
- // If the format did not include an explicit time portion, then the
- // time will be set from the current time instead. For consistency, we
- // set the time to 12:00:00 UTC for date-only fields. This is used so
- // that the local date portion is the same, across nearly all time
- // zones.
- // @see datetime_date_default_time()
- // @see http://php.net/manual/en/datetime.createfromformat.php
- // @todo Update comment and/or code per the chosen solution in
- // https://www.drupal.org/node/2830094
- if ($datetime_type === DateTimeItem::DATETIME_TYPE_DATE) {
- $this->date->setTime(12, 0, 0);
- }
- }
- }
- catch (\Exception $e) {
- // @todo Handle this.
- }
- return $this->date;
- }
- /**
- * {@inheritdoc}
- */
- public function setValue($value, $notify = TRUE) {
- $this->date = $value;
- // Notify the parent of any changes.
- if ($notify && isset($this->parent)) {
- $this->parent->onChange($this->name);
- }
- }
- }
|