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