forked from Gernott/mask
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTcaDefinition.php
105 lines (89 loc) · 2.71 KB
/
TcaDefinition.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
declare(strict_types=1);
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
namespace MASK\Mask\Definition;
final class TcaDefinition implements \IteratorAggregate
{
/**
* @var array<TcaFieldDefinition>
*/
private $definitions = [];
/**
* @var string
*/
public $table = '';
public function __clone()
{
$this->definitions = array_map(function (TcaFieldDefinition $tcaFieldDefinition) {
return clone $tcaFieldDefinition;
}, $this->definitions);
}
public function addField(TcaFieldDefinition $definition): void
{
if (!$this->hasField($definition->fullKey)) {
$this->definitions[$definition->fullKey] = $definition;
}
}
public function hasField(string $key): bool
{
return isset($this->definitions[$key]);
}
public function getField(string $key): TcaFieldDefinition
{
if ($this->hasField($key)) {
return $this->definitions[$key];
}
throw new \OutOfBoundsException(sprintf('A field with the key "%s" does not exist in table "%s".', $key, $this->table), 1629276302);
}
public static function createFromArray(array $tca, string $table): TcaDefinition
{
$tcaDefinition = new self();
$tcaDefinition->table = $table;
foreach ($tca as $definition) {
$tcaDefinition->addField(TcaFieldDefinition::createFromFieldArray($definition));
}
return $tcaDefinition;
}
public function getKeys(): array
{
return array_keys($this->definitions);
}
private function getOrderedFields(): array
{
$fields = $this->definitions;
usort($fields, static function (TcaFieldDefinition $fieldA, TcaFieldDefinition $fieldB) {
return $fieldA->order <=> $fieldB->order;
});
return $fields;
}
/**
* @return \Traversable|TcaFieldDefinition[]
*/
public function getIterator(): \Traversable
{
return new \ArrayIterator($this->getOrderedFields());
}
public function toArray(): array
{
$fields = [];
foreach ($this->definitions as $definition) {
$fields[$definition->fullKey] = $definition->toArray();
}
return $fields;
}
public function count(): int
{
return count($this->definitions);
}
}