3 namespace Drupal\Core\TypedData;
6 * A typed data definition class for defining lists.
8 class ListDataDefinition extends DataDefinition implements ListDataDefinitionInterface {
11 * The data definition of a list item.
13 * @var \Drupal\Core\TypedData\DataDefinitionInterface
15 protected $itemDefinition;
18 * Creates a new list definition.
20 * @param string $item_type
21 * The data type of the list items; e.g., 'string', 'integer' or 'any'.
23 * @return \Drupal\Core\TypedData\ListDataDefinition
24 * A new List Data Definition object.
26 public static function create($item_type) {
27 return static::createFromItemType($item_type);
33 public static function createFromDataType($type) {
34 $definition = parent::createFromDataType($type);
35 // If nothing else given, default to a list of 'any' items.
36 $definition->itemDefinition = DataDefinition::create('any');
43 public static function createFromItemType($item_type) {
44 return new static([], \Drupal::typedDataManager()->createDataDefinition($item_type));
50 public function __construct(array $values = [], DataDefinitionInterface $item_definition = NULL) {
51 $this->definition = $values;
52 $this->itemDefinition = $item_definition;
58 public function getDataType() {
65 public function setDataType($type) {
66 if ($type != 'list') {
67 throw new \LogicException('Lists must always be of data type "list".');
74 public function getClass() {
75 if (!empty($this->definition['class'])) {
76 return $this->definition['class'];
79 // If a list definition is used but no class has been specified, derive the
80 // default list class from the item type.
81 $item_type_definition = \Drupal::typedDataManager()
82 ->getDefinition($this->getItemDefinition()->getDataType());
83 if (!$item_type_definition) {
84 throw new \LogicException("An invalid data type '{$this->getItemDefinition()->getDataType()}' has been specified for list items");
86 return $item_type_definition['list_class'];
92 public function getItemDefinition() {
93 return $this->itemDefinition;
97 * Sets the item definition.
99 * @param \Drupal\Core\TypedData\DataDefinition $definition
100 * A list item's data definition.
104 public function setItemDefinition(DataDefinitionInterface $definition) {
105 $this->itemDefinition = $definition;
110 * Magic method: Implements a deep clone.
112 public function __clone() {
113 // Ensure the itemDefinition property is actually cloned by overwriting the
114 // original reference.
115 $this->itemDefinition = clone $this->itemDefinition;