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