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