1*c3437056SNickeau<?php 2*c3437056SNickeau 3*c3437056SNickeau 4*c3437056SNickeaunamespace ComboStrap; 5*c3437056SNickeau 6*c3437056SNickeau 7*c3437056SNickeau/** 8*c3437056SNickeau * Class MetadataArrayStore 9*c3437056SNickeau * @package ComboStrap 10*c3437056SNickeau * A store based on a single array for a single resource 11*c3437056SNickeau */ 12*c3437056SNickeauabstract class MetadataSingleArrayStore extends MetadataStoreAbs 13*c3437056SNickeau{ 14*c3437056SNickeau 15*c3437056SNickeau 16*c3437056SNickeau /** 17*c3437056SNickeau * @var bool 18*c3437056SNickeau */ 19*c3437056SNickeau protected $hasChanged = false; 20*c3437056SNickeau 21*c3437056SNickeau protected $data; 22*c3437056SNickeau 23*c3437056SNickeau /** 24*c3437056SNickeau * MetadataSingleArrayStore constructor. 25*c3437056SNickeau * @param ResourceCombo $page 26*c3437056SNickeau * @param $data 27*c3437056SNickeau */ 28*c3437056SNickeau public function __construct(ResourceCombo $page, $data = null) 29*c3437056SNickeau { 30*c3437056SNickeau if($data!==null) { 31*c3437056SNickeau foreach ($data as $key => $value) { 32*c3437056SNickeau $key = $this->toNormalizedKey($key); 33*c3437056SNickeau $this->data[$key] = $value; 34*c3437056SNickeau } 35*c3437056SNickeau } 36*c3437056SNickeau parent::__construct($page); 37*c3437056SNickeau } 38*c3437056SNickeau 39*c3437056SNickeau 40*c3437056SNickeau public function set(Metadata $metadata) 41*c3437056SNickeau { 42*c3437056SNickeau $this->checkResource($metadata->getResource()); 43*c3437056SNickeau $this->setFromPersistentName($metadata::getPersistentName(), $metadata->toStoreValue()); 44*c3437056SNickeau } 45*c3437056SNickeau 46*c3437056SNickeau public function get(Metadata $metadata, $default = null) 47*c3437056SNickeau { 48*c3437056SNickeau $this->checkResource($metadata->getResource()); 49*c3437056SNickeau $value = $this->data[$metadata::getPersistentName()]; 50*c3437056SNickeau if ($value !== null) { 51*c3437056SNickeau return $value; 52*c3437056SNickeau } 53*c3437056SNickeau foreach ($metadata::getOldPersistentNames() as $name) { 54*c3437056SNickeau $value = $this->data[$name]; 55*c3437056SNickeau if ($value !== null) { 56*c3437056SNickeau $this->data[$metadata::getPersistentName()] = $value; 57*c3437056SNickeau unset($this->data[$name]); 58*c3437056SNickeau return $value; 59*c3437056SNickeau } 60*c3437056SNickeau } 61*c3437056SNickeau return $default; 62*c3437056SNickeau } 63*c3437056SNickeau 64*c3437056SNickeau public function persist() 65*c3437056SNickeau { 66*c3437056SNickeau if (PluginUtility::isDevOrTest()) { 67*c3437056SNickeau throw new ExceptionComboRuntime("Not yet implemented, use sendToStore"); 68*c3437056SNickeau } 69*c3437056SNickeau } 70*c3437056SNickeau 71*c3437056SNickeau public function isHierarchicalTextBased(): bool 72*c3437056SNickeau { 73*c3437056SNickeau return true; 74*c3437056SNickeau } 75*c3437056SNickeau 76*c3437056SNickeau 77*c3437056SNickeau public function getData(): ?array 78*c3437056SNickeau { 79*c3437056SNickeau return $this->data; 80*c3437056SNickeau } 81*c3437056SNickeau 82*c3437056SNickeau 83*c3437056SNickeau public function reset() 84*c3437056SNickeau { 85*c3437056SNickeau $this->data = null; 86*c3437056SNickeau } 87*c3437056SNickeau 88*c3437056SNickeau public function getFromPersistentName(string $name, $default = null) 89*c3437056SNickeau { 90*c3437056SNickeau 91*c3437056SNickeau $value = $this->data[$name]; 92*c3437056SNickeau if ($value !== null) { 93*c3437056SNickeau return $value; 94*c3437056SNickeau } 95*c3437056SNickeau return $default; 96*c3437056SNickeau } 97*c3437056SNickeau 98*c3437056SNickeau public function setFromPersistentName(string $name, $value) 99*c3437056SNickeau { 100*c3437056SNickeau $actualValue = $this->data[$name]; 101*c3437056SNickeau if ($actualValue !== $value) { 102*c3437056SNickeau $this->hasChanged = true; 103*c3437056SNickeau } 104*c3437056SNickeau 105*c3437056SNickeau $name = $this->toNormalizedKey($name); 106*c3437056SNickeau if ($value === null || $value === "") { 107*c3437056SNickeau // remove 108*c3437056SNickeau unset($this->data[$name]); 109*c3437056SNickeau return; 110*c3437056SNickeau } 111*c3437056SNickeau $this->data[$name] = $value; 112*c3437056SNickeau 113*c3437056SNickeau } 114*c3437056SNickeau 115*c3437056SNickeau 116*c3437056SNickeau public function hasProperty(string $name): bool 117*c3437056SNickeau { 118*c3437056SNickeau return isset($this->data[$name]); 119*c3437056SNickeau } 120*c3437056SNickeau 121*c3437056SNickeau public function remove(Metadata $metadata): MetadataSingleArrayStore 122*c3437056SNickeau { 123*c3437056SNickeau $this->checkResource($metadata->getResource()); 124*c3437056SNickeau $this->setFromPersistentName($metadata->getName(), null); 125*c3437056SNickeau return $this; 126*c3437056SNickeau } 127*c3437056SNickeau 128*c3437056SNickeau private function toNormalizedKey(string $key): string 129*c3437056SNickeau { 130*c3437056SNickeau return trim($key); 131*c3437056SNickeau } 132*c3437056SNickeau 133*c3437056SNickeau /** 134*c3437056SNickeau * Used to update the data from an other external process 135*c3437056SNickeau * (ie 136*c3437056SNickeau * {@link MetadataDokuWikiStore::renderAndPersist() metadata renderer} 137*c3437056SNickeau * or {@link \action_plugin_combo_metamanager::handleViewerPost() metadata manager 138*c3437056SNickeau * ) 139*c3437056SNickeau * @param $data 140*c3437056SNickeau */ 141*c3437056SNickeau public function setData($data) 142*c3437056SNickeau { 143*c3437056SNickeau if ($data !== $this->data) { 144*c3437056SNickeau $this->hasChanged = true; 145*c3437056SNickeau } 146*c3437056SNickeau $this->data = $data; 147*c3437056SNickeau } 148*c3437056SNickeau 149*c3437056SNickeau /** 150*c3437056SNickeau * @return bool - true if the data has changed 151*c3437056SNickeau */ 152*c3437056SNickeau public function hasStateChanged(): bool 153*c3437056SNickeau { 154*c3437056SNickeau return $this->hasChanged; 155*c3437056SNickeau } 156*c3437056SNickeau 157*c3437056SNickeau} 158