diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php index 638979f..fde6af9 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php @@ -42,14 +42,15 @@ public function initTranslation($langcode); /** * Defines the base fields of the entity type. * + * Implementations may use the class \Drupal\Core\Field\FieldDefinition for + * creating the field definitions. + * * @param string $entity_type * The entity type to return properties for. Useful when a single class is * used for multiple, possibly dynamic entity types. * - * @return array - * An array of entity field definitions as specified by - * \Drupal\Core\Entity\EntityManager::getFieldDefinitions(), keyed by field - * name. + * @return \Drupal\Core\Field\FieldDefinitionInterface[] + * An array of entity field definitions, keyed by field name. * * @see \Drupal\Core\Entity\EntityManager::getFieldDefinitions() */ diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php index e9b9add..43e3838 100644 --- a/core/lib/Drupal/Core/Entity/EntityManager.php +++ b/core/lib/Drupal/Core/Entity/EntityManager.php @@ -448,7 +448,7 @@ public function getAdminRouteInfo($entity_type, $bundle) { * is passed, no bundle-specific fields are included. Defaults to NULL. * * @return \Drupal\Core\Field\FieldDefinitionInterface[] - * An array of entity field definitions, keyed by field name. + * An array of entity field definitions, keyed by field name. * * @see \Drupal\Core\TypedData\TypedDataManager::create() * @see \Drupal\Core\Entity\EntityManager::getFieldDefinitionsByConstraints() diff --git a/core/lib/Drupal/Core/Field/FieldDefinition.php b/core/lib/Drupal/Core/Field/FieldDefinition.php index e6536fe..30caef4 100644 --- a/core/lib/Drupal/Core/Field/FieldDefinition.php +++ b/core/lib/Drupal/Core/Field/FieldDefinition.php @@ -111,7 +111,7 @@ public function setFieldSetting($setting_name, $value) { * {@inheritdoc} */ public function getFieldPropertyNames() { - return array_keys(\Drupal::typedData()->create($this->getItemDefinition())->getPropertyDefinitions()); + return array_keys(static::typedData()->create($this->getItemDefinition())->getPropertyDefinitions()); } /** @@ -266,7 +266,7 @@ public static function createFromOldStyleDefinition(array $definition) { $field_definition->setClass($definition['list_class']); } else { - $type_definition = \Drupal::typedData()->getDefinition($definition['type']); + $type_definition = static::typedData()->getDefinition($definition['type']); if (isset($type_definition['list_class'])) { $field_definition->setClass($type_definition['list_class']); } @@ -275,20 +275,19 @@ public static function createFromOldStyleDefinition(array $definition) { $field_definition->setTranslatable($definition['translatable']); unset($definition['translatable']); } - if (isset($definition['required'])) { - $field_definition->setRequired($definition['required']); - unset($definition['required']); - } // Take care of the item definition now. + // Required applies to the field definition only. + unset($definition['required']); $item_definition = new DataDefinition($definition); $field_definition->setItemDefinition($item_definition); return $field_definition; } /** - * This is for BC support. + * {@inheritdoc} * + * This is for BC support only. * @todo: Remove once https://drupal.org/node/2112239 is in. */ public function &offsetGet($offset) { @@ -305,6 +304,9 @@ public function &offsetGet($offset) { /** * {@inheritdoc} + * + * This is for BC support only. + * @todo: Remove once https://drupal.org/node/2112239 is in. */ public function offsetSet($offset, $value) { if ($offset == 'type') { diff --git a/core/lib/Drupal/Core/Field/Plugin/DataType/ConfigFieldItemList.php b/core/lib/Drupal/Core/Field/Plugin/DataType/ConfigFieldItemList.php index 6013087..5a470bd 100644 --- a/core/lib/Drupal/Core/Field/Plugin/DataType/ConfigFieldItemList.php +++ b/core/lib/Drupal/Core/Field/Plugin/DataType/ConfigFieldItemList.php @@ -43,6 +43,10 @@ public function __construct($definition, $name = NULL, TypedDataInterface $paren * {@inheritdoc} */ public function getFieldDefinition() { + // Configurable fields have the field_config entity injected as definition, + // but we want to return the more specific field instance here. + // @todo: Overhaul this once we have per-bundle field definitions injected, + // see https://drupal.org/node/2114707. if (!isset($this->instance)) { $entity = $this->getEntity(); $instances = Field::fieldInfo()->getBundleInstances($entity->entityType(), $entity->bundle()); @@ -50,9 +54,7 @@ public function getFieldDefinition() { $this->instance = $instances[$this->getName()]; } else { - // For base fields, fall back to the parent implementation. - // @todo: Inject the field definition with - // https://drupal.org/node/2047229. + // For base fields, fall back to return the general definition. return parent::getFieldDefinition(); } } diff --git a/core/lib/Drupal/Core/TypedData/DataDefinition.php b/core/lib/Drupal/Core/TypedData/DataDefinition.php index e577ad5..cfd3cbf 100644 --- a/core/lib/Drupal/Core/TypedData/DataDefinition.php +++ b/core/lib/Drupal/Core/TypedData/DataDefinition.php @@ -13,6 +13,13 @@ class DataDefinition implements DataDefinitionInterface, \ArrayAccess { /** + * The typed data manager used by the definition objects. + * + * @var \Drupal\Core\TypedData\TypedDataManager + */ + public static $typedData; + + /** * The array holding values for all definition keys. * * @var array @@ -23,7 +30,7 @@ class DataDefinition implements DataDefinitionInterface, \ArrayAccess { * Creates a new data definition. * * @param string $type - * Data Type for this definition. Default to be 'any'. + * (optional) The data type of the data. Defaults to 'any'. * * @return \Drupal\Core\TypedData\DataDefinition * A new DataDefinition object. @@ -172,7 +179,7 @@ public function isRequired() { * @param bool $required * Whether the data is required. * - * @return \Drupal\Core\TypedData\DataDefinitionInterface + * @return \Drupal\Core\TypedData\DataDefinition * The object itself for chaining. */ public function setRequired($required) { @@ -193,7 +200,7 @@ public function getClass() { * @param string|null $class * The class to use. * - * @return \Drupal\Core\TypedData\DataDefinitionInterface + * @return \Drupal\Core\TypedData\DataDefinition * The object itself for chaining. */ public function setClass($class) { @@ -219,7 +226,7 @@ public function getSettings() { * @param array $settings * The array of settings. * - * @return \Drupal\Core\TypedData\DataDefinitionInterface + * @return \Drupal\Core\TypedData\DataDefinition * The object itself for chaining. */ public function setSettings(array $settings) { @@ -248,7 +255,7 @@ public function getConstraints() { * @param array $constraints * The array of constraints. * - * @return \Drupal\Core\TypedData\DataDefinitionInterface + * @return \Drupal\Core\TypedData\DataDefinition * The object itself for chaining. */ public function setConstraints(array $constraints) { @@ -276,6 +283,9 @@ public function addConstraint($constraint_name, $options = NULL) { /** * {@inheritdoc} + * + * This is for BC support only. + * @todo: Remove once https://drupal.org/node/2112239 is in. */ public function offsetExists($offset) { // PHP's array access does not work correctly with isset(), so we have to @@ -285,6 +295,9 @@ public function offsetExists($offset) { /** * {@inheritdoc} + * + * This is for BC support only. + * @todo: Remove once https://drupal.org/node/2112239 is in. */ public function &offsetGet($offset) { if (!isset($this->definition[$offset])) { @@ -295,6 +308,9 @@ public function &offsetGet($offset) { /** * {@inheritdoc} + * + * This is for BC support only. + * @todo: Remove once https://drupal.org/node/2112239 is in. */ public function offsetSet($offset, $value) { $this->definition[$offset] = $value; @@ -302,6 +318,9 @@ public function offsetSet($offset, $value) { /** * {@inheritdoc} + * + * This is for BC support only. + * @todo: Remove once https://drupal.org/node/2112239 is in. */ public function offsetUnset($offset) { unset($this->definition[$offset]); @@ -343,20 +362,33 @@ public static function createFromOldStyleDefinition(array $definition) { $list_definition->setClass($definition['list_class']); } else { - $type_definition = \Drupal::typedData()->getDefinition($definition['type']); + $type_definition = static::typedData()->getDefinition($definition['type']); if (isset($type_definition['list_class'])) { $list_definition->setClass($type_definition['list_class']); } } - if (isset($definition['required'])) { - $$list_definition->setRequired($definition['required']); - unset($definition['required']); - } // Take care of the item definition now. + // Required applies to the list definition only. unset($definition['required']); $item_definition = new DataDefinition($definition); $list_definition->setItemDefinition($item_definition); return $list_definition; } + + /** + * Returns the typed data manager service. + * + * @return \Drupal\Core\TypedData\TypedDataManager + * The typed data manager. + * + * @see \Drupal::typedData() + */ + public static function typedData() { + if (!isset(static::$typedData)) { + static::$typedData = \Drupal::typedData(); + } + return static::$typedData; + } + } diff --git a/core/lib/Drupal/Core/TypedData/ListDefinition.php b/core/lib/Drupal/Core/TypedData/ListDefinition.php index 7ca173b..917e4cf 100644 --- a/core/lib/Drupal/Core/TypedData/ListDefinition.php +++ b/core/lib/Drupal/Core/TypedData/ListDefinition.php @@ -23,7 +23,7 @@ class ListDefinition extends DataDefinition implements ListDefinitionInterface { * Creates a new list definition. * * @param string $type - * Data Type for this definition. Default to be NULL. + * (optional) The data type of this list. Defaults to NULL. * * @return \Drupal\Core\TypedData\ListDefinitionInterface * A new List Data Definition object. @@ -54,7 +54,7 @@ public function getDataType() { // If a list definition is used but no data type has been specified, derive // the default list type from the item type. else { - $item_type_definition = \Drupal::typedData() + $item_type_definition = static::typedData() ->getDefinition($this->getItemDefinition()->getDataType()); return isset($item_type_definition['list_type']) ? $item_type_definition['list_type'] : 'list'; } @@ -71,7 +71,7 @@ public function getClass() { else { // For BC check for a defined list class. // @todo: Remove once https://drupal.org/node/2112239 is in. - $item_type_definition = \Drupal::typedData() + $item_type_definition = static::typedData() ->getDefinition($this->getItemDefinition()->getDataType()); if (isset($item_type_definition['list_class']) && !$this->getClass()) { $this->setClass($item_type_definition['list_class']); @@ -89,6 +89,12 @@ public function getItemDefinition() { /** * Sets the item definition. + * + * @param \Drupal\Core\TypedData\DataDefinition $definition + * A list item's data definition. + * + * @return \Drupal\Core\TypedData\ListDefinition + * The object itself for chaining. */ public function setItemDefinition(DataDefinitionInterface $definition) { $this->itemDefinition = $definition; diff --git a/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php b/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php index e7dca89..2129558 100644 --- a/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php +++ b/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php @@ -7,8 +7,6 @@ namespace Drupal\Core\TypedData\Plugin\DataType; -use Drupal\Core\TypedData\Annotation\DataType; -use Drupal\Core\Annotation\Translation; use Drupal\Core\TypedData\ComplexDataInterface; use Drupal\Core\TypedData\ListInterface; use Drupal\Core\TypedData\TypedData; diff --git a/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php b/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php index 3b14d87..943302e 100644 --- a/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php @@ -31,26 +31,15 @@ public static function getInfo() { protected function setUp() { parent::setUp(); - // Prepare a container with a mock typed data object, that returns no - // type definitions. - // @todo: Overhaul this once field definitions to not use the container to - /// get the manager any more. - $typed_data = $this->getMockBuilder('Drupal\Core\TypedData\TypedDataManager') + // Prepare a mock typed data object, that returns no type definitions. + FieldDefinition::$typedData = $this->getMockBuilder('Drupal\Core\TypedData\TypedDataManager') ->disableOriginalConstructor() ->getMock(); - $typed_data + FieldDefinition::$typedData ->expects($this->any()) ->method('getDefinition') ->will($this->returnValue(NULL)); - - $container = $this->getMock('Drupal\Core\DependencyInjection\Container'); - $container - ->expects($this->any()) - ->method('get') - ->will($this->returnValue($typed_data)); - - \Drupal::setContainer($container); } /**