xref: /plugin/combo/ComboStrap/MetadataSingleArrayStore.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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