Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/Field/FieldItemBase.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Field/FieldItemBase.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,279 @@ +<?php + +namespace Drupal\Core\Field; + +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\TypedData\DataDefinitionInterface; +use Drupal\Core\TypedData\Plugin\DataType\Map; +use Drupal\Core\TypedData\TypedDataInterface; + +/** + * An entity field item. + * + * Entity field items making use of this base class have to implement + * the static method propertyDefinitions(). + * + * @see \Drupal\Core\Field\FieldItemInterface + * @ingroup field_types + */ +abstract class FieldItemBase extends Map implements FieldItemInterface { + + /** + * {@inheritdoc} + */ + public static function defaultStorageSettings() { + return []; + } + + /** + * {@inheritdoc} + */ + public static function defaultFieldSettings() { + return []; + } + + /** + * {@inheritdoc} + */ + public static function mainPropertyName() { + return 'value'; + } + + /** + * {@inheritdoc} + */ + public function __construct(DataDefinitionInterface $definition, $name = NULL, TypedDataInterface $parent = NULL) { + parent::__construct($definition, $name, $parent); + // Initialize computed properties by default, such that they get cloned + // with the whole item. + foreach ($this->definition->getPropertyDefinitions() as $name => $definition) { + if ($definition->isComputed()) { + $this->properties[$name] = \Drupal::typedDataManager()->getPropertyInstance($this, $name); + } + } + } + + /** + * {@inheritdoc} + */ + public function getEntity() { + return $this->getParent()->getEntity(); + } + + /** + * {@inheritdoc} + */ + public function getLangcode() { + return $this->getParent()->getLangcode(); + } + + /** + * {@inheritdoc} + */ + public function getFieldDefinition() { + return $this->definition->getFieldDefinition(); + } + + /** + * Returns the array of field settings. + * + * @return array + * The array of settings. + */ + protected function getSettings() { + return $this->getFieldDefinition()->getSettings(); + } + + /** + * Returns the value of a field setting. + * + * @param string $setting_name + * The setting name. + * + * @return mixed + * The setting value. + */ + protected function getSetting($setting_name) { + return $this->getFieldDefinition()->getSetting($setting_name); + } + + /** + * {@inheritdoc} + */ + public function setValue($values, $notify = TRUE) { + // Treat the values as property value of the first property, if no array is + // given. + if (isset($values) && !is_array($values)) { + $keys = array_keys($this->definition->getPropertyDefinitions()); + $values = [$keys[0] => $values]; + } + parent::setValue($values, $notify); + } + + /** + * {@inheritdoc} + * + * Different to the parent Map class, we avoid creating property objects as + * far as possible in order to optimize performance. Thus we just update + * $this->values if no property object has been created yet. + */ + protected function writePropertyValue($property_name, $value) { + // For defined properties there is either a property object or a plain + // value that needs to be updated. + if (isset($this->properties[$property_name])) { + $this->properties[$property_name]->setValue($value, FALSE); + } + // Allow setting plain values for not-defined properties also. + else { + $this->values[$property_name] = $value; + } + } + + /** + * {@inheritdoc} + */ + public function __get($name) { + // There is either a property object or a plain value - possibly for a + // not-defined property. If we have a plain value, directly return it. + if (isset($this->properties[$name])) { + return $this->properties[$name]->getValue(); + } + elseif (isset($this->values[$name])) { + return $this->values[$name]; + } + } + + /** + * {@inheritdoc} + */ + public function __set($name, $value) { + // Support setting values via property objects, but take care in as the + // value of the 'entity' property is typed data also. + if ($value instanceof TypedDataInterface && !($value instanceof EntityInterface)) { + $value = $value->getValue(); + } + $this->set($name, $value); + } + + /** + * {@inheritdoc} + */ + public function __isset($name) { + if (isset($this->properties[$name])) { + return $this->properties[$name]->getValue() !== NULL; + } + return isset($this->values[$name]); + } + + /** + * {@inheritdoc} + */ + public function __unset($name) { + if ($this->definition->getPropertyDefinition($name)) { + $this->set($name, NULL); + } + else { + // Explicitly unset the property in $this->values if a non-defined + // property is unset, such that its key is removed from $this->values. + unset($this->values[$name]); + } + } + + /** + * {@inheritdoc} + */ + public function view($display_options = []) { + $view_builder = \Drupal::entityManager()->getViewBuilder($this->getEntity()->getEntityTypeId()); + return $view_builder->viewFieldItem($this, $display_options); + } + + /** + * {@inheritdoc} + */ + public function preSave() {} + + /** + * {@inheritdoc} + */ + public function postSave($update) {} + + /** + * {@inheritdoc} + */ + public function delete() {} + + /** + * {@inheritdoc} + */ + public static function generateSampleValue(FieldDefinitionInterface $field_definition) {} + + /** + * {@inheritdoc} + */ + public function deleteRevision() {} + + /** + * {@inheritdoc} + */ + public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) { + return []; + } + + /** + * {@inheritdoc} + */ + public function fieldSettingsForm(array $form, FormStateInterface $form_state) { + return []; + } + + /** + * {@inheritdoc} + */ + public static function storageSettingsToConfigData(array $settings) { + return $settings; + } + + /** + * {@inheritdoc} + */ + public static function storageSettingsFromConfigData(array $settings) { + return $settings; + } + + /** + * {@inheritdoc} + */ + public static function fieldSettingsToConfigData(array $settings) { + return $settings; + } + + /** + * {@inheritdoc} + */ + public static function fieldSettingsFromConfigData(array $settings) { + return $settings; + } + + /** + * {@inheritdoc} + */ + public static function calculateDependencies(FieldDefinitionInterface $field_definition) { + return []; + } + + /** + * {@inheritdoc} + */ + public static function calculateStorageDependencies(FieldStorageDefinitionInterface $field_definition) { + return []; + } + + /** + * {@inheritdoc} + */ + public static function onDependencyRemoval(FieldDefinitionInterface $field_definition, array $dependencies) { + return FALSE; + } + +}