1 <?php
2 
3 
4 namespace ComboStrap\Meta\Api;
5 
6 use ComboStrap\DataType;
7 use ComboStrap\ExceptionBadArgument;
8 use ComboStrap\ExceptionCompile;
9 use ComboStrap\ExceptionNotFound;
10 use ComboStrap\LogUtility;
11 
12 /**
13  * Implement all default method for a text metadata (ie small string without any paragraph such as name, title, ...)
14  * Class MetadataText
15  * @package ComboStrap
16  */
17 abstract class MetadataText extends Metadata
18 {
19 
20     /**
21      * @var string|null
22      */
23     protected $value;
24 
25 
26     public static function getDataType(): string
27     {
28         return DataType::TEXT_TYPE_VALUE;
29     }
30 
31     public function getValue(): string
32     {
33         $this->buildCheck();
34         /**
35          * null or empty string is considered not found
36          */
37         if ($this->value === null || trim($this->value) === "") {
38             throw new ExceptionNotFound("The value was not found for the metadata ($this)");
39         }
40         return $this->value;
41     }
42 
43     public function valueIsNotNull(): bool
44     {
45         return $this->value !== null;
46     }
47 
48 
49     /**
50      * @param null|string $value
51      * @return $this
52      * @throws ExceptionBadArgument
53      */
54     public function setValue($value): Metadata
55     {
56         if ($value !== null && !is_string($value)) {
57             throw new ExceptionBadArgument("The value of the metadata ($this) is not a string", $this->getCanonical());
58         }
59         $value = trim($value);
60         if ($value === "") {
61             /**
62              * TODO: move this into the function {@link MetadataText::setFromStoreValueWithoutException()} ??
63              *   form don't return null only empty string
64              *   equivalent to null
65              */
66             return $this;
67         }
68         $possibleValues = $this->getPossibleValues();
69         if ($possibleValues !== null) {
70             if (!in_array($value, $possibleValues)) {
71                 throw new ExceptionBadArgument("The value ($value) for the metadata ({$this->getName()}) is not one of the possible following values: " . implode(", ", $possibleValues) . ".");
72             }
73         }
74         $this->value = $value;
75         return $this;
76 
77     }
78 
79     /**
80      * @throws ExceptionCompile
81      */
82     public function setFromStoreValue($value): Metadata
83     {
84         return $this->setValue($value);
85     }
86 
87     public function setFromStoreValueWithoutException($value): Metadata
88     {
89         if (empty($value)) {
90             $this->value = null;
91             return $this;
92         }
93         if (!is_string($value)) {
94             LogUtility::msg("This value of a text metadata is not a string. " . var_export($value, true));
95             return $this;
96         }
97         $this->value = $value;
98         return $this;
99     }
100 
101     public function getDefaultValue()
102     {
103         return null;
104     }
105 
106 
107 }
108