custom_field-1.0.x-dev/src/Plugin/CustomField/DateTimeComputed.php
src/Plugin/CustomField/DateTimeComputed.php
<?php
namespace Drupal\custom_field\Plugin\CustomField;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\TypedData\DataDefinitionInterface;
use Drupal\Core\TypedData\TypedData;
use Drupal\Core\TypedData\TypedDataInterface;
use Drupal\custom_field\Plugin\CustomField\FieldType\DateTimeType;
use Drupal\custom_field\Plugin\CustomField\FieldType\DateTimeTypeInterface;
/**
* 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|\Drupal\Core\Datetime\DrupalDateTime|null
*/
protected $date = NULL;
/**
* {@inheritdoc}
*/
public function __construct(DataDefinitionInterface $definition, $name = NULL, ?TypedDataInterface $parent = NULL) {
parent::__construct($definition, $name, $parent);
$settings = $definition->getSettings();
if (!isset($settings['datetime_type'])) {
throw new \InvalidArgumentException("The definition's 'datetime_type' key is required.");
}
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() {
if ($this->date !== NULL) {
return $this->date;
}
/** @var \Drupal\Core\Field\FieldItemInterface $item */
$item = $this->getParent();
/** @var string $date_source */
$date_source = $this->definition->getSetting('date source');
/** @var ?string $value */
$value = $item->{$date_source};
$timezone = DateTimeTypeInterface::STORAGE_TIMEZONE;
// A date cannot be created from a NULL value.
if ($value === NULL) {
return NULL;
}
$datetime_type = (string) $this->definition->getSetting('datetime_type');
$storage_format = $datetime_type === DateTimeType::DATETIME_TYPE_DATE ? DateTimeTypeInterface::DATE_STORAGE_FORMAT : DateTimeTypeInterface::DATETIME_STORAGE_FORMAT;
try {
$date = DrupalDateTime::createFromFormat($storage_format, $value, $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 \Drupal\Component\Datetime\DateTimePlus::setDefaultDateTime()
// @see http://php.net/manual/datetime.createfromformat.php
if ($datetime_type === DateTimeType::DATETIME_TYPE_DATE) {
$this->date->setDefaultDateTime();
}
}
}
catch (\Exception $e) {
// @todo Handle this.
}
return $this->date;
}
/**
* {@inheritdoc}
*/
public function setValue($value, $notify = TRUE): void {
$this->date = $value;
// Notify the parent of any changes.
if ($notify && isset($this->parent)) {
$this->parent->onChange($this->name);
}
}
}
