ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
BaseElement.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
26
27abstract class BaseElement implements BaseElementInterface
28{
32 private array $sub_elements = [];
33 private ?BaseElement $super_element = null;
35 private int|NoID $md_id;
36
37 public function __construct(
38 int|NoID $md_id,
41 ) {
42 foreach ($sub_elements as $sub_element) {
43 $this->addSubElement($sub_element);
44 }
45 $this->definition = $definition;
46 $this->md_id = $md_id;
47 }
48
49 public function __clone()
50 {
51 if (!is_null($this->super_element)) {
52 $this->setSuperElement(null);
53 }
54 $map = function (BaseElement $arg) {
55 $arg = clone $arg;
56 $arg->setSuperElement($this);
57 return $arg;
58 };
59 $this->sub_elements = array_map(
60 $map,
61 $this->sub_elements
62 );
63 }
64
65 public function getMDID(): int|NoID
66 {
67 return $this->md_id;
68 }
69
73 public function getSubElements(): \Generator
74 {
76 }
77
78 protected function addSubElement(BaseElement $sub_element): void
79 {
80 $sub_element->setSuperElement($this);
81 $this->sub_elements[] = $sub_element;
82 }
83
84 protected function orderSubElements(string ...$names_in_order): void
85 {
86 $sub_elements_by_name = [];
87 foreach ($this->sub_elements as $sub_element) {
88 $sub_elements_by_name[$sub_element->getDefinition()->name()][] = $sub_element;
89 }
90
91 $reordered_sub_elements = [];
92 foreach ($names_in_order as $name) {
93 $reordered_sub_elements = array_merge(
94 $reordered_sub_elements,
95 $sub_elements_by_name[$name] ?? []
96 );
97 }
98
99 $this->sub_elements = $reordered_sub_elements;
100 }
101
102 public function getSuperElement(): ?BaseElement
103 {
105 }
106
107 protected function setSuperElement(?BaseElement $super_element): void
108 {
109 if ($this->isRoot()) {
110 throw new \ilMDElementsException(
111 'Metadata root can not have a super element.'
112 );
113 }
114 $this->super_element = $super_element;
115 }
116
117 public function isRoot(): bool
118 {
119 return $this->getMDID() === NoID::ROOT;
120 }
121
123 {
124 return $this->definition;
125 }
126}
addSubElement(BaseElement $sub_element)
Definition: BaseElement.php:78
getDefinition()
Defining properties of the metadata element.
__construct(int|NoID $md_id, DefinitionInterface $definition, BaseElement ... $sub_elements)
Definition: BaseElement.php:37
setSuperElement(?BaseElement $super_element)
orderSubElements(string ... $names_in_order)
Definition: BaseElement.php:84