diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php index ad1e61e..ad94f29 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -139,7 +139,19 @@ * {@inheritdoc} */ public static function createDataDefinition($data_type) { - return EntityDefinition::create($data_type); + $parts = explode(':', $data_type); + if ($parts[0] != 'entity') { + throw new \InvalidArgumentException('Data type must be in the form of "entity:ENTITY_TYPE:BUNDLE."'); + } + $definition = EntityDefinition::create(); + // Set the passed entity type and bundle. + if (isset($parts[1])) { + $definition->setEntityType($parts[1]); + } + if (isset($parts[2])) { + $definition->setBundles(array($parts[2])); + } + return $definition; } /** diff --git a/core/lib/Drupal/Core/Entity/EntityDefinition.php b/core/lib/Drupal/Core/Entity/EntityDefinition.php index 502e6e8..6b1d367 100644 --- a/core/lib/Drupal/Core/Entity/EntityDefinition.php +++ b/core/lib/Drupal/Core/Entity/EntityDefinition.php @@ -17,26 +17,17 @@ class EntityDefinition extends ComplexDataDefinitionBase implements EntityDefini /** * Creates a new entity definition. * - * @param string $type - * (optional) The data type to set. May be of the form - * "entity:ENTITY_TYPE:BUNDLE", whereas the entity type and bundle are - * optional. Defaults to "entity". + * @param string $entity_type + * (optional) The entity type type, or NULL if unknown. Defaults to NULL. * * @return static - * A new MapDefinition object. + * A new EntityDefinition object. */ - public static function create($type = 'entity') { - $parts = explode(':', $type); - if ($parts[0] != 'entity') { - throw new \InvalidArgumentException('Data type must be in the form of "entity:ENTITY_TYPE:BUNDLE."'); - } + public static function create($entity_type = NULL) { $definition = new static(array()); - // Set the passed entity type and bundle. - if (isset($parts[1])) { - $definition->setEntityType($parts[1]); - } - if (isset($parts[2])) { - $definition->setBundles(array($parts[2])); + // Set the passed entity type. + if (isset($entity_type)) { + $definition->setEntityType($entity_type); } return $definition; } @@ -48,6 +39,7 @@ public function getPropertyDefinitions() { if (!isset($this->propertyDefinitions)) { if ($entity_type = $this->getEntityType()) { // @todo: Add support for handling multiple bundles. + // See https://drupal.org/node/2169813. $bundles = $this->getBundles(); $bundle = is_array($bundles) && count($bundles) == 1 ? reset($bundles) : NULL; $this->propertyDefinitions = \Drupal::entityManager()->getFieldDefinitions($entity_type, $bundle); diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/Entity.php b/core/lib/Drupal/Core/Entity/Plugin/DataType/Entity.php index 1d9a00f..6d2cfac 100644 --- a/core/lib/Drupal/Core/Entity/Plugin/DataType/Entity.php +++ b/core/lib/Drupal/Core/Entity/Plugin/DataType/Entity.php @@ -6,6 +6,7 @@ */ namespace Drupal\Core\Entity\Plugin\DataType; +use Drupal\Core\Entity\ContentEntityBase; /** * Defines the base plugin for deriving data types for entity types. @@ -22,4 +23,11 @@ */ abstract class Entity { + /** + * {@inheritdoc} + */ + public static function createDataDefinition($data_type) { + return ContentEntityBase::createDataDefinition($data_type); + } + } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/MapItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/MapItem.php index 079d329..4cfd1b5 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/MapItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/MapItem.php @@ -9,7 +9,6 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemBase; -use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\TypedData\DataDefinition; /** diff --git a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php index bcd7be9..e08f8af 100644 --- a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php +++ b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php @@ -20,7 +20,7 @@ * @param string $data_type * The data type, for which a data definition should be created. * - * @return \Drupal\Core\TypedData\DataDefinitionInterface + * @return static * A data definition for the given data type. */ public static function createDataDefinition($data_type); diff --git a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php index 7170d24..566f574 100644 --- a/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php +++ b/core/modules/image/lib/Drupal/image/Plugin/Field/FieldType/ImageItem.php @@ -9,7 +9,6 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\TypedData\DataDefinition; -use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\file\Plugin\Field\FieldType\FileItem; /** diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTypedDataDefinitionTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTypedDataDefinitionTest.php new file mode 100644 index 0000000..bc9d533 --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTypedDataDefinitionTest.php @@ -0,0 +1,117 @@ + 'Entity typed data definitions', + 'description' => 'Tests reading and deriving metadata of entity and field data types.', + 'group' => 'Typed Data API', + ); + } + + public function setUp() { + parent::setup(); + $this->typedDataManager = $this->container->get('typed_data_manager'); + } + + /** + * Tests deriving metadata about fields. + */ + public function testFields() { + $field_definition = FieldDefinition::create('integer'); + // Fields are lists of complex data. + $this->assertTrue($field_definition instanceof ListDefinitionInterface); + $this->assertFalse($field_definition instanceof ComplexDataDefinitionInterface); + $field_item_definition = $field_definition->getItemDefinition(); + $this->assertFalse($field_item_definition instanceof ListDefinitionInterface); + $this->assertTrue($field_item_definition instanceof ComplexDataDefinitionInterface); + + // Derive metadata about field item properties. + $this->assertEqual(array_keys($field_item_definition->getPropertyDefinitions()), array('value')); + $this->assertEqual($field_item_definition->getPropertyDefinition('value')->getDataType(), 'integer'); + $this->assertEqual($field_item_definition->getMainPropertyName(), 'value'); + $this->assertNull($field_item_definition->getPropertyDefinition('invalid')); + + // To ease access of field item property metadata, field definitions make + // metadata about field item properties on the field level as well. + $this->assertTrue($field_definition instanceof FieldDefinitionInterface); + $this->assertEqual(array_keys($field_definition->getPropertyDefinitions()), array('value')); + $this->assertEqual($field_definition->getPropertyDefinition('value')->getDataType(), 'integer'); + $this->assertEqual($field_definition->getMainPropertyName(), 'value'); + $this->assertNull($field_definition->getPropertyDefinition('invalid')); + + // Test using the definition factory for field item lists and field items. + $field_item2 = $this->typedDataManager->createDataDefinition('field_item:integer'); + $this->assertFalse($field_item2 instanceof ListDefinitionInterface); + $this->assertTrue($field_item2 instanceof ComplexDataDefinitionInterface); + // Comparison should ignore the internal static cache, so compare the + // serialized objects instead. + $this->assertEqual(serialize($field_item_definition), serialize($field_item2)); + + $field_definition2 = $this->typedDataManager->createDataDefinition('field_item:integer', TRUE); + $this->assertTrue($field_definition2 instanceof ListDefinitionInterface); + $this->assertFalse($field_definition2 instanceof ComplexDataDefinitionInterface); + $this->assertEqual(serialize($field_definition), serialize($field_definition2)); + } + + /** + * Tests deriving metadata about entities. + */ + public function testEntities() { + $entity_definition = EntityDefinition::create('node'); + // Entities are complex data. + $this->assertFalse($entity_definition instanceof ListDefinitionInterface); + $this->assertTrue($entity_definition instanceof ComplexDataDefinitionInterface); + + $field_definitions = $entity_definition->getPropertyDefinitions(); + // Comparison should ignore the internal static cache, so compare the + // serialized objects instead. + $this->assertEqual(serialize($field_definitions), serialize(\Drupal::entityManager()->getFieldDefinitions('node'))); + $this->assertEqual($entity_definition->getPropertyDefinition('title')->getItemDefinition()->getDataType(), 'field_item:text'); + $this->assertNull($entity_definition->getMainPropertyName()); + $this->assertNull($entity_definition->getPropertyDefinition('invalid')); + + $entity_definition2 = $this->typedDataManager->createDataDefinition('entity:node', FALSE); + $this->assertFalse($entity_definition2 instanceof ListDefinitionInterface); + $this->assertTrue($entity_definition2 instanceof ComplexDataDefinitionInterface); + $this->assertEqual(serialize($entity_definition), serialize($entity_definition2)); + + // Test that definition factory creates the right definitions for all + // entity data types variants. + $this->assertEqual($this->typedDataManager->createDataDefinition('entity'), EntityDefinition::create()); + $this->assertEqual($this->typedDataManager->createDataDefinition('entity:node'), EntityDefinition::create('node')); + } + +} diff --git a/core/modules/system/lib/Drupal/system/Tests/TypedData/MetadataTest.php b/core/modules/system/lib/Drupal/system/Tests/TypedData/MetadataTest.php deleted file mode 100644 index 0b84cf4..0000000 --- a/core/modules/system/lib/Drupal/system/Tests/TypedData/MetadataTest.php +++ /dev/null @@ -1,170 +0,0 @@ - 'Metadata', - 'description' => 'Tests reading and deriving metadata of core data types.', - 'group' => 'Typed Data API', - ); - } - - public function setUp() { - parent::setup(); - $this->typedDataManager = $this->container->get('typed_data_manager'); - } - - /** - * Tests deriving metadata about list items. - */ - public function testLists() { - $list = ListDefinition::create('string'); - $this->assertTrue($list instanceof ListDefinitionInterface); - $item = $list->getItemDefinition(); - $this->assertTrue($item instanceof DataDefinitionInterface); - $this->assertEqual($item->getDataType(), 'string'); - - // Test using the definition factory. - $list2 = $this->typedDataManager->createDataDefinition('string', TRUE); - $this->assertTrue($list2 instanceof ListDefinitionInterface); - $this->assertEqual($list, $list2); - - // Test creating a single list item, which is the same as a list of any - // items. - $list = $this->typedDataManager->createDataDefinition('list'); - $this->assertTrue($list instanceof ListDefinitionInterface); - $this->assertEqual($list->getDataType(), 'list'); - $this->assertEqual($list->getItemDefinition()->getDataType(), 'any'); - } - - /** - * Tests deriving metadata about maps. - */ - public function testMaps() { - $map = MapDefinition::create() - ->setPropertyDefinition('one', DataDefinition::create('string')) - ->setPropertyDefinition('two', DataDefinition::create('string')) - ->setPropertyDefinition('three', DataDefinition::create('string')); - - $this->assertTrue($map instanceof ComplexDataDefinitionInterface); - - // Test retrieving metadata about contained properties. - $this->assertEqual(array_keys($map->getPropertyDefinitions()), array('one', 'two', 'three')); - $this->assertEqual($map->getPropertyDefinition('one')->getDataType(), 'string'); - $this->assertNull($map->getMainPropertyName()); - $this->assertNull($map->getPropertyDefinition('invalid')); - - // Test using the definition factory. - $map2 = $this->typedDataManager->createDataDefinition('map'); - $this->assertTrue($map2 instanceof ComplexDataDefinitionInterface); - $map2->setPropertyDefinition('one', DataDefinition::create('string')) - ->setPropertyDefinition('two', DataDefinition::create('string')) - ->setPropertyDefinition('three', DataDefinition::create('string')); - $this->assertEqual($map, $map2); - } - - /** - * Tests deriving metadata about fields. - */ - public function testFields() { - $field = FieldDefinition::create('integer'); - // Fields are lists of complex data. - $this->assertTrue($field instanceof ListDefinitionInterface); - $this->assertFalse($field instanceof ComplexDataDefinitionInterface); - $field_item = $field->getItemDefinition(); - $this->assertFalse($field_item instanceof ListDefinitionInterface); - $this->assertTrue($field_item instanceof ComplexDataDefinitionInterface); - - // Derive metadata about field item properties. - $this->assertEqual(array_keys($field_item->getPropertyDefinitions()), array('value')); - $this->assertEqual($field_item->getPropertyDefinition('value')->getDataType(), 'integer'); - $this->assertEqual($field_item->getMainPropertyName(), 'value'); - $this->assertNull($field_item->getPropertyDefinition('invalid')); - - // To ease access of field item property metadata, field definitions make - // metadata about field item properties on the field level as well. - $this->assertTrue($field instanceof FieldDefinitionInterface); - $this->assertEqual(array_keys($field->getPropertyDefinitions()), array('value')); - $this->assertEqual($field->getPropertyDefinition('value')->getDataType(), 'integer'); - $this->assertEqual($field->getMainPropertyName(), 'value'); - $this->assertNull($field->getPropertyDefinition('invalid')); - - // Test using the definition factory for field item lists and field items. - $field_item2 = $this->typedDataManager->createDataDefinition('field_item:integer'); - $this->assertFalse($field_item2 instanceof ListDefinitionInterface); - $this->assertTrue($field_item2 instanceof ComplexDataDefinitionInterface); - // Comparison should ignore the internal static cache, so compare the - // serialized objects instead. - $this->assertEqual(serialize($field_item), serialize($field_item2)); - - $field2 = $this->typedDataManager->createDataDefinition('field_item:integer', TRUE); - $this->assertTrue($field2 instanceof ListDefinitionInterface); - $this->assertFalse($field2 instanceof ComplexDataDefinitionInterface); - $this->assertEqual(serialize($field), serialize($field2)); - } - - /** - * Tests deriving metadata about entities. - */ - public function testEntities() { - $entity = EntityDefinition::create('entity:node'); - // Entities are complex data. - $this->assertFalse($entity instanceof ListDefinitionInterface); - $this->assertTrue($entity instanceof ComplexDataDefinitionInterface); - - $fields = $entity->getPropertyDefinitions(); - // Comparison should ignore the internal static cache, so compare the - // serialized objects instead. - $this->assertEqual(serialize($fields), serialize(\Drupal::entityManager()->getFieldDefinitions('node'))); - $this->assertEqual($entity->getPropertyDefinition('title')->getItemDefinition()->getDataType(), 'field_item:text'); - $this->assertNull($entity->getMainPropertyName()); - $this->assertNull($entity->getPropertyDefinition('invalid')); - - $entity2 = $this->typedDataManager->createDataDefinition('entity:node', FALSE); - $this->assertFalse($entity2 instanceof ListDefinitionInterface); - $this->assertTrue($entity2 instanceof ComplexDataDefinitionInterface); - $this->assertEqual(serialize($entity), serialize($entity2)); - - // Test that specifying the metadata via the setters is the same. - $this->assertEqual(EntityDefinition::create('entity'), EntityDefinition::create()); - $this->assertEqual(EntityDefinition::create('entity:node'), EntityDefinition::create()->setEntityType('node')); - $this->assertEqual(EntityDefinition::create('entity:node:article'), EntityDefinition::create()->setEntityType('node')->setBundles(array('article'))); - } - -} diff --git a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataDefinitionTest.php b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataDefinitionTest.php new file mode 100644 index 0000000..962d11e --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataDefinitionTest.php @@ -0,0 +1,92 @@ + 'Typed data definitions', + 'description' => 'Tests reading and deriving metadata of core data types.', + 'group' => 'Typed Data API', + ); + } + + public function setUp() { + parent::setup(); + $this->typedDataManager = $this->container->get('typed_data_manager'); + } + + /** + * Tests deriving metadata about list items. + */ + public function testLists() { + $list_definition = ListDefinition::create('string'); + $this->assertTrue($list_definition instanceof ListDefinitionInterface); + $item_definition = $list_definition->getItemDefinition(); + $this->assertTrue($item_definition instanceof DataDefinitionInterface); + $this->assertEqual($item_definition->getDataType(), 'string'); + + // Test using the definition factory. + $list_definition2 = $this->typedDataManager->createDataDefinition('string', TRUE); + $this->assertTrue($list_definition2 instanceof ListDefinitionInterface); + $this->assertEqual($list_definition, $list_definition2); + + // Test creating a single list item, which is the same as a list of any + // items. + $list_definition = $this->typedDataManager->createDataDefinition('list'); + $this->assertTrue($list_definition instanceof ListDefinitionInterface); + $this->assertEqual($list_definition->getDataType(), 'list'); + $this->assertEqual($list_definition->getItemDefinition()->getDataType(), 'any'); + } + + /** + * Tests deriving metadata about maps. + */ + public function testMaps() { + $map_definition = MapDefinition::create() + ->setPropertyDefinition('one', DataDefinition::create('string')) + ->setPropertyDefinition('two', DataDefinition::create('string')) + ->setPropertyDefinition('three', DataDefinition::create('string')); + + $this->assertTrue($map_definition instanceof ComplexDataDefinitionInterface); + + // Test retrieving metadata about contained properties. + $this->assertEqual(array_keys($map_definition->getPropertyDefinitions()), array('one', 'two', 'three')); + $this->assertEqual($map_definition->getPropertyDefinition('one')->getDataType(), 'string'); + $this->assertNull($map_definition->getMainPropertyName()); + $this->assertNull($map_definition->getPropertyDefinition('invalid')); + + // Test using the definition factory. + $map_definition2 = $this->typedDataManager->createDataDefinition('map'); + $this->assertTrue($map_definition2 instanceof ComplexDataDefinitionInterface); + $map_definition2->setPropertyDefinition('one', DataDefinition::create('string')) + ->setPropertyDefinition('two', DataDefinition::create('string')) + ->setPropertyDefinition('three', DataDefinition::create('string')); + $this->assertEqual($map_definition, $map_definition2); + } + +} diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php index 0d0565a..d57e303 100644 --- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php +++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextWithSummaryItem.php @@ -9,7 +9,6 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\TypedData\DataDefinition; -use Drupal\Core\Field\FieldDefinitionInterface; /** * Plugin implementation of the 'text_with_summary' field type.