xref: /plugin/combo/ComboStrap/Meta/Form/FormMetaField.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514) !
104fd306cSNickeau<?php
204fd306cSNickeau
304fd306cSNickeau
404fd306cSNickeaunamespace ComboStrap\Meta\Form;
504fd306cSNickeau
604fd306cSNickeau
704fd306cSNickeauuse ComboStrap\Canonical;
804fd306cSNickeauuse ComboStrap\DataType;
904fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
1004fd306cSNickeauuse ComboStrap\ExceptionNotFound;
1104fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal;
1204fd306cSNickeauuse ComboStrap\Html;
1304fd306cSNickeauuse ComboStrap\LogUtility;
1404fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
1504fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem;
1604fd306cSNickeauuse ComboStrap\Meta\Api\MetadataMultiple;
1704fd306cSNickeauuse ComboStrap\Meta\Api\MetadataTabular;
1804fd306cSNickeauuse ComboStrap\PageDescription;
1904fd306cSNickeauuse ComboStrap\PluginUtility;
2004fd306cSNickeauuse ComboStrap\ResourceName;
2104fd306cSNickeauuse ComboStrap\Web\Url;
2204fd306cSNickeau
2304fd306cSNickeau/**
2404fd306cSNickeau * Class FormField
2504fd306cSNickeau * @package ComboStrap
2604fd306cSNickeau *
2704fd306cSNickeau * A class that represents a tree of form field.
2804fd306cSNickeau *
2904fd306cSNickeau * Each field can be a scalar, a list or
3004fd306cSNickeau * tabular by adding child fields.
3104fd306cSNickeau *
3204fd306cSNickeau *
3304fd306cSNickeau */
3404fd306cSNickeauclass FormMetaField
3504fd306cSNickeau{
3604fd306cSNickeau
3704fd306cSNickeau
3804fd306cSNickeau    /**
3904fd306cSNickeau     * The JSON attribute
4004fd306cSNickeau     */
4104fd306cSNickeau    public const TAB_ATTRIBUTE = "tab";
4204fd306cSNickeau    public const LABEL_ATTRIBUTE = "label";
4304fd306cSNickeau    public const URL_ATTRIBUTE = "url";
4404fd306cSNickeau    public const MUTABLE_ATTRIBUTE = "mutable";
4504fd306cSNickeau    /**
4604fd306cSNickeau     * A value may be a scalar or an array
4704fd306cSNickeau     */
4804fd306cSNickeau    public const VALUE_ATTRIBUTE = "value";
4904fd306cSNickeau    public const DEFAULT_VALUE_ATTRIBUTE = "default";
5004fd306cSNickeau
5104fd306cSNickeau    public const DOMAIN_VALUES_ATTRIBUTE = "domain-values";
5204fd306cSNickeau    public const WIDTH_ATTRIBUTE = "width";
5304fd306cSNickeau    public const CHILDREN_ATTRIBUTE = "children";
5404fd306cSNickeau    const DESCRIPTION_ATTRIBUTE = PageDescription::PROPERTY_NAME;
5504fd306cSNickeau    const NAME_ATTRIBUTE = ResourceName::PROPERTY_NAME;
5604fd306cSNickeau    const MULTIPLE_ATTRIBUTE = "multiple";
5704fd306cSNickeau    const TYPE_ATTRIBUTE = DataType::PROPERTY_NAME;
5804fd306cSNickeau
5904fd306cSNickeau
6004fd306cSNickeau    private $name;
6104fd306cSNickeau    /**
6204fd306cSNickeau     * @var bool
6304fd306cSNickeau     */
6404fd306cSNickeau    private $mutable;
6504fd306cSNickeau    /**
6604fd306cSNickeau     * @var string
6704fd306cSNickeau     */
6804fd306cSNickeau    private $tab;
6904fd306cSNickeau    /**
7004fd306cSNickeau     * @var string
7104fd306cSNickeau     */
7204fd306cSNickeau    private $label;
7304fd306cSNickeau    private $description;
7404fd306cSNickeau    /**
7504fd306cSNickeau     * If canonical is set, an url is also send
7604fd306cSNickeau     */
7704fd306cSNickeau    private string $canonical;
7804fd306cSNickeau    private array $values = [];
7904fd306cSNickeau    private array $defaults = [];
8004fd306cSNickeau    /**
8104fd306cSNickeau     * @var string
8204fd306cSNickeau     */
8304fd306cSNickeau    private $type;
8404fd306cSNickeau    /**
8504fd306cSNickeau     * @var array
8604fd306cSNickeau     */
8704fd306cSNickeau    private $domainValues;
8804fd306cSNickeau    /**
8904fd306cSNickeau     * @var FormMetaField[]
9004fd306cSNickeau     */
9104fd306cSNickeau    private $children;
9204fd306cSNickeau    /**
9304fd306cSNickeau     * @var int
9404fd306cSNickeau     */
9504fd306cSNickeau    private $width;
9604fd306cSNickeau    /**
9704fd306cSNickeau     * Multiple value can be chosen
9804fd306cSNickeau     * @var bool
9904fd306cSNickeau     */
10004fd306cSNickeau    private $multiple = false;
10104fd306cSNickeau
10204fd306cSNickeau
10304fd306cSNickeau    /**
10404fd306cSNickeau     * FormField constructor.
10504fd306cSNickeau     * The name is mandatory
10604fd306cSNickeau     * and the type to be able to control the values
10704fd306cSNickeau     */
10804fd306cSNickeau    public function __construct($name, $type)
10904fd306cSNickeau    {
11004fd306cSNickeau        $this->name = $name;
11104fd306cSNickeau        $this->label = ucfirst($name);
11204fd306cSNickeau        $this->description = $name;
11304fd306cSNickeau        if (!in_array($type, DataType::TYPES)) {
11404fd306cSNickeau            throw new ExceptionRuntimeInternal("The type ($type) is not a known field type");
11504fd306cSNickeau        }
11604fd306cSNickeau        $this->type = $type;
11704fd306cSNickeau        $this->mutable = true;
11804fd306cSNickeau    }
11904fd306cSNickeau
12004fd306cSNickeau    public static function create(string $name, string $type): FormMetaField
12104fd306cSNickeau    {
12204fd306cSNickeau        return new FormMetaField($name, $type);
12304fd306cSNickeau    }
12404fd306cSNickeau
12504fd306cSNickeau    /**
12604fd306cSNickeau     * Almost because a form does not allow hierarchical data
12704fd306cSNickeau     * We send an error in this case
12804fd306cSNickeau     * @param Metadata $metadata
12904fd306cSNickeau     * @return FormMetaField
13004fd306cSNickeau     */
13104fd306cSNickeau    public static function createFromMetadata(Metadata $metadata): FormMetaField
13204fd306cSNickeau    {
13304fd306cSNickeau        $field = FormMetaField::create($metadata->getName(), $metadata->getDataType());
13404fd306cSNickeau
13504fd306cSNickeau        self::setCommonDataToFieldFromMetadata($field, $metadata);
13604fd306cSNickeau
13704fd306cSNickeau        $childrenMetadata = $metadata->getChildrenClass();
13804fd306cSNickeau
13904fd306cSNickeau        try {
14004fd306cSNickeau            $metadata->getParent();
14104fd306cSNickeau        } catch (ExceptionNotFound $e) {
14204fd306cSNickeau            /**
14304fd306cSNickeau             * Only the top field have a tab value
14404fd306cSNickeau             */
14504fd306cSNickeau            $field->setTab($metadata->getTab());
14604fd306cSNickeau        }
14704fd306cSNickeau
14804fd306cSNickeau
14904fd306cSNickeau        /**
15004fd306cSNickeau         * No children
15104fd306cSNickeau         */
15204fd306cSNickeau        if (count($childrenMetadata) === 0) {
15304fd306cSNickeau
15404fd306cSNickeau            static::setLeafDataToFieldFromMetadata($field, $metadata);
15504fd306cSNickeau
15604fd306cSNickeau            /**
15704fd306cSNickeau             * When tabular, the value comes from the parent
15804fd306cSNickeau             */
15904fd306cSNickeau            if ($metadata->isScalar()) {
16004fd306cSNickeau                $value = $metadata->toStoreValue();
16104fd306cSNickeau                $defaultValue = $metadata->toStoreDefaultValue();
16204fd306cSNickeau                $field->addValue($value, $defaultValue);
16304fd306cSNickeau            }
16404fd306cSNickeau
16504fd306cSNickeau        } else {
16604fd306cSNickeau
16704fd306cSNickeau            if ($metadata instanceof MetadataTabular) {
16804fd306cSNickeau
16904fd306cSNickeau                $childFields = [];
17004fd306cSNickeau                foreach ($metadata->getChildrenClass() as $childMetadataClass) {
17104fd306cSNickeau
17204fd306cSNickeau                    try {
17304fd306cSNickeau                        $childMetadata = MetadataSystem::toMetadataObject($childMetadataClass, $metadata);
17404fd306cSNickeau                    } catch (ExceptionBadArgument $e) {
17504fd306cSNickeau                        // should happen only internally
17604fd306cSNickeau                        LogUtility::internalError("The metadata class/object ($childMetadataClass) is not a metadata class");
17704fd306cSNickeau                        continue;
17804fd306cSNickeau                    }
17904fd306cSNickeau                    $childField = FormMetaField::createFromMetadata($childMetadata);
18004fd306cSNickeau                    static::setCommonDataToFieldFromMetadata($childField, $childMetadata);
18104fd306cSNickeau                    static::setLeafDataToFieldFromMetadata($childField, $childMetadata);
18204fd306cSNickeau                    $field->addColumn($childField);
18304fd306cSNickeau                    $childFields[$childMetadata::getPersistentName()] = $childField;
18404fd306cSNickeau                }
18504fd306cSNickeau                try {
18604fd306cSNickeau                    $rows = $metadata->getValue();
18704fd306cSNickeau                } catch (ExceptionNotFound $e) {
18804fd306cSNickeau                    $rows = null;
18904fd306cSNickeau                }
19004fd306cSNickeau                if ($rows !== null) {
19104fd306cSNickeau                    $defaultRow = null;
19204fd306cSNickeau                    try {
19304fd306cSNickeau                        $defaultRows = $metadata->getDefaultValue();
19404fd306cSNickeau                        $defaultRow = $defaultRows[0];
19504fd306cSNickeau                    } catch (ExceptionNotFound $e) {
19604fd306cSNickeau                        // no default row
19704fd306cSNickeau                    }
19804fd306cSNickeau                    foreach ($rows as $row) {
19904fd306cSNickeau                        foreach ($childFields as $childName => $childField) {
200*70bbd7f1Sgerardnico                            $colValue = $row[$childName] ?? null;
20104fd306cSNickeau                            if ($colValue === null) {
20204fd306cSNickeau                                if ($defaultRow === null) {
20304fd306cSNickeau                                    continue;
20404fd306cSNickeau                                }
20504fd306cSNickeau                                $colValue = $defaultRow[$childName];
20604fd306cSNickeau                                if ($colValue === null) {
20704fd306cSNickeau                                    continue;
20804fd306cSNickeau                                }
20904fd306cSNickeau                            }
21004fd306cSNickeau                            $storeValue = $colValue->toStoreValue();
21104fd306cSNickeau                            $defaultStoreValue = $colValue->toStoreDefaultValue();
21204fd306cSNickeau                            $childField->addValue($storeValue, $defaultStoreValue);
21304fd306cSNickeau                        }
21404fd306cSNickeau
21504fd306cSNickeau                    }
21604fd306cSNickeau
21704fd306cSNickeau                    // Add an extra empty row to allow adding an image
21804fd306cSNickeau                    if ($defaultRow !== null) {
21904fd306cSNickeau                        foreach ($defaultRow as $colName => $colMetadata) {
22004fd306cSNickeau                            if ($colName === null) {
22104fd306cSNickeau                                LogUtility::internalError("The persistence name (column name) should be set as key for the default rows");
22204fd306cSNickeau                                continue;
22304fd306cSNickeau                            }
22404fd306cSNickeau                            $defaultColValue = null;
22504fd306cSNickeau                            if ($colMetadata !== null) {
22604fd306cSNickeau                                $defaultColValue = $colMetadata->toStoreDefaultValue();
22704fd306cSNickeau                            }
22804fd306cSNickeau                            $childField = $childFields[$colName];
22904fd306cSNickeau                            $childField->addValue(null, $defaultColValue);
23004fd306cSNickeau                        }
23104fd306cSNickeau                    }
23204fd306cSNickeau                } else {
23304fd306cSNickeau
23404fd306cSNickeau
23504fd306cSNickeau                    // No rows, show the default rows
23604fd306cSNickeau                    try {
23704fd306cSNickeau                        $rows = $metadata->getDefaultValue();
23804fd306cSNickeau                    } catch (ExceptionNotFound $e) {
23904fd306cSNickeau                        // no default row ok
24004fd306cSNickeau                        $rows = [];
24104fd306cSNickeau                    }
24204fd306cSNickeau                    foreach ($rows as $row) {
24304fd306cSNickeau                        foreach ($row as $colName => $colValue) {
24404fd306cSNickeau                            if ($colValue === null) {
24504fd306cSNickeau                                continue;
24604fd306cSNickeau                            }
24704fd306cSNickeau                            $childField = $childFields[$colName];
24804fd306cSNickeau                            $childField->addValue(null, $colValue->toStoreValue());
24904fd306cSNickeau                        }
25004fd306cSNickeau                    }
25104fd306cSNickeau
25204fd306cSNickeau                }
25304fd306cSNickeau
25404fd306cSNickeau
25504fd306cSNickeau            } else {
25604fd306cSNickeau
25704fd306cSNickeau                LogUtility::msg("Hierarchical data is not supported in a form. Metadata ($metadata) has children and is not tabular");
25804fd306cSNickeau            }
25904fd306cSNickeau        }
26004fd306cSNickeau        return $field;
26104fd306cSNickeau
26204fd306cSNickeau    }
26304fd306cSNickeau
26404fd306cSNickeau
26504fd306cSNickeau    public
26604fd306cSNickeau    function toAssociativeArray(): array
26704fd306cSNickeau    {
26804fd306cSNickeau        /**
26904fd306cSNickeau         * Mandatory attributes
27004fd306cSNickeau         */
27104fd306cSNickeau        $associative = [
27204fd306cSNickeau            self::NAME_ATTRIBUTE => $this->name,
27304fd306cSNickeau            self::LABEL_ATTRIBUTE => $this->label,
27404fd306cSNickeau            self::TYPE_ATTRIBUTE => $this->type
27504fd306cSNickeau        ];
27604fd306cSNickeau
27704fd306cSNickeau        try {
27804fd306cSNickeau            $associative[self::URL_ATTRIBUTE] = $this->getUrl()->toString();
27904fd306cSNickeau        } catch (ExceptionNotFound $e) {
28004fd306cSNickeau            // ok
28104fd306cSNickeau        }
28204fd306cSNickeau
28304fd306cSNickeau        if ($this->description != null) {
28404fd306cSNickeau            $associative[self::DESCRIPTION_ATTRIBUTE] = $this->description;
28504fd306cSNickeau        }
28604fd306cSNickeau        /**
28704fd306cSNickeau         * For child form field (ie column), there is no tab
28804fd306cSNickeau         */
28904fd306cSNickeau        if ($this->tab != null) {
29004fd306cSNickeau            $associative[self::TAB_ATTRIBUTE] = $this->tab;
29104fd306cSNickeau        }
29204fd306cSNickeau
29304fd306cSNickeau
29404fd306cSNickeau        if ($this->width !== null) {
29504fd306cSNickeau            $associative[self::WIDTH_ATTRIBUTE] = $this->width;
29604fd306cSNickeau        }
29704fd306cSNickeau        if ($this->children !== null) {
29804fd306cSNickeau            foreach ($this->children as $column) {
29904fd306cSNickeau                $associative[self::CHILDREN_ATTRIBUTE][] = $column->toAssociativeArray();
30004fd306cSNickeau            }
30104fd306cSNickeau        } else {
30204fd306cSNickeau
30304fd306cSNickeau            /**
30404fd306cSNickeau             * Only valid for leaf field
30504fd306cSNickeau             */
30604fd306cSNickeau            if ($this->getValue() !== null && $this->getValue() !== "") {
30704fd306cSNickeau                $associative[self::VALUE_ATTRIBUTE] = $this->getValue();
30804fd306cSNickeau            }
30904fd306cSNickeau
31004fd306cSNickeau            if ($this->getDefaultValue() !== null) {
31104fd306cSNickeau                $associative[self::DEFAULT_VALUE_ATTRIBUTE] = $this->getDefaultValue();
31204fd306cSNickeau            }
31304fd306cSNickeau
31404fd306cSNickeau            if ($this->domainValues !== null) {
31504fd306cSNickeau                $associative[self::DOMAIN_VALUES_ATTRIBUTE] = $this->domainValues;
31604fd306cSNickeau                if ($this->multiple) {
31704fd306cSNickeau                    $associative[self::MULTIPLE_ATTRIBUTE] = $this->multiple;
31804fd306cSNickeau                }
31904fd306cSNickeau            }
32004fd306cSNickeau
32104fd306cSNickeau            $associative[self::MUTABLE_ATTRIBUTE] = $this->mutable;
32204fd306cSNickeau
32304fd306cSNickeau
32404fd306cSNickeau        }
32504fd306cSNickeau
32604fd306cSNickeau
32704fd306cSNickeau        return $associative;
32804fd306cSNickeau    }
32904fd306cSNickeau
33004fd306cSNickeau    public
33104fd306cSNickeau    function setMutable(bool $bool): FormMetaField
33204fd306cSNickeau    {
33304fd306cSNickeau        $this->mutable = $bool;
33404fd306cSNickeau        return $this;
33504fd306cSNickeau    }
33604fd306cSNickeau
33704fd306cSNickeau
33804fd306cSNickeau    public
33904fd306cSNickeau    function setTab(string $tabName): FormMetaField
34004fd306cSNickeau    {
34104fd306cSNickeau        Html::validNameGuard($tabName);
34204fd306cSNickeau        $this->tab = $tabName;
34304fd306cSNickeau        return $this;
34404fd306cSNickeau    }
34504fd306cSNickeau
34604fd306cSNickeau    public
34704fd306cSNickeau    function setLabel(string $label): FormMetaField
34804fd306cSNickeau    {
34904fd306cSNickeau        $this->label = $label;
35004fd306cSNickeau        return $this;
35104fd306cSNickeau    }
35204fd306cSNickeau
35304fd306cSNickeau    /**
35404fd306cSNickeau     * @throws ExceptionNotFound
35504fd306cSNickeau     */
35604fd306cSNickeau    public
35704fd306cSNickeau    function getUrl(): Url
35804fd306cSNickeau    {
35904fd306cSNickeau        if (!isset($this->canonical)) {
36004fd306cSNickeau            throw new ExceptionNotFound();
36104fd306cSNickeau        }
36204fd306cSNickeau
36304fd306cSNickeau        return Canonical::createFromValue($this->canonical)
36404fd306cSNickeau            ->getComboStrapUrlForDocumentation();
36504fd306cSNickeau
36604fd306cSNickeau    }
36704fd306cSNickeau
36804fd306cSNickeau    public
36904fd306cSNickeau    function setCanonical(string $canonical): FormMetaField
37004fd306cSNickeau    {
37104fd306cSNickeau        $this->canonical = $canonical;
37204fd306cSNickeau        return $this;
37304fd306cSNickeau    }
37404fd306cSNickeau
37504fd306cSNickeau    public
37604fd306cSNickeau    function setDescription(string $string): FormMetaField
37704fd306cSNickeau    {
37804fd306cSNickeau        $this->description = $string;
37904fd306cSNickeau        return $this;
38004fd306cSNickeau    }
38104fd306cSNickeau
38204fd306cSNickeau    /**
38304fd306cSNickeau     * @param boolean|string|null $value
38404fd306cSNickeau     * @param boolean|string|null $defaultValuePlaceholderOrReturned - the value set as placeholder or return value for a checked checkbox
38504fd306cSNickeau     * @return $this
38604fd306cSNickeau     */
38704fd306cSNickeau    public
38804fd306cSNickeau    function addValue($value, $defaultValuePlaceholderOrReturned = null): FormMetaField
38904fd306cSNickeau    {
39004fd306cSNickeau        if ($this->getType() === DataType::BOOLEAN_TYPE_VALUE) {
39104fd306cSNickeau            if ($value != null && !DataType::isBoolean($value)) {
39204fd306cSNickeau                throw new ExceptionRuntimeInternal("The value ($value) is not a boolean");
39304fd306cSNickeau            }
39404fd306cSNickeau            if ($defaultValuePlaceholderOrReturned != null && !DataType::isBoolean($defaultValuePlaceholderOrReturned)) {
39504fd306cSNickeau                throw new ExceptionRuntimeInternal("The default value ($defaultValuePlaceholderOrReturned) is not a boolean");
39604fd306cSNickeau            }
39704fd306cSNickeau        }
39804fd306cSNickeau        $this->values[] = $value;
39904fd306cSNickeau        $this->defaults[] = $defaultValuePlaceholderOrReturned;
40004fd306cSNickeau        return $this;
40104fd306cSNickeau    }
40204fd306cSNickeau
40304fd306cSNickeau
40404fd306cSNickeau    public
40504fd306cSNickeau    function setDomainValues(array $domainValues): FormMetaField
40604fd306cSNickeau    {
40704fd306cSNickeau        $this->domainValues = $domainValues;
40804fd306cSNickeau        return $this;
40904fd306cSNickeau    }
41004fd306cSNickeau
41104fd306cSNickeau    public
41204fd306cSNickeau    function addColumn(FormMetaField $formField): FormMetaField
41304fd306cSNickeau    {
41404fd306cSNickeau        $this->type = DataType::TABULAR_TYPE_VALUE;
41504fd306cSNickeau        // A parent node is not mutable
41604fd306cSNickeau        $this->mutable = false;
41704fd306cSNickeau        $this->children[] = $formField;
41804fd306cSNickeau        return $this;
41904fd306cSNickeau    }
42004fd306cSNickeau
42104fd306cSNickeau    public
42204fd306cSNickeau    function setWidth(int $int): FormMetaField
42304fd306cSNickeau    {
42404fd306cSNickeau        $this->width = $int;
42504fd306cSNickeau        return $this;
42604fd306cSNickeau    }
42704fd306cSNickeau
42804fd306cSNickeau    public
42904fd306cSNickeau    function getTab(): string
43004fd306cSNickeau    {
43104fd306cSNickeau        return $this->tab;
43204fd306cSNickeau    }
43304fd306cSNickeau
43404fd306cSNickeau    public
43504fd306cSNickeau    function getName()
43604fd306cSNickeau    {
43704fd306cSNickeau        return $this->name;
43804fd306cSNickeau    }
43904fd306cSNickeau
44004fd306cSNickeau    public
44104fd306cSNickeau    function getValue()
44204fd306cSNickeau    {
44304fd306cSNickeau        switch (sizeof($this->values)) {
44404fd306cSNickeau            case 0:
44504fd306cSNickeau                return null;
44604fd306cSNickeau            case 1:
44704fd306cSNickeau                $value = $this->values[0];
44804fd306cSNickeau                if ($value !== null) {
44904fd306cSNickeau                    return $this->values[0];
45004fd306cSNickeau                }
45104fd306cSNickeau                return null;
45204fd306cSNickeau            default:
45304fd306cSNickeau                return $this->values;
45404fd306cSNickeau        }
45504fd306cSNickeau    }
45604fd306cSNickeau
45704fd306cSNickeau    public
45804fd306cSNickeau    function isMutable(): bool
45904fd306cSNickeau    {
46004fd306cSNickeau        return $this->mutable;
46104fd306cSNickeau    }
46204fd306cSNickeau
46304fd306cSNickeau    public
46404fd306cSNickeau    function getChildren(): ?array
46504fd306cSNickeau    {
46604fd306cSNickeau        return $this->children;
46704fd306cSNickeau    }
46804fd306cSNickeau
46904fd306cSNickeau    public
47004fd306cSNickeau    function getType(): string
47104fd306cSNickeau    {
47204fd306cSNickeau        return $this->type;
47304fd306cSNickeau    }
47404fd306cSNickeau
47504fd306cSNickeau    public
47604fd306cSNickeau    function getDefaultValue()
47704fd306cSNickeau    {
47804fd306cSNickeau        switch (sizeof($this->defaults)) {
47904fd306cSNickeau            case 0:
48004fd306cSNickeau                return null;
48104fd306cSNickeau            case 1:
48204fd306cSNickeau                $value = $this->defaults[0];
48304fd306cSNickeau                if ($value !== null) {
48404fd306cSNickeau                    return $value;
48504fd306cSNickeau                }
48604fd306cSNickeau                return null;
48704fd306cSNickeau            default:
48804fd306cSNickeau                return $this->defaults;
48904fd306cSNickeau        }
49004fd306cSNickeau    }
49104fd306cSNickeau
49204fd306cSNickeau    public
49304fd306cSNickeau    function setMultiple(bool $bool): FormMetaField
49404fd306cSNickeau    {
49504fd306cSNickeau        $this->multiple = $bool;
49604fd306cSNickeau        return $this;
49704fd306cSNickeau    }
49804fd306cSNickeau
49904fd306cSNickeau    public
50004fd306cSNickeau    function isMultiple(): bool
50104fd306cSNickeau    {
50204fd306cSNickeau        return $this->multiple;
50304fd306cSNickeau    }
50404fd306cSNickeau
50504fd306cSNickeau    /**
50604fd306cSNickeau     * If this is a scalar value, you can set/overwrite the value
50704fd306cSNickeau     * with this function
50804fd306cSNickeau     * @param $value
50904fd306cSNickeau     * @param null $default
51004fd306cSNickeau     * @return $this
51104fd306cSNickeau     */
51204fd306cSNickeau    public
51304fd306cSNickeau    function setValue($value, $default = null): FormMetaField
51404fd306cSNickeau    {
51504fd306cSNickeau        $this->values = [];
51604fd306cSNickeau        $this->defaults = [];
51704fd306cSNickeau        return $this->addValue($value, $default);
51804fd306cSNickeau
51904fd306cSNickeau    }
52004fd306cSNickeau
52104fd306cSNickeau    /**
52204fd306cSNickeau     * Common metadata to all field from a leaf to a tabular
52304fd306cSNickeau     * @param FormMetaField $field
52404fd306cSNickeau     * @param Metadata $metadata
52504fd306cSNickeau     */
52604fd306cSNickeau    private
52704fd306cSNickeau    static
52804fd306cSNickeau    function setCommonDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata)
52904fd306cSNickeau    {
53004fd306cSNickeau        $field
53104fd306cSNickeau            ->setCanonical($metadata->getCanonical())
53204fd306cSNickeau            ->setLabel($metadata->getLabel())
53304fd306cSNickeau            ->setDescription($metadata->getDescription());
53404fd306cSNickeau    }
53504fd306cSNickeau
53604fd306cSNickeau    /**
53704fd306cSNickeau     * @param FormMetaField $field
53804fd306cSNickeau     * @param Metadata $metadata
53904fd306cSNickeau     * Add the field metadata that are only available for leaf metadata
54004fd306cSNickeau     */
54104fd306cSNickeau    private
54204fd306cSNickeau    static
54304fd306cSNickeau    function setLeafDataToFieldFromMetadata(FormMetaField $field, Metadata $metadata)
54404fd306cSNickeau    {
54504fd306cSNickeau        $field->setMutable($metadata->isMutable());
54604fd306cSNickeau
54704fd306cSNickeau        $formControlWidth = $metadata->getFormControlWidth();
54804fd306cSNickeau        if ($formControlWidth !== null) {
54904fd306cSNickeau            $field->setWidth($formControlWidth);
55004fd306cSNickeau        }
55104fd306cSNickeau        $possibleValues = $metadata->getPossibleValues();
55204fd306cSNickeau        if ($possibleValues !== null) {
55304fd306cSNickeau            $field->setDomainValues($possibleValues);
55404fd306cSNickeau            if ($metadata instanceof MetadataMultiple) {
55504fd306cSNickeau                $field->setMultiple(true);
55604fd306cSNickeau            }
55704fd306cSNickeau        }
55804fd306cSNickeau
55904fd306cSNickeau    }
56004fd306cSNickeau
56104fd306cSNickeau    public function __toString()
56204fd306cSNickeau    {
56304fd306cSNickeau        return $this->getName();
56404fd306cSNickeau    }
56504fd306cSNickeau
56604fd306cSNickeau
56704fd306cSNickeau}
568