1c3437056SNickeau<?php 2c3437056SNickeau 3c3437056SNickeau 4c3437056SNickeaunamespace ComboStrap; 5c3437056SNickeau 6c3437056SNickeau 704fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 804fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore; 904fd306cSNickeauuse ComboStrap\Meta\Api\MetadataStoreAbs; 1004fd306cSNickeau 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 */ 2304fd306cSNickeau protected bool $hasChanged = false; 24c3437056SNickeau 2504fd306cSNickeau 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()); 53*70bbd7f1Sgerardnico $value = $this->data[$metadata::getPersistentName()] ?? null; 54c3437056SNickeau if ($value !== null) { 55c3437056SNickeau return $value; 56c3437056SNickeau } 57c3437056SNickeau foreach ($metadata::getOldPersistentNames() as $name) { 58*70bbd7f1Sgerardnico $value = $this->data[$name] ?? null; 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()) { 7104fd306cSNickeau throw new ExceptionRuntime("Not yet implemented, use sendToStore"); 72c3437056SNickeau } 73c3437056SNickeau } 74c3437056SNickeau 75c3437056SNickeau public function isHierarchicalTextBased(): bool 76c3437056SNickeau { 77c3437056SNickeau return true; 78c3437056SNickeau } 79c3437056SNickeau 80c3437056SNickeau 8104fd306cSNickeau public function getData(): array 82c3437056SNickeau { 83c3437056SNickeau return $this->data; 84c3437056SNickeau } 85c3437056SNickeau 86c3437056SNickeau 87c3437056SNickeau public function reset() 88c3437056SNickeau { 8904fd306cSNickeau $this->data = []; 90c3437056SNickeau } 91c3437056SNickeau 9204fd306cSNickeau public function getFromName(string $name, $default = null) 93c3437056SNickeau { 94c3437056SNickeau 9594bd6462Sgerardnico $value = $this->data[$name] ?? null; 96c3437056SNickeau if ($value !== null) { 97c3437056SNickeau return $value; 98c3437056SNickeau } 99c3437056SNickeau return $default; 100c3437056SNickeau } 101c3437056SNickeau 10204fd306cSNickeau public function setFromPersistentName(string $name, $value, $default = null) 103c3437056SNickeau { 10494bd6462Sgerardnico $actualValue = $this->data[$name] ?? null; 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 { 12294bd6462Sgerardnico $var = $this->data[$name] ?? null; 12394bd6462Sgerardnico return isset($var); 124c3437056SNickeau } 125c3437056SNickeau 126c3437056SNickeau public function remove(Metadata $metadata): MetadataSingleArrayStore 127c3437056SNickeau { 128c3437056SNickeau $this->checkResource($metadata->getResource()); 129c3437056SNickeau $this->setFromPersistentName($metadata->getName(), null); 130c3437056SNickeau return $this; 131c3437056SNickeau } 132c3437056SNickeau 133c3437056SNickeau private function toNormalizedKey(string $key): string 134c3437056SNickeau { 135c3437056SNickeau return trim($key); 136c3437056SNickeau } 137c3437056SNickeau 138c3437056SNickeau /** 139c3437056SNickeau * Used to update the data from an other external process 140c3437056SNickeau * (ie 141c3437056SNickeau * {@link MetadataDokuWikiStore::renderAndPersist() metadata renderer} 142c3437056SNickeau * or {@link \action_plugin_combo_metamanager::handleViewerPost() metadata manager 143c3437056SNickeau * ) 144c3437056SNickeau * @param $data 145c3437056SNickeau */ 146c3437056SNickeau public function setData($data) 147c3437056SNickeau { 148c3437056SNickeau if ($data !== $this->data) { 149c3437056SNickeau $this->hasChanged = true; 150c3437056SNickeau } 151c3437056SNickeau $this->data = $data; 152c3437056SNickeau } 153c3437056SNickeau 154c3437056SNickeau /** 155c3437056SNickeau * @return bool - true if the data has changed 156c3437056SNickeau */ 157c3437056SNickeau public function hasStateChanged(): bool 158c3437056SNickeau { 159c3437056SNickeau return $this->hasChanged; 160c3437056SNickeau } 161c3437056SNickeau 16204fd306cSNickeau 163c3437056SNickeau} 164