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