xref: /plugin/combo/ComboStrap/Meta/Api/MetadataBoolean.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\ExceptionCompile;
9*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
10*04fd306cSNickeauuse ComboStrap\ExceptionRuntime;
11*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
12*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
13*04fd306cSNickeauuse ComboStrap\MetadataFormDataStore;
14*04fd306cSNickeau
15*04fd306cSNickeau/**
16*04fd306cSNickeau * Class MetadataBoolean
17*04fd306cSNickeau * @package ComboStrap
18*04fd306cSNickeau */
19*04fd306cSNickeauabstract class MetadataBoolean extends Metadata
20*04fd306cSNickeau{
21*04fd306cSNickeau
22*04fd306cSNickeau    /**
23*04fd306cSNickeau     * @var bool|null
24*04fd306cSNickeau     */
25*04fd306cSNickeau    protected $value;
26*04fd306cSNickeau
27*04fd306cSNickeau    static public function getDataType(): string
28*04fd306cSNickeau    {
29*04fd306cSNickeau        return DataType::BOOLEAN_TYPE_VALUE;
30*04fd306cSNickeau    }
31*04fd306cSNickeau
32*04fd306cSNickeau    /**
33*04fd306cSNickeau     * @return bool
34*04fd306cSNickeau     * @throws ExceptionNotFound
35*04fd306cSNickeau     */
36*04fd306cSNickeau    public function getValue(): bool
37*04fd306cSNickeau    {
38*04fd306cSNickeau        $this->buildCheck();
39*04fd306cSNickeau        if ($this->value === null) {
40*04fd306cSNickeau            throw new ExceptionNotFound("No ($this) found");
41*04fd306cSNickeau        }
42*04fd306cSNickeau        return $this->value;
43*04fd306cSNickeau    }
44*04fd306cSNickeau
45*04fd306cSNickeau
46*04fd306cSNickeau    /**
47*04fd306cSNickeau     * @param null|boolean $value
48*04fd306cSNickeau     * @return Metadata
49*04fd306cSNickeau     */
50*04fd306cSNickeau    public function setValue($value): Metadata
51*04fd306cSNickeau    {
52*04fd306cSNickeau        if ($value === null) {
53*04fd306cSNickeau            $this->value = null;
54*04fd306cSNickeau            return $this;
55*04fd306cSNickeau        }
56*04fd306cSNickeau        if (!is_bool($value)) {
57*04fd306cSNickeau            throw new ExceptionRuntime("The value is not a boolean: " . var_export($value, true));
58*04fd306cSNickeau        }
59*04fd306cSNickeau        $this->value = $value;
60*04fd306cSNickeau        return $this;
61*04fd306cSNickeau    }
62*04fd306cSNickeau
63*04fd306cSNickeau    public function toStoreDefaultValue()
64*04fd306cSNickeau    {
65*04fd306cSNickeau        $store = $this->getWriteStore();
66*04fd306cSNickeau
67*04fd306cSNickeau        if ($store instanceof MetadataFormDataStore) {
68*04fd306cSNickeau            /**
69*04fd306cSNickeau             * In a boolean form field, the data is returned only when the field is checked.
70*04fd306cSNickeau             *
71*04fd306cSNickeau             * By default, this is not checked, therefore, the default value is when this is not the default.
72*04fd306cSNickeau             * It means that this is the inverse of the default value
73*04fd306cSNickeau             */
74*04fd306cSNickeau            try {
75*04fd306cSNickeau                return !$this->getDefaultValue();
76*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
77*04fd306cSNickeau                return null;
78*04fd306cSNickeau            }
79*04fd306cSNickeau
80*04fd306cSNickeau        }
81*04fd306cSNickeau        return parent::toStoreDefaultValue();
82*04fd306cSNickeau    }
83*04fd306cSNickeau
84*04fd306cSNickeau
85*04fd306cSNickeau    /**
86*04fd306cSNickeau     * @return bool|string|null
87*04fd306cSNickeau     */
88*04fd306cSNickeau    public function toStoreValue()
89*04fd306cSNickeau    {
90*04fd306cSNickeau
91*04fd306cSNickeau        $store = $this->getWriteStore();
92*04fd306cSNickeau        try {
93*04fd306cSNickeau            $value = $this->getValue();
94*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
95*04fd306cSNickeau            return null;
96*04fd306cSNickeau        }
97*04fd306cSNickeau
98*04fd306cSNickeau        if ($store instanceof MetadataFormDataStore) {
99*04fd306cSNickeau            return $value;
100*04fd306cSNickeau        }
101*04fd306cSNickeau
102*04fd306cSNickeau        if ($store instanceof MetadataDokuWikiStore) {
103*04fd306cSNickeau            // The store modify it
104*04fd306cSNickeau            return $value;
105*04fd306cSNickeau        }
106*04fd306cSNickeau
107*04fd306cSNickeau        if ($store->isHierarchicalTextBased()) {
108*04fd306cSNickeau            $value = DataType::toBooleanString($value);
109*04fd306cSNickeau        }
110*04fd306cSNickeau
111*04fd306cSNickeau        return $value;
112*04fd306cSNickeau
113*04fd306cSNickeau    }
114*04fd306cSNickeau
115*04fd306cSNickeau    /**
116*04fd306cSNickeau     * @throws ExceptionCompile
117*04fd306cSNickeau     */
118*04fd306cSNickeau    public
119*04fd306cSNickeau    function setFromStoreValue($value): Metadata
120*04fd306cSNickeau    {
121*04fd306cSNickeau        $value = $this->toBoolean($value);
122*04fd306cSNickeau        return $this->setValue($value);
123*04fd306cSNickeau    }
124*04fd306cSNickeau
125*04fd306cSNickeau
126*04fd306cSNickeau    public
127*04fd306cSNickeau    function valueIsNotNull(): bool
128*04fd306cSNickeau    {
129*04fd306cSNickeau        return $this->value !== null;
130*04fd306cSNickeau    }
131*04fd306cSNickeau
132*04fd306cSNickeau    public
133*04fd306cSNickeau    function setFromStoreValueWithoutException($value): Metadata
134*04fd306cSNickeau    {
135*04fd306cSNickeau        $this->value = $this->toBoolean($value);
136*04fd306cSNickeau        return $this;
137*04fd306cSNickeau    }
138*04fd306cSNickeau
139*04fd306cSNickeau    private
140*04fd306cSNickeau    function toBoolean($value): ?bool
141*04fd306cSNickeau    {
142*04fd306cSNickeau        /**
143*04fd306cSNickeau         * TODO: There is no validation
144*04fd306cSNickeau         * If the value is not a boolean, the return value is false ...
145*04fd306cSNickeau         */
146*04fd306cSNickeau        return DataType::toBoolean($value);
147*04fd306cSNickeau
148*04fd306cSNickeau    }
149*04fd306cSNickeau
150*04fd306cSNickeau
151*04fd306cSNickeau}
152