xref: /plugin/combo/ComboStrap/Meta/Form/FormMetaField.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeaunamespace ComboStrap\Meta\Form;
5*04fd306cSNickeau
6*04fd306cSNickeau
7*04fd306cSNickeauuse ComboStrap\Canonical;
8*04fd306cSNickeauuse ComboStrap\DataType;
9*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
10*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
11*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal;
12*04fd306cSNickeauuse ComboStrap\Html;
13*04fd306cSNickeauuse ComboStrap\LogUtility;
14*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
15*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem;
16*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataMultiple;
17*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataTabular;
18*04fd306cSNickeauuse ComboStrap\PageDescription;
19*04fd306cSNickeauuse ComboStrap\PluginUtility;
20*04fd306cSNickeauuse ComboStrap\ResourceName;
21*04fd306cSNickeauuse ComboStrap\Web\Url;
22*04fd306cSNickeau
23*04fd306cSNickeau/**
24*04fd306cSNickeau * Class FormField
25*04fd306cSNickeau * @package ComboStrap
26*04fd306cSNickeau *
27*04fd306cSNickeau * A class that represents a tree of form field.
28*04fd306cSNickeau *
29*04fd306cSNickeau * Each field can be a scalar, a list or
30*04fd306cSNickeau * tabular by adding child fields.
31*04fd306cSNickeau *
32*04fd306cSNickeau *
33*04fd306cSNickeau */
34*04fd306cSNickeauclass FormMetaField
35*04fd306cSNickeau{
36*04fd306cSNickeau
37*04fd306cSNickeau
38*04fd306cSNickeau    /**
39*04fd306cSNickeau     * The JSON attribute
40*04fd306cSNickeau     */
41*04fd306cSNickeau    public const TAB_ATTRIBUTE = "tab";
42*04fd306cSNickeau    public const LABEL_ATTRIBUTE = "label";
43*04fd306cSNickeau    public const URL_ATTRIBUTE = "url";
44*04fd306cSNickeau    public const MUTABLE_ATTRIBUTE = "mutable";
45*04fd306cSNickeau    /**
46*04fd306cSNickeau     * A value may be a scalar or an array
47*04fd306cSNickeau     */
48*04fd306cSNickeau    public const VALUE_ATTRIBUTE = "value";
49*04fd306cSNickeau    public const DEFAULT_VALUE_ATTRIBUTE = "default";
50*04fd306cSNickeau
51*04fd306cSNickeau    public const DOMAIN_VALUES_ATTRIBUTE = "domain-values";
52*04fd306cSNickeau    public const WIDTH_ATTRIBUTE = "width";
53*04fd306cSNickeau    public const CHILDREN_ATTRIBUTE = "children";
54*04fd306cSNickeau    const DESCRIPTION_ATTRIBUTE = PageDescription::PROPERTY_NAME;
55*04fd306cSNickeau    const NAME_ATTRIBUTE = ResourceName::PROPERTY_NAME;
56*04fd306cSNickeau    const MULTIPLE_ATTRIBUTE = "multiple";
57*04fd306cSNickeau    const TYPE_ATTRIBUTE = DataType::PROPERTY_NAME;
58*04fd306cSNickeau
59*04fd306cSNickeau
60*04fd306cSNickeau    private $name;
61*04fd306cSNickeau    /**
62*04fd306cSNickeau     * @var bool
63*04fd306cSNickeau     */
64*04fd306cSNickeau    private $mutable;
65*04fd306cSNickeau    /**
66*04fd306cSNickeau     * @var string
67*04fd306cSNickeau     */
68*04fd306cSNickeau    private $tab;
69*04fd306cSNickeau    /**
70*04fd306cSNickeau     * @var string
71*04fd306cSNickeau     */
72*04fd306cSNickeau    private $label;
73*04fd306cSNickeau    private $description;
74*04fd306cSNickeau    /**
75*04fd306cSNickeau     * If canonical is set, an url is also send
76*04fd306cSNickeau     */
77*04fd306cSNickeau    private string $canonical;
78*04fd306cSNickeau    private array $values = [];
79*04fd306cSNickeau    private array $defaults = [];
80*04fd306cSNickeau    /**
81*04fd306cSNickeau     * @var string
82*04fd306cSNickeau     */
83*04fd306cSNickeau    private $type;
84*04fd306cSNickeau    /**
85*04fd306cSNickeau     * @var array
86*04fd306cSNickeau     */
87*04fd306cSNickeau    private $domainValues;
88*04fd306cSNickeau    /**
89*04fd306cSNickeau     * @var FormMetaField[]
90*04fd306cSNickeau     */
91*04fd306cSNickeau    private $children;
92*04fd306cSNickeau    /**
93*04fd306cSNickeau     * @var int
94*04fd306cSNickeau     */
95*04fd306cSNickeau    private $width;
96*04fd306cSNickeau    /**
97*04fd306cSNickeau     * Multiple value can be chosen
98*04fd306cSNickeau     * @var bool
99*04fd306cSNickeau     */
100*04fd306cSNickeau    private $multiple = false;
101*04fd306cSNickeau
102*04fd306cSNickeau
103*04fd306cSNickeau    /**
104*04fd306cSNickeau     * FormField constructor.
105*04fd306cSNickeau     * The name is mandatory
106*04fd306cSNickeau     * and the type to be able to control the values
107*04fd306cSNickeau     */
108*04fd306cSNickeau    public function __construct($name, $type)
109*04fd306cSNickeau    {
110*04fd306cSNickeau        $this->name = $name;
111*04fd306cSNickeau        $this->label = ucfirst($name);
112*04fd306cSNickeau        $this->description = $name;
113*04fd306cSNickeau        if (!in_array($type, DataType::TYPES)) {
114*04fd306cSNickeau            throw new ExceptionRuntimeInternal("The type ($type) is not a known field type");
115*04fd306cSNickeau        }
116*04fd306cSNickeau        $this->type = $type;
117*04fd306cSNickeau        $this->mutable = true;
118*04fd306cSNickeau    }
119*04fd306cSNickeau
120*04fd306cSNickeau    public static function create(string $name, string $type): FormMetaField
121*04fd306cSNickeau    {
122*04fd306cSNickeau        return new FormMetaField($name, $type);
123*04fd306cSNickeau    }
124*04fd306cSNickeau
125*04fd306cSNickeau    /**
126*04fd306cSNickeau     * Almost because a form does not allow hierarchical data
127*04fd306cSNickeau     * We send an error in this case
128*04fd306cSNickeau     * @param Metadata $metadata
129*04fd306cSNickeau     * @return FormMetaField
130*04fd306cSNickeau     */
131*04fd306cSNickeau    public static function createFromMetadata(Metadata $metadata): FormMetaField
132*04fd306cSNickeau    {
133*04fd306cSNickeau        $field = FormMetaField::create($metadata->getName(), $metadata->getDataType());
134*04fd306cSNickeau
135*04fd306cSNickeau        self::setCommonDataToFieldFromMetadata($field, $metadata);
136*04fd306cSNickeau
137*04fd306cSNickeau        $childrenMetadata = $metadata->getChildrenClass();
138*04fd306cSNickeau
139*04fd306cSNickeau        try {
140*04fd306cSNickeau            $metadata->getParent();
141*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
142*04fd306cSNickeau            /**
143*04fd306cSNickeau             * Only the top field have a tab value
144*04fd306cSNickeau             */
145*04fd306cSNickeau            $field->setTab($metadata->getTab());
146*04fd306cSNickeau        }
147*04fd306cSNickeau
148*04fd306cSNickeau
149*04fd306cSNickeau        /**
150*04fd306cSNickeau         * No children
151*04fd306cSNickeau         */
152*04fd306cSNickeau        if (count($childrenMetadata) === 0) {
153*04fd306cSNickeau
154*04fd306cSNickeau            static::setLeafDataToFieldFromMetadata($field, $metadata);
155*04fd306cSNickeau
156*04fd306cSNickeau            /**
157*04fd306cSNickeau             * When tabular, the value comes from the parent
158*04fd306cSNickeau             */
159*04fd306cSNickeau            if ($metadata->isScalar()) {
160*04fd306cSNickeau                $value = $metadata->toStoreValue();
161*04fd306cSNickeau                $defaultValue = $metadata->toStoreDefaultValue();
162*04fd306cSNickeau                $field->addValue($value, $defaultValue);
163*04fd306cSNickeau            }
164*04fd306cSNickeau
165*04fd306cSNickeau        } else {
166*04fd306cSNickeau
167*04fd306cSNickeau            if ($metadata instanceof MetadataTabular) {
168*04fd306cSNickeau
169*04fd306cSNickeau                $childFields = [];
170*04fd306cSNickeau                foreach ($metadata->getChildrenClass() as $childMetadataClass) {
171*04fd306cSNickeau
172*04fd306cSNickeau                    try {
173*04fd306cSNickeau                        $childMetadata = MetadataSystem::toMetadataObject($childMetadataClass, $metadata);
174*04fd306cSNickeau                    } catch (ExceptionBadArgument $e) {
175*04fd306cSNickeau                        // should happen only internally
176*04fd306cSNickeau                        LogUtility::internalError("The metadata class/object ($childMetadataClass) is not a metadata class");
177*04fd306cSNickeau                        continue;
178*04fd306cSNickeau                    }
179*04fd306cSNickeau                    $childField = FormMetaField::createFromMetadata($childMetadata);
180*04fd306cSNickeau                    static::setCommonDataToFieldFromMetadata($childField, $childMetadata);
181*04fd306cSNickeau                    static::setLeafDataToFieldFromMetadata($childField, $childMetadata);
182*04fd306cSNickeau                    $field->addColumn($childField);
183*04fd306cSNickeau                    $childFields[$childMetadata::getPersistentName()] = $childField;
184*04fd306cSNickeau                }
185*04fd306cSNickeau                try {
186*04fd306cSNickeau                    $rows = $metadata->getValue();
187*04fd306cSNickeau                } catch (ExceptionNotFound $e) {
188*04fd306cSNickeau                    $rows = null;
189*04fd306cSNickeau                }
190*04fd306cSNickeau                if ($rows !== null) {
191*04fd306cSNickeau                    $defaultRow = null;
192*04fd306cSNickeau                    try {
193*04fd306cSNickeau                        $defaultRows = $metadata->getDefaultValue();
194*04fd306cSNickeau                        $defaultRow = $defaultRows[0];
195*04fd306cSNickeau                    } catch (ExceptionNotFound $e) {
196*04fd306cSNickeau                        // no default row
197*04fd306cSNickeau                    }
198*04fd306cSNickeau                    foreach ($rows as $row) {
199*04fd306cSNickeau                        foreach ($childFields as $childName => $childField) {
200*04fd306cSNickeau                            $colValue = $row[$childName];
201*04fd306cSNickeau                            if ($colValue === null) {
202*04fd306cSNickeau                                if ($defaultRow === null) {
203*04fd306cSNickeau                                    continue;
204*04fd306cSNickeau                                }
205*04fd306cSNickeau                                $colValue = $defaultRow[$childName];
206*04fd306cSNickeau                                if ($colValue === null) {
207*04fd306cSNickeau                                    continue;
208*04fd306cSNickeau                                }
209*04fd306cSNickeau                            }
210*04fd306cSNickeau                            $storeValue = $colValue->toStoreValue();
211*04fd306cSNickeau                            $defaultStoreValue = $colValue->toStoreDefaultValue();
212*04fd306cSNickeau                            $childField->addValue($storeValue, $defaultStoreValue);
213*04fd306cSNickeau                        }
214*04fd306cSNickeau
215*04fd306cSNickeau                    }
216*04fd306cSNickeau
217*04fd306cSNickeau                    // Add an extra empty row to allow adding an image
218*04fd306cSNickeau                    if ($defaultRow !== null) {
219*04fd306cSNickeau                        foreach ($defaultRow as $colName => $colMetadata) {
220*04fd306cSNickeau                            if($colName===null){
221*04fd306cSNickeau                                LogUtility::internalError("The persistence name (column name) should be set as key for the default rows");
222*04fd306cSNickeau                                continue;
223*04fd306cSNickeau                            }
224*04fd306cSNickeau                            $defaultColValue = null;
225*04fd306cSNickeau                            if ($colMetadata !== null) {
226*04fd306cSNickeau                                $defaultColValue = $colMetadata->toStoreDefaultValue();
227*04fd306cSNickeau                            }
228*04fd306cSNickeau                            $childField = $childFields[$colName];
229*04fd306cSNickeau                            $childField->addValue(null, $defaultColValue);
230*04fd306cSNickeau                        }
231*04fd306cSNickeau                    }
232*04fd306cSNickeau                } else {
233*04fd306cSNickeau
234*04fd306cSNickeau
235*04fd306cSNickeau                    // No rows, show the default rows
236*04fd306cSNickeau                    try {
237*04fd306cSNickeau                        $rows = $metadata->getDefaultValue();
238*04fd306cSNickeau                    } catch (ExceptionNotFound $e) {
239*04fd306cSNickeau                        // no default row ok
240*04fd306cSNickeau                        $rows = [];
241*04fd306cSNickeau                    }
242*04fd306cSNickeau                    foreach ($rows as $row) {
243*04fd306cSNickeau                        foreach ($row as $colName => $colValue) {
244*04fd306cSNickeau                            if ($colValue === null) {
245*04fd306cSNickeau                                continue;
246*04fd306cSNickeau                            }
247*04fd306cSNickeau                            $childField = $childFields[$colName];
248*04fd306cSNickeau                            $childField->addValue(null, $colValue->toStoreValue());
249*04fd306cSNickeau                        }
250*04fd306cSNickeau                    }
251*04fd306cSNickeau
252*04fd306cSNickeau                }
253*04fd306cSNickeau
254*04fd306cSNickeau
255*04fd306cSNickeau            } else {
256*04fd306cSNickeau
257*04fd306cSNickeau                LogUtility::msg("Hierarchical data is not supported in a form. Metadata ($metadata) has children and is not tabular");
258*04fd306cSNickeau            }
259*04fd306cSNickeau        }
260*04fd306cSNickeau        return $field;
261*04fd306cSNickeau
262*04fd306cSNickeau    }
263*04fd306cSNickeau
264*04fd306cSNickeau
265*04fd306cSNickeau    public
266*04fd306cSNickeau    function toAssociativeArray(): array
267*04fd306cSNickeau    {
268*04fd306cSNickeau        /**
269*04fd306cSNickeau         * Mandatory attributes
270*04fd306cSNickeau         */
271*04fd306cSNickeau        $associative = [
272*04fd306cSNickeau            self::NAME_ATTRIBUTE => $this->name,
273*04fd306cSNickeau            self::LABEL_ATTRIBUTE => $this->label,
274*04fd306cSNickeau            self::TYPE_ATTRIBUTE => $this->type
275*04fd306cSNickeau        ];
276*04fd306cSNickeau
277*04fd306cSNickeau        try {
278*04fd306cSNickeau            $associative[self::URL_ATTRIBUTE] = $this->getUrl()->toString();
279*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
280*04fd306cSNickeau            // ok
281*04fd306cSNickeau        }
282*04fd306cSNickeau
283*04fd306cSNickeau        if ($this->description != null) {
284*04fd306cSNickeau            $associative[self::DESCRIPTION_ATTRIBUTE] = $this->description;
285*04fd306cSNickeau        }
286*04fd306cSNickeau        /**
287*04fd306cSNickeau         * For child form field (ie column), there is no tab
288*04fd306cSNickeau         */
289*04fd306cSNickeau        if ($this->tab != null) {
290*04fd306cSNickeau            $associative[self::TAB_ATTRIBUTE] = $this->tab;
291*04fd306cSNickeau        }
292*04fd306cSNickeau
293*04fd306cSNickeau
294*04fd306cSNickeau        if ($this->width !== null) {
295*04fd306cSNickeau            $associative[self::WIDTH_ATTRIBUTE] = $this->width;
296*04fd306cSNickeau        }
297*04fd306cSNickeau        if ($this->children !== null) {
298*04fd306cSNickeau            foreach ($this->children as $column) {
299*04fd306cSNickeau                $associative[self::CHILDREN_ATTRIBUTE][] = $column->toAssociativeArray();
300*04fd306cSNickeau            }
301*04fd306cSNickeau        } else {
302*04fd306cSNickeau
303*04fd306cSNickeau            /**
304*04fd306cSNickeau             * Only valid for leaf field
305*04fd306cSNickeau             */
306*04fd306cSNickeau            if ($this->getValue() !== null && $this->getValue() !== "") {
307*04fd306cSNickeau                $associative[self::VALUE_ATTRIBUTE] = $this->getValue();
308*04fd306cSNickeau            }
309*04fd306cSNickeau
310*04fd306cSNickeau            if ($this->getDefaultValue() !== null) {
311*04fd306cSNickeau                $associative[self::DEFAULT_VALUE_ATTRIBUTE] = $this->getDefaultValue();
312*04fd306cSNickeau            }
313*04fd306cSNickeau
314*04fd306cSNickeau            if ($this->domainValues !== null) {
315*04fd306cSNickeau                $associative[self::DOMAIN_VALUES_ATTRIBUTE] = $this->domainValues;
316*04fd306cSNickeau                if ($this->multiple) {
317*04fd306cSNickeau                    $associative[self::MULTIPLE_ATTRIBUTE] = $this->multiple;
318*04fd306cSNickeau                }
319*04fd306cSNickeau            }
320*04fd306cSNickeau
321*04fd306cSNickeau            $associative[self::MUTABLE_ATTRIBUTE] = $this->mutable;
322*04fd306cSNickeau
323*04fd306cSNickeau
324*04fd306cSNickeau        }
325*04fd306cSNickeau
326*04fd306cSNickeau
327*04fd306cSNickeau        return $associative;
328*04fd306cSNickeau    }
329*04fd306cSNickeau
330*04fd306cSNickeau    public
331*04fd306cSNickeau    function setMutable(bool $bool): FormMetaField
332*04fd306cSNickeau    {
333*04fd306cSNickeau        $this->mutable = $bool;
334*04fd306cSNickeau        return $this;
335*04fd306cSNickeau    }
336*04fd306cSNickeau
337*04fd306cSNickeau
338*04fd306cSNickeau    public
339*04fd306cSNickeau    function setTab(string $tabName): FormMetaField
340*04fd306cSNickeau    {
341*04fd306cSNickeau        Html::validNameGuard($tabName);
342*04fd306cSNickeau        $this->tab = $tabName;
343*04fd306cSNickeau        return $this;
344*04fd306cSNickeau    }
345*04fd306cSNickeau
346*04fd306cSNickeau    public
347*04fd306cSNickeau    function setLabel(string $label): FormMetaField
348*04fd306cSNickeau    {
349*04fd306cSNickeau        $this->label = $label;
350*04fd306cSNickeau        return $this;
351*04fd306cSNickeau    }
352*04fd306cSNickeau
353*04fd306cSNickeau    /**
354*04fd306cSNickeau     * @throws ExceptionNotFound
355*04fd306cSNickeau     */
356*04fd306cSNickeau    public
357*04fd306cSNickeau    function getUrl(): Url
358*04fd306cSNickeau    {
359*04fd306cSNickeau        if (!isset($this->canonical)) {
360*04fd306cSNickeau            throw new ExceptionNotFound();
361*04fd306cSNickeau        }
362*04fd306cSNickeau
363*04fd306cSNickeau        return Canonical::createFromValue($this->canonical)
364*04fd306cSNickeau            ->getComboStrapUrlForDocumentation();
365*04fd306cSNickeau
366*04fd306cSNickeau    }
367*04fd306cSNickeau
368*04fd306cSNickeau    public
369*04fd306cSNickeau    function setCanonical(string $canonical): FormMetaField
370*04fd306cSNickeau    {
371*04fd306cSNickeau        $this->canonical = $canonical;
372*04fd306cSNickeau        return $this;
373*04fd306cSNickeau    }
374*04fd306cSNickeau
375*04fd306cSNickeau    public
376*04fd306cSNickeau    function setDescription(string $string): FormMetaField
377*04fd306cSNickeau    {
378*04fd306cSNickeau        $this->description = $string;
379*04fd306cSNickeau        return $this;
380*04fd306cSNickeau    }
381*04fd306cSNickeau
382*04fd306cSNickeau    /**
383*04fd306cSNickeau     * @param boolean|string|null $value
384*04fd306cSNickeau     * @param boolean|string|null $defaultValuePlaceholderOrReturned - the value set as placeholder or return value for a checked checkbox
385*04fd306cSNickeau     * @return $this
386*04fd306cSNickeau     */
387*04fd306cSNickeau    public
388*04fd306cSNickeau    function addValue($value, $defaultValuePlaceholderOrReturned = null): FormMetaField
389*04fd306cSNickeau    {
390*04fd306cSNickeau        if ($this->getType() === DataType::BOOLEAN_TYPE_VALUE) {
391*04fd306cSNickeau            if ($value != null && !DataType::isBoolean($value)) {
392*04fd306cSNickeau                throw new ExceptionRuntimeInternal("The value ($value) is not a boolean");
393*04fd306cSNickeau            }
394*04fd306cSNickeau            if ($defaultValuePlaceholderOrReturned != null && !DataType::isBoolean($defaultValuePlaceholderOrReturned)) {
395*04fd306cSNickeau                throw new ExceptionRuntimeInternal("The default value ($defaultValuePlaceholderOrReturned) is not a boolean");
396*04fd306cSNickeau            }
397*04fd306cSNickeau        }
398*04fd306cSNickeau        $this->values[] = $value;
399*04fd306cSNickeau        $this->defaults[] = $defaultValuePlaceholderOrReturned;
400*04fd306cSNickeau        return $this;
401*04fd306cSNickeau    }
402*04fd306cSNickeau
403*04fd306cSNickeau
404*04fd306cSNickeau    public
405*04fd306cSNickeau    function setDomainValues(array $domainValues): FormMetaField
406*04fd306cSNickeau    {
407*04fd306cSNickeau        $this->domainValues = $domainValues;
408*04fd306cSNickeau        return $this;
409*04fd306cSNickeau    }
410*04fd306cSNickeau
411*04fd306cSNickeau    public
412*04fd306cSNickeau    function addColumn(FormMetaField $formField): FormMetaField
413*04fd306cSNickeau    {
414*04fd306cSNickeau        $this->type = DataType::TABULAR_TYPE_VALUE;
415*04fd306cSNickeau        // A parent node is not mutable
416*04fd306cSNickeau        $this->mutable = false;
417*04fd306cSNickeau        $this->children[] = $formField;
418*04fd306cSNickeau        return $this;
419*04fd306cSNickeau    }
420*04fd306cSNickeau
421*04fd306cSNickeau    public
422*04fd306cSNickeau    function setWidth(int $int): FormMetaField
423*04fd306cSNickeau    {
424*04fd306cSNickeau        $this->width = $int;
425*04fd306cSNickeau        return $this;
426*04fd306cSNickeau    }
427*04fd306cSNickeau
428*04fd306cSNickeau    public
429*04fd306cSNickeau    function getTab(): string
430*04fd306cSNickeau    {
431*04fd306cSNickeau        return $this->tab;
432*04fd306cSNickeau    }
433*04fd306cSNickeau
434*04fd306cSNickeau    public
435*04fd306cSNickeau    function getName()
436*04fd306cSNickeau    {
437*04fd306cSNickeau        return $this->name;
438*04fd306cSNickeau    }
439*04fd306cSNickeau
440*04fd306cSNickeau    public
441*04fd306cSNickeau    function getValue()
442*04fd306cSNickeau    {
443*04fd306cSNickeau        switch (sizeof($this->values)) {
444*04fd306cSNickeau            case 0:
445*04fd306cSNickeau                return null;
446*04fd306cSNickeau            case 1:
447*04fd306cSNickeau                $value = $this->values[0];
448*04fd306cSNickeau                if ($value !== null) {
449*04fd306cSNickeau                    return $this->values[0];
450*04fd306cSNickeau                }
451*04fd306cSNickeau                return null;
452*04fd306cSNickeau            default:
453*04fd306cSNickeau                return $this->values;
454*04fd306cSNickeau        }
455*04fd306cSNickeau    }
456*04fd306cSNickeau
457*04fd306cSNickeau    public
458*04fd306cSNickeau    function isMutable(): bool
459*04fd306cSNickeau    {
460*04fd306cSNickeau        return $this->mutable;
461*04fd306cSNickeau    }
462*04fd306cSNickeau
463*04fd306cSNickeau    public
464*04fd306cSNickeau    function getChildren(): ?array
465*04fd306cSNickeau    {
466*04fd306cSNickeau        return $this->children;
467*04fd306cSNickeau    }
468*04fd306cSNickeau
469*04fd306cSNickeau    public
470*04fd306cSNickeau    function getType(): string
471*04fd306cSNickeau    {
472*04fd306cSNickeau        return $this->type;
473*04fd306cSNickeau    }
474*04fd306cSNickeau
475*04fd306cSNickeau    public
476*04fd306cSNickeau    function getDefaultValue()
477*04fd306cSNickeau    {
478*04fd306cSNickeau        switch (sizeof($this->defaults)) {
479*04fd306cSNickeau            case 0:
480*04fd306cSNickeau                return null;
481*04fd306cSNickeau            case 1:
482*04fd306cSNickeau                $value = $this->defaults[0];
483*04fd306cSNickeau                if ($value !== null) {
484*04fd306cSNickeau                    return $value;
485*04fd306cSNickeau                }
486*04fd306cSNickeau                return null;
487*04fd306cSNickeau            default:
488*04fd306cSNickeau                return $this->defaults;
489*04fd306cSNickeau        }
490*04fd306cSNickeau    }
491*04fd306cSNickeau
492*04fd306cSNickeau    public
493*04fd306cSNickeau    function setMultiple(bool $bool): FormMetaField
494*04fd306cSNickeau    {
495*04fd306cSNickeau        $this->multiple = $bool;
496*04fd306cSNickeau        return $this;
497*04fd306cSNickeau    }
498*04fd306cSNickeau
499*04fd306cSNickeau    public
500*04fd306cSNickeau    function isMultiple(): bool
501*04fd306cSNickeau    {
502*04fd306cSNickeau        return $this->multiple;
503*04fd306cSNickeau    }
504*04fd306cSNickeau
505*04fd306cSNickeau    /**
506*04fd306cSNickeau     * If this is a scalar value, you can set/overwrite the value
507*04fd306cSNickeau     * with this function
508*04fd306cSNickeau     * @param $value
509*04fd306cSNickeau     * @param null $default
510*04fd306cSNickeau     * @return $this
511*04fd306cSNickeau     */
512*04fd306cSNickeau    public
513*04fd306cSNickeau    function setValue($value, $default = null): FormMetaField
514*04fd306cSNickeau    {
515*04fd306cSNickeau        $this->values = [];
516*04fd306cSNickeau        $this->defaults = [];
517*04fd306cSNickeau        return $this->addValue($value, $default);
518*04fd306cSNickeau
519*04fd306cSNickeau    }
520*04fd306cSNickeau
521*04fd306cSNickeau    /**
522*04fd306cSNickeau     * Common metadata to all field from a leaf to a tabular
523*04fd306cSNickeau     * @param FormMetaField $field
524*04fd306cSNickeau     * @param Metadata $metadata
525*04fd306cSNickeau     */
526*04fd306cSNickeau    private
527*04fd306cSNickeau    static
528*04fd306cSNickeau    function setCommonDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata)
529*04fd306cSNickeau    {
530*04fd306cSNickeau        $field
531*04fd306cSNickeau            ->setCanonical($metadata->getCanonical())
532*04fd306cSNickeau            ->setLabel($metadata->getLabel())
533*04fd306cSNickeau            ->setDescription($metadata->getDescription());
534*04fd306cSNickeau    }
535*04fd306cSNickeau
536*04fd306cSNickeau    /**
537*04fd306cSNickeau     * @param FormMetaField $field
538*04fd306cSNickeau     * @param Metadata $metadata
539*04fd306cSNickeau     * Add the field metadata that are only available for leaf metadata
540*04fd306cSNickeau     */
541*04fd306cSNickeau    private
542*04fd306cSNickeau    static
543*04fd306cSNickeau    function setLeafDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata)
544*04fd306cSNickeau    {
545*04fd306cSNickeau        $field->setMutable($metadata->isMutable());
546*04fd306cSNickeau
547*04fd306cSNickeau        $formControlWidth = $metadata->getFormControlWidth();
548*04fd306cSNickeau        if ($formControlWidth !== null) {
549*04fd306cSNickeau            $field->setWidth($formControlWidth);
550*04fd306cSNickeau        }
551*04fd306cSNickeau        $possibleValues = $metadata->getPossibleValues();
552*04fd306cSNickeau        if ($possibleValues !== null) {
553*04fd306cSNickeau            $field->setDomainValues($possibleValues);
554*04fd306cSNickeau            if ($metadata instanceof MetadataMultiple) {
555*04fd306cSNickeau                $field->setMultiple(true);
556*04fd306cSNickeau            }
557*04fd306cSNickeau        }
558*04fd306cSNickeau
559*04fd306cSNickeau    }
560*04fd306cSNickeau
561*04fd306cSNickeau    public function __toString()
562*04fd306cSNickeau    {
563*04fd306cSNickeau        return $this->getName();
564*04fd306cSNickeau    }
565*04fd306cSNickeau
566*04fd306cSNickeau
567*04fd306cSNickeau}
568