diff core/modules/datetime/src/DateTimeComputed.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/datetime/src/DateTimeComputed.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,85 @@
+<?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);
+    }
+  }
+
+}