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:
-rw-r--r--core/Plugin/Settings.php39
-rw-r--r--core/Settings/Setting.php17
-rw-r--r--core/Settings/UserSetting.php4
-rw-r--r--plugins/CoreAdminHome/Controller.php7
-rw-r--r--plugins/CoreAdminHome/javascripts/pluginSettings.js9
-rw-r--r--plugins/CoreAdminHome/templates/pluginSettings.twig43
-rw-r--r--plugins/ExampleSettingsPlugin/Settings.php49
7 files changed, 124 insertions, 44 deletions
diff --git a/core/Plugin/Settings.php b/core/Plugin/Settings.php
index 50f82fc8f7..56ab232b49 100644
--- a/core/Plugin/Settings.php
+++ b/core/Plugin/Settings.php
@@ -33,9 +33,17 @@ class Settings
const FIELD_SINGLE_SELECT = 'select';
/**
+ * An array containing all available settings: Array ( [setting-name] => [setting] )
+ *
* @var Settings[]
*/
private $settings = array();
+
+ /**
+ * Array containing all plugin settings values: Array( [setting-key] => [setting-value] ).
+ *
+ * @var array
+ */
private $settingsValues = array();
private $introduction;
@@ -51,7 +59,7 @@ class Settings
protected function init()
{
- // define your settings here
+ // Define your settings and introduction here.
}
/**
@@ -164,7 +172,7 @@ class Settings
*
* @param Setting $setting
*/
- public function removeValue(Setting $setting)
+ public function removeSettingValue(Setting $setting)
{
$key = $setting->getKey();
@@ -173,10 +181,22 @@ class Settings
}
}
+ /**
+ * Adds a new setting.
+ *
+ * @param Setting $setting
+ * @throws \Exception In case a setting having the same name already exists.
+ * In case the name contains non-alnum characters.
+ */
protected function addSetting(Setting $setting)
{
+ if (!ctype_alnum($setting->getName())) {
+ $msg = sprintf('The setting name "%s" in plugin "%s" is not valid. Only alpha and numerical characters are allowed', $setting->getName(), $this->pluginName);
+ throw new \Exception($msg);
+ }
+
if (array_key_exists($setting->getName(), $this->settings)) {
- throw new \Exception(sprintf('A setting with name %s does already exist', $setting->getName()));
+ throw new \Exception(sprintf('A setting with name "%s" does already exist for plugin "%s"', $setting->getName(), $this->pluginName));
}
if (!is_null($setting->field) && is_null($setting->type)) {
@@ -188,8 +208,16 @@ class Settings
if (is_null($setting->validate) && !is_null($setting->fieldOptions)) {
$pluginName = $this->pluginName;
$setting->validate = function ($value) use ($setting, $pluginName) {
- if (!array_key_exists($value, $setting->fieldOptions)) {
- throw new \Exception(sprintf('The selected value for field "%s" and plugin "%s" is not allowed.', $setting->getTitle(), $pluginName));
+ if (is_array($value) && $setting->type == Settings::TYPE_ARRAY) {
+ foreach ($value as $val) {
+ if (!array_key_exists($val, $setting->fieldOptions)) {
+ throw new \Exception(sprintf('The selected value for field "%s" in plugin "%s" is not allowed.', $setting->title, $pluginName));
+ }
+ }
+ } else {
+ if (!array_key_exists($value, $setting->fieldOptions)) {
+ throw new \Exception(sprintf('The selected value for field "%s" in plugin "%s" is not allowed.', $setting->title, $pluginName));
+ }
}
};
}
@@ -216,7 +244,6 @@ class Settings
$setting = $this->getSetting($name);
if (empty($setting)) {
- // TODO escape $name? or is it automatically escaped?
throw new \Exception(sprintf('The setting %s does not exist', $name));
}
diff --git a/core/Settings/Setting.php b/core/Settings/Setting.php
index 43bbd49149..00efc9d876 100644
--- a/core/Settings/Setting.php
+++ b/core/Settings/Setting.php
@@ -128,26 +128,14 @@ abstract class Setting
protected $name;
protected $displayedForCurrentUser = false;
- public function canBeDisplayedForCurrentUser()
- {
- return $this->displayedForCurrentUser;
- }
-
/**
* Creates a new setting.
*
* @param string $name The name of the setting, only alnum characters are allowed. For instance `refreshInterval`
* @param string $title The title of the setting which will be visible to the user. For instance `Refresh Interval`
- *
- * @throws \Exception In case the name contains invalid characters.
*/
public function __construct($name, $title)
{
- if (!ctype_alnum($name)) {
- $msg = sprintf('The setting name %s is not valid. Only alpha and numerical characters are allowed', $name);
- throw new \Exception($msg);
- }
-
$this->key = $name;
$this->name = $name;
$this->title = $title;
@@ -158,6 +146,11 @@ abstract class Setting
return $this->name;
}
+ public function canBeDisplayedForCurrentUser()
+ {
+ return $this->displayedForCurrentUser;
+ }
+
/**
* Returns the key under which property name the setting will be stored.
*
diff --git a/core/Settings/UserSetting.php b/core/Settings/UserSetting.php
index c207e2e805..c7eb7eeb26 100644
--- a/core/Settings/UserSetting.php
+++ b/core/Settings/UserSetting.php
@@ -37,7 +37,7 @@ class UserSetting extends Setting
$this->setUserLogin($userLogin);
- $this->displayedForCurrentUser = !Piwik::isUserIsAnonymous();
+ $this->displayedForCurrentUser = !Piwik::isUserIsAnonymous() && Piwik::isUserHasSomeViewAccess();
}
private function buildUserSettingName($name, $userLogin = null)
@@ -94,7 +94,7 @@ class UserSetting extends Setting
if ($setting instanceof UserSetting) {
$setting->setUserLogin($userLogin);
- $pluginSettings->removeValue($setting);
+ $pluginSettings->removeSettingValue($setting);
}
}
diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php
index 21aeaa4cc8..2e5cf517b5 100644
--- a/plugins/CoreAdminHome/Controller.php
+++ b/plugins/CoreAdminHome/Controller.php
@@ -99,12 +99,12 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
{
Piwik::checkUserIsNotAnonymous();
- $view = new View('@CoreAdminHome/pluginSettings');
-
$settings = SettingsManager::getPluginSettingsForCurrentUser();
ksort($settings);
+
+ $view = new View('@CoreAdminHome/pluginSettings');
$view->pluginSettings = $settings;
- $view->nonce = Nonce::getNonce(static::SET_PLUGIN_SETTINGS_NONCE);
+ $view->nonce = Nonce::getNonce(static::SET_PLUGIN_SETTINGS_NONCE);
$this->setBasicVariablesView($view);
@@ -152,6 +152,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
}
} catch (Exception $e) {
+ // TODO escape message
echo json_encode(array('result' => 'error', 'message' => $e->getMessage()));
return;
}
diff --git a/plugins/CoreAdminHome/javascripts/pluginSettings.js b/plugins/CoreAdminHome/javascripts/pluginSettings.js
index 1146fb918f..084ef0cd38 100644
--- a/plugins/CoreAdminHome/javascripts/pluginSettings.js
+++ b/plugins/CoreAdminHome/javascripts/pluginSettings.js
@@ -47,7 +47,14 @@ $(document).ready(function () {
$pluginSection = $(pluginSection);
var pluginName = $pluginSection.attr('data-pluginname');
- var serialized = $('input, textarea, select', $pluginSection).serializeArray();
+ var serialized = $('input, textarea, select:not([multiple])', $pluginSection).serializeArray();
+
+ // by default, it does not generate an array
+ var $multiSelects = $('select[multiple]', $pluginSection);
+ $multiSelects.each(function (index, multiSelect) {
+ var name = $(multiSelect).attr('name');
+ serialized.push({name: name, value: $(multiSelect).val()});
+ });
// by default, values of unchecked checkboxes are not send
var $uncheckedNodes = $('input[type=checkbox]:not(:checked)', $pluginSection);
diff --git a/plugins/CoreAdminHome/templates/pluginSettings.twig b/plugins/CoreAdminHome/templates/pluginSettings.twig
index 4737acfb5b..f6d724b418 100644
--- a/plugins/CoreAdminHome/templates/pluginSettings.twig
+++ b/plugins/CoreAdminHome/templates/pluginSettings.twig
@@ -24,7 +24,7 @@
</p>
{% endif %}
- <table class="adminTable" style='width:820px;' id="pluginSettings" data-pluginname="{{ pluginName }}">
+ <table class="adminTable" style='width:820px;' id="pluginSettings" data-pluginname="{{ pluginName|e('html_attr') }}">
{% for setting in settings.getSettingsForCurrentUser %}
{% set settingValue = settings.getSettingValue(setting) %}
@@ -61,36 +61,40 @@
{% for key, value in setting.fieldOptions %}
<option value='{{ key }}'
- {% if settingValue==key %} selected='selected' {% endif %}>
+ {% if settingValue is iterable and key in settingValue %}
+ selected='selected'
+ {% elseif settingValue==key %}
+ selected='selected'
+ {% endif %}>
{{ value }}
</option>
{% endfor %}
</select>
{% elseif setting.field == 'textarea' %}
- <textarea
+ <textarea style="width: 176px;"
{% for attr, val in setting.fieldAttributes %}
{{ attr|e('html_attr') }}="{{ val|e('html_attr') }}"
{% endfor %}
name="{{ setting.getKey|e('html_attr') }}"
>
- {{ settingValue }}
+ {{- settingValue -}}
</textarea>
{% else %}
<input
- {% for attr, val in setting.fieldAttributes %}
- {{ attr|e('html_attr') }}="{{ val|e('html_attr') }}"
- {% endfor %}
- {% if setting.field == 'checkbox' %}
- value="1"
- {% endif %}
- {% if setting.field == 'checkbox' and settingValue %}
- checked="checked"
- {% endif %}
- type="{{ setting.field|e('html_attr') }}"
- name="{{ setting.getKey|e('html_attr') }}"
- value="{{ settingValue|e('html_attr') }}"
+ {% for attr, val in setting.fieldAttributes %}
+ {{ attr|e('html_attr') }}="{{ val|e('html_attr') }}"
+ {% endfor %}
+ {% if setting.field == 'checkbox' %}
+ value="1"
+ {% endif %}
+ {% if setting.field == 'checkbox' and settingValue %}
+ checked="checked"
+ {% endif %}
+ type="{{ setting.field|e('html_attr') }}"
+ name="{{ setting.getKey|e('html_attr') }}"
+ value="{{ settingValue|e('html_attr') }}"
>
{% endif %}
@@ -98,7 +102,12 @@
{% if setting.defaultValue and setting.field != 'checkbox' %}
<br/>
<span class='form-description'>
- {{ 'General_Default'|translate }} {{ setting.defaultValue }}
+ {{ 'General_Default'|translate }}
+ {% if setting.defaultValue is iterable %}
+ {{ setting.defaultValue|join(', ')|truncate(50) }}
+ {% else %}
+ {{ setting.defaultValue|truncate(50) }}
+ {% endif %}
</span>
{% endif %}
diff --git a/plugins/ExampleSettingsPlugin/Settings.php b/plugins/ExampleSettingsPlugin/Settings.php
index 400b74184d..89afa86b37 100644
--- a/plugins/ExampleSettingsPlugin/Settings.php
+++ b/plugins/ExampleSettingsPlugin/Settings.php
@@ -32,8 +32,17 @@ class Settings extends PluginSettings
// User setting --> textbox converted to int defining a validator and filter
$this->addSetting($this->getRefreshIntervalSetting());
- // System setting --> allows selection of a value
+ // System setting --> allows selection of a single value
$this->addSetting($this->getMetricSetting());
+
+ // System setting --> allows selection of multiple values
+ $this->addSetting($this->getBrowsersSetting());
+
+ // System setting --> textarea
+ $this->addSetting($this->getDescriptionSetting());
+
+ // System setting --> textarea
+ $this->addSetting($this->getPasswordSetting());
}
public function isAutoRefreshEnabled()
@@ -93,10 +102,44 @@ class Settings extends PluginSettings
$metric->type = static::TYPE_STRING;
$metric->field = static::FIELD_SINGLE_SELECT;
$metric->fieldOptions = array('nb_visits' => 'Visits', 'nb_actions' => 'Actions', 'visitors' => 'Visitors');
- $metric->introduction = 'Only super users can change this setting.';
- $metric->description = Piwik::translate('LiveTab_MetricDescription');
+ $metric->introduction = 'Only super users can change the following settings:';
+ $metric->description = 'Choose the metric that should be displayed in the browser tab';
$metric->defaultValue = 'nb_visits';
return $metric;
}
+
+ private function getBrowsersSetting()
+ {
+ $browsers = new SystemSetting('browsers', 'Supported Browsers');
+ $browsers->type = static::TYPE_ARRAY;
+ $browsers->field = static::FIELD_MULTI_SELECT;
+ $browsers->fieldOptions = array('firefox' => 'Firefox', 'chromium' => 'Chromium', 'safari' => 'safari');
+ $browsers->description = 'The value will be only displayed in the following browsers';
+ $browsers->defaultValue = array('firefox', 'chromium', 'safari');
+
+ return $browsers;
+ }
+
+ private function getDescriptionSetting()
+ {
+ $description = new SystemSetting('description', 'Description for value');
+ $description->field = static::FIELD_TEXTAREA;
+ $description->description = 'This description will be displayed next to the value';
+ $description->defaultValue = "This is the value: \nAnother line";
+
+ return $description;
+ }
+
+ private function getPasswordSetting()
+ {
+ $description = new SystemSetting('password', 'API password');
+ $description->field = static::FIELD_PASSWORD;
+ $description->description = 'Password for the 3rd API where we fetch the value';
+ $description->filter = function ($value) {
+ return sha1($value . 'salt');
+ };
+
+ return $description;
+ }
}