xref: /plugin/combo/ComboStrap/Meta/Api/MetadataMultiple.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeaunamespace ComboStrap\Meta\Api;
5*04fd306cSNickeau
6*04fd306cSNickeau
7*04fd306cSNickeauuse ComboStrap\DataType;
8*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
9*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
10*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
11*04fd306cSNickeauuse ComboStrap\LogUtility;
12*04fd306cSNickeau
13*04fd306cSNickeau/**
14*04fd306cSNickeau * @package ComboStrap
15*04fd306cSNickeau * A list of value metadata
16*04fd306cSNickeau *   * Multiple select if the possible values are set
17*04fd306cSNickeau *   * Text with a {@link  MetadataMultiple::getStringSeparator() separator}
18*04fd306cSNickeau * Ie:
19*04fd306cSNickeau *   * keyword1, keyword2
20*04fd306cSNickeau *   * usage1, usage2, ...
21*04fd306cSNickeau *
22*04fd306cSNickeau * By default, the data type is text, if number, the implementation should overwrite the {@link MetadataMultiple::getDataType()}
23*04fd306cSNickeau */
24*04fd306cSNickeauabstract class MetadataMultiple extends Metadata
25*04fd306cSNickeau{
26*04fd306cSNickeau
27*04fd306cSNickeau    /**
28*04fd306cSNickeau     * @var array|null
29*04fd306cSNickeau     */
30*04fd306cSNickeau    protected ?array $array = null;
31*04fd306cSNickeau
32*04fd306cSNickeau
33*04fd306cSNickeau    /**
34*04fd306cSNickeau     * @param null|array $value
35*04fd306cSNickeau     * @return Metadata
36*04fd306cSNickeau     * @throws ExceptionCompile
37*04fd306cSNickeau     */
38*04fd306cSNickeau    public function setValue($value): Metadata
39*04fd306cSNickeau    {
40*04fd306cSNickeau        if ($value === null) {
41*04fd306cSNickeau            $this->array = $value;
42*04fd306cSNickeau            return $this;
43*04fd306cSNickeau        }
44*04fd306cSNickeau        if (!is_array($value)) {
45*04fd306cSNickeau            throw new ExceptionCompile("The value is not an array. Value: " . var_export($value, true));
46*04fd306cSNickeau        }
47*04fd306cSNickeau        $this->array = $value;
48*04fd306cSNickeau        return $this;
49*04fd306cSNickeau    }
50*04fd306cSNickeau
51*04fd306cSNickeau    static     public function getDataType(): string
52*04fd306cSNickeau    {
53*04fd306cSNickeau        return DataType::TEXT_TYPE_VALUE;
54*04fd306cSNickeau    }
55*04fd306cSNickeau
56*04fd306cSNickeau    public function getValue(): array
57*04fd306cSNickeau    {
58*04fd306cSNickeau        $this->buildCheck();
59*04fd306cSNickeau        if ($this->array === null) {
60*04fd306cSNickeau            throw new ExceptionNotFound("No multiple values was found");
61*04fd306cSNickeau        }
62*04fd306cSNickeau        return $this->array;
63*04fd306cSNickeau    }
64*04fd306cSNickeau
65*04fd306cSNickeau    public function getDefaultValue()
66*04fd306cSNickeau    {
67*04fd306cSNickeau        throw new ExceptionNotFound("No default multiples value");
68*04fd306cSNickeau    }
69*04fd306cSNickeau
70*04fd306cSNickeau    /**
71*04fd306cSNickeau     * @throws ExceptionNotFound
72*04fd306cSNickeau     */
73*04fd306cSNickeau    public function getValueOrDefaults(): array
74*04fd306cSNickeau    {
75*04fd306cSNickeau        try {
76*04fd306cSNickeau            return $this->getValue();
77*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
78*04fd306cSNickeau            return $this->getDefaultValue();
79*04fd306cSNickeau        }
80*04fd306cSNickeau    }
81*04fd306cSNickeau
82*04fd306cSNickeau
83*04fd306cSNickeau    public function valueIsNotNull(): bool
84*04fd306cSNickeau    {
85*04fd306cSNickeau        return $this->array !== null;
86*04fd306cSNickeau    }
87*04fd306cSNickeau
88*04fd306cSNickeau    public function toStoreValue()
89*04fd306cSNickeau    {
90*04fd306cSNickeau        $this->buildCheck();
91*04fd306cSNickeau        if ($this->array === null) {
92*04fd306cSNickeau            return null;
93*04fd306cSNickeau        }
94*04fd306cSNickeau        return implode($this->getStringSeparator(), $this->array);
95*04fd306cSNickeau    }
96*04fd306cSNickeau
97*04fd306cSNickeau    public function toStoreDefaultValue()
98*04fd306cSNickeau    {
99*04fd306cSNickeau        try {
100*04fd306cSNickeau            $defaultValue = $this->getDefaultValue();
101*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
102*04fd306cSNickeau            return null;
103*04fd306cSNickeau        }
104*04fd306cSNickeau        return implode($this->getStringSeparator(), $defaultValue);
105*04fd306cSNickeau    }
106*04fd306cSNickeau
107*04fd306cSNickeau
108*04fd306cSNickeau    /**
109*04fd306cSNickeau     * @return string - the separator used when we receive or store/send an element
110*04fd306cSNickeau     */
111*04fd306cSNickeau    function getStringSeparator(): string
112*04fd306cSNickeau    {
113*04fd306cSNickeau        return ",";
114*04fd306cSNickeau    }
115*04fd306cSNickeau
116*04fd306cSNickeau    /**
117*04fd306cSNickeau     * @throws ExceptionBadArgument
118*04fd306cSNickeau     */
119*04fd306cSNickeau    public function setFromStoreValue($value): Metadata
120*04fd306cSNickeau    {
121*04fd306cSNickeau        $values = $this->toArrayOrNull($value);
122*04fd306cSNickeau        if ($values === null) {
123*04fd306cSNickeau            return $this;
124*04fd306cSNickeau        }
125*04fd306cSNickeau        $possibleValues = $this->getPossibleValues();
126*04fd306cSNickeau        if ($possibleValues !== null) {
127*04fd306cSNickeau            foreach ($values as $value) {
128*04fd306cSNickeau                if (!in_array($value, $possibleValues)) {
129*04fd306cSNickeau                    throw new ExceptionBadArgument("The value ($value) for ($this) is not a possible value (" . implode(",", $possibleValues) . ")", $this->getCanonical());
130*04fd306cSNickeau                }
131*04fd306cSNickeau            }
132*04fd306cSNickeau        }
133*04fd306cSNickeau        $this->array = $values;
134*04fd306cSNickeau        return $this;
135*04fd306cSNickeau    }
136*04fd306cSNickeau
137*04fd306cSNickeau    /**
138*04fd306cSNickeau     * @throws ExceptionBadArgument
139*04fd306cSNickeau     */
140*04fd306cSNickeau    protected function toArrayOrNull($value): ?array
141*04fd306cSNickeau    {
142*04fd306cSNickeau        /**
143*04fd306cSNickeau         * Empty String is the default for HTML form
144*04fd306cSNickeau         */
145*04fd306cSNickeau        if ($value === null || $value === "") {
146*04fd306cSNickeau            return null;
147*04fd306cSNickeau        }
148*04fd306cSNickeau
149*04fd306cSNickeau        /**
150*04fd306cSNickeau         * Array
151*04fd306cSNickeau         */
152*04fd306cSNickeau        if (is_array($value)) {
153*04fd306cSNickeau            return $value;
154*04fd306cSNickeau        }
155*04fd306cSNickeau
156*04fd306cSNickeau        /**
157*04fd306cSNickeau         * String
158*04fd306cSNickeau         */
159*04fd306cSNickeau        if (!is_string($value)) {
160*04fd306cSNickeau            throw new ExceptionBadArgument("The value for $this is not an array, nor a string (value: $value)", get_class($this));
161*04fd306cSNickeau        }
162*04fd306cSNickeau        $stringSeparator = $this->getStringSeparator();
163*04fd306cSNickeau        return explode($stringSeparator, $value);
164*04fd306cSNickeau
165*04fd306cSNickeau    }
166*04fd306cSNickeau
167*04fd306cSNickeau
168*04fd306cSNickeau    public function setFromStoreValueWithoutException($value): Metadata
169*04fd306cSNickeau    {
170*04fd306cSNickeau        try {
171*04fd306cSNickeau            $this->array = $this->toArrayOrNull($value);
172*04fd306cSNickeau        } catch (ExceptionCompile $e) {
173*04fd306cSNickeau            LogUtility::msg($e->getMessage(), $e->getCanonical());
174*04fd306cSNickeau        }
175*04fd306cSNickeau        return $this;
176*04fd306cSNickeau
177*04fd306cSNickeau    }
178*04fd306cSNickeau}
179