Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@gmail.com>2016-03-10 00:55:45 +0300
committerThomas Steur <thomas.steur@gmail.com>2016-04-11 05:11:33 +0300
commitb52ae4e7e488e0474d67c54578e1d6c1aa066bff (patch)
treef94b02f774cbc24faaa18f29ee1e19fef8b338af /core/Settings/Storage/Storage.php
parent6ba622a68a26792af8cc22131f488f7ff5189d2c (diff)
refs #7983 let plugins add or remove fields to websites and better settings api
Diffstat (limited to 'core/Settings/Storage/Storage.php')
-rw-r--r--core/Settings/Storage/Storage.php117
1 files changed, 117 insertions, 0 deletions
diff --git a/core/Settings/Storage/Storage.php b/core/Settings/Storage/Storage.php
new file mode 100644
index 0000000000..b24282068d
--- /dev/null
+++ b/core/Settings/Storage/Storage.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Settings\Storage;
+
+use Piwik\Settings\Storage\Backend;
+
+/**
+ * A storage stores values for multiple settings. Storing multiple settings here saves having to do
+ * a "get" for each individual setting. A storage is usually stared between all individual setting instances
+ * within a plugin.
+ */
+class Storage
+{
+ /**
+ * Array containing all plugin settings values: Array( [setting-key] => [setting-value] ).
+ *
+ * @var array
+ */
+ protected $settingsValues = array();
+
+ // for lazy loading of setting values
+ private $settingValuesLoaded = false;
+
+ /**
+ * @var Backend\BackendInterface
+ */
+ private $backend;
+
+ /**
+ * Defines whether a value has changed since the settings were loaded or not.
+ * @var bool
+ */
+ private $isDirty = false;
+
+ public function __construct(Backend\BackendInterface $backend)
+ {
+ $this->backend = $backend;
+ }
+
+ /**
+ * Get the currently used backend for this storage.
+ * @return Backend\BackendInterface
+ */
+ public function getBackend()
+ {
+ return $this->backend;
+ }
+
+ /**
+ * Saves (persists) the current setting values in the database if a value has actually changed.
+ */
+ public function save()
+ {
+ if ($this->isDirty) {
+ $this->backend->save($this->settingsValues);
+
+ $this->isDirty = false;
+
+ Backend\Cache::clearCache();
+ }
+ }
+
+ /**
+ * Returns the current value for a setting. If no value is stored, the default value
+ * is be returned.
+ *
+ * @param string $key The name / key of a setting
+ * @param mixed $defaultValue Default value that will be used in case no value for this setting exists yet
+ * @param string $type The PHP internal type the value of the setting should have, see FieldConfig::TYPE_*
+ * constants. Only an actual value of the setting will be converted to the given type, the
+ * default value will not be converted.
+ * @return mixed
+ */
+ public function getValue($key, $defaultValue, $type)
+ {
+ $this->loadSettingsIfNotDoneYet();
+
+ if (array_key_exists($key, $this->settingsValues)) {
+ settype($this->settingsValues[$key], $type);
+ return $this->settingsValues[$key];
+ }
+
+ return $defaultValue;
+ }
+
+ /**
+ * Sets (overwrites) the value of a setting in memory. To persist the change across requests, {@link save()} must be
+ * called.
+ *
+ * @param string $key The name / key of a setting
+ * @param mixed $value The value that shall be set for the given setting.
+ */
+ public function setValue($key, $value)
+ {
+ $this->loadSettingsIfNotDoneYet();
+
+ $this->isDirty = true;
+ $this->settingsValues[$key] = $value;
+ }
+
+ private function loadSettingsIfNotDoneYet()
+ {
+ if ($this->settingValuesLoaded) {
+ return;
+ }
+
+ $this->settingValuesLoaded = true;
+ $this->settingsValues = $this->backend->load();
+ }
+}