Skip to content
Extraits de code Groupes Projets
Valider e5d07a0f rédigé par mattab's avatar mattab
Parcourir les fichiers

Merge remote-tracking branch 'origin/master'

parents 87c90451 d4f2a75a
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -85,8 +85,7 @@ class FrontController extends Singleton ...@@ -85,8 +85,7 @@ class FrontController extends Singleton
return; return;
} }
// list($module, $action, $parameters, $controller) list($module, $action, $parameters, $controller) = $this->prepareDispatch($module, $action, $parameters);
$params = $this->prepareDispatch($module, $action, $parameters);
/** /**
* Generic hook that plugins can use to modify any input to the function, or even change the plugin being * Generic hook that plugins can use to modify any input to the function, or even change the plugin being
...@@ -95,7 +94,7 @@ class FrontController extends Singleton ...@@ -95,7 +94,7 @@ class FrontController extends Singleton
* *
* The `$params` array contains the following properties: `array($module, $action, $parameters, $controller)` * The `$params` array contains the following properties: `array($module, $action, $parameters, $controller)`
*/ */
Piwik::postEvent('Request.dispatch', $params); Piwik::postEvent('Request.dispatch', $module, $action, $parameters);
/** /**
* This event is similar to the `Request.dispatch` hook. It distinguishes the possibility to subscribe only to a * This event is similar to the `Request.dispatch` hook. It distinguishes the possibility to subscribe only to a
...@@ -105,7 +104,7 @@ class FrontController extends Singleton ...@@ -105,7 +104,7 @@ class FrontController extends Singleton
Piwik::postEvent(sprintf('Controller.%s.%s', $module, $action), array($parameters)); Piwik::postEvent(sprintf('Controller.%s.%s', $module, $action), array($parameters));
try { try {
$result = call_user_func_array(array($params[3], $params[1]), $params[2]); $result = call_user_func_array(array($controller, $action), $parameters);
/** /**
* This event is similar to the `Request.dispatch.end` hook. It distinguishes the possibility to subscribe * This event is similar to the `Request.dispatch.end` hook. It distinguishes the possibility to subscribe
...@@ -473,4 +472,4 @@ class PluginDeactivatedException extends Exception ...@@ -473,4 +472,4 @@ class PluginDeactivatedException extends Exception
{ {
parent::__construct("The plugin $module is not enabled. You can activate the plugin on Settings > Plugins page in Piwik."); parent::__construct("The plugin $module is not enabled. You can activate the plugin on Settings > Plugins page in Piwik.");
} }
} }
\ No newline at end of file
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
* @category Piwik
* @package Piwik
*/
namespace Piwik\Plugin;
use Piwik\Option;
use Piwik\Piwik;
class Settings
{
const TYPE_INT = 'integer';
const TYPE_FLOAT = 'float';
const TYPE_STRING = 'string';
const TYPE_BOOL = 'boolean';
const TYPE_ARRAY = 'array';
const FIELD_TEXT = 'text';
const FIELD_TEXTBOX = 'textbox';
const FIELD_RADIO = 'radio';
const FIELD_CHECKBOX = 'checkbox';
const FIELD_MULTI_SELECT = 'multiselect';
const FIELD_SINGLE_SELECT = 'select';
// what about stuff like date etc?
protected $defaultTypes = array();
protected $defaultFields = array();
protected $defaultOptions = array();
protected $settings = array();
protected $settingsValues = array();
private $pluginName;
public function __construct($pluginName)
{
$this->pluginName = $pluginName;
$this->defaultTypes = array(
static::FIELD_TEXT => static::TYPE_STRING,
static::FIELD_TEXTBOX => static::TYPE_STRING,
static::FIELD_RADIO => static::TYPE_STRING,
static::FIELD_CHECKBOX => static::TYPE_BOOL,
static::FIELD_MULTI_SELECT => static::TYPE_ARRAY,
static::FIELD_SINGLE_SELECT => static::TYPE_STRING,
);
$this->defaultFields = array(
static::TYPE_INT => static::FIELD_TEXT,
static::TYPE_FLOAT => static::FIELD_TEXT,
static::TYPE_STRING => static::FIELD_TEXT,
static::TYPE_BOOL => static::FIELD_CHECKBOX,
static::TYPE_ARRAY => static::FIELD_MULTI_SELECT,
);
$this->defaultOptions = array(
'type' => static::TYPE_STRING,
'field' => static::FIELD_TEXT,
'displayedForCurrentUser' => Piwik::isUserHasSomeAdminAccess(),
'fieldAttributes' => array(),
'description' => null,
'inlineHelp' => null,
'filter' => null,
'validate' => null,
);
$this->init();
$this->loadSettings();
}
protected function init()
{
}
protected function addSetting($name, $title, array $options = array())
{
if (array_key_exists('field', $options) && !array_key_exists('type', $options)) {
$options['type'] = $this->defaultTypes[$options['field']];
} elseif (array_key_exists('type', $options) && !array_key_exists('field', $options)) {
$options['field'] = $this->defaultFields[$options['type']];
}
$setting = array_merge($this->defaultOptions, $options);
$setting['name'] = $name;
$setting['title'] = $title;
$this->settings[] = $setting;
}
public function getSettingsForCurrentUser()
{
return array_values(array_filter($this->getSettings(), function ($setting) {
return $setting['displayedForCurrentUser'];
}));
}
public function getSettingValue($name)
{
$this->checkIsValidSetting($name);
if (!array_key_exists($name, $this->settingsValues)) {
$setting = $this->getSetting($name);
return $setting['defaultValue'];
}
return $this->settingsValues[$name];
}
public function setSettingValue($name, $value)
{
$this->checkIsValidSetting($name);
$setting = $this->getSetting($name);
if ($setting['validate'] && $setting['validate'] instanceof \Closure) {
call_user_func($setting['validate'], $value, $setting);
}
if ($setting['filter'] && $setting['filter'] instanceof \Closure) {
$value = call_user_func($setting['filter'], $value, $setting);
} else {
settype($value, $setting['type']);
}
$this->settingsValues[$name] = $value;
}
public function save()
{
Option::set($this->getOptionKey(), serialize($this->settingsValues));
}
public function removeAllPluginSettings()
{
Option::delete($this->getOptionKey());
}
private function getOptionKey()
{
return 'Plugin_' . $this->pluginName . '_Settings';
}
private function loadSettings()
{
$values = Option::get($this->getOptionKey());
if (!empty($values)) {
$this->settingsValues = unserialize($values);
}
}
private function checkIsValidSetting($name)
{
$setting = $this->getSetting($name);
if (empty($setting)) {
throw new \Exception('This setting does not exist');
}
if (!$setting['displayedForCurrentUser']) {
throw new \Exception('You are not allowed to change the value of this setting');
}
}
private function getSettings()
{
return $this->settings;
}
private function getSetting($name)
{
foreach ($this->settings as $setting) {
if ($name == $setting['name']) {
return $setting;
}
}
}
}
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
* @category Piwik
* @package Piwik
*/
namespace Piwik\Settings;
use Piwik\Piwik;
/**
* Settings manager
*
* @package Piwik
* @subpackage Manager
*/
class Manager
{
private static $settings = array();
/**
* @return \Piwik\Plugin\Settings[]
*/
public static function getAllPluginSettings()
{
if (empty(static::$settings)) {
$pluginSettings = array('Login' => 'Piwik\\Plugins\\Login\\Settings');
// TODO: document hook and think about better name
Piwik::postEvent('Plugin.addSettings', $pluginSettings);
$settings = array();
foreach ($pluginSettings as $pluginName => $pluginSetting) {
$settings[$pluginName] = new $pluginSetting($pluginName);
}
static::$settings = $settings;
}
return static::$settings;
}
/**
* @return bool
*/
public static function hasPluginSettingsForCurrentUser()
{
$settings = static::getAllPluginSettings();
foreach ($settings as $setting) {
$forUser = $setting->getSettingsForCurrentUser();
if (!empty($forUser)) {
return true;
}
}
return false;
}
}
...@@ -11,19 +11,24 @@ ...@@ -11,19 +11,24 @@
namespace Piwik\Plugins\CoreAdminHome; namespace Piwik\Plugins\CoreAdminHome;
use Exception; use Exception;
use Piwik\API\Request;
use Piwik\API\ResponseBuilder; use Piwik\API\ResponseBuilder;
use Piwik\ArchiveProcessor\Rules; use Piwik\ArchiveProcessor\Rules;
use Piwik\Common; use Piwik\Common;
use Piwik\Config; use Piwik\Config;
use Piwik\DataTable\Renderer\Json;
use Piwik\Menu\MenuTop; use Piwik\Menu\MenuTop;
use Piwik\Nonce; use Piwik\Nonce;
use Piwik\Piwik; use Piwik\Piwik;
use Piwik\Settings\Manager as SettingsManager;
use Piwik\Plugin\Manager;
use Piwik\Plugins\LanguagesManager\API as APILanguagesManager; use Piwik\Plugins\LanguagesManager\API as APILanguagesManager;
use Piwik\Plugins\LanguagesManager\LanguagesManager; use Piwik\Plugins\LanguagesManager\LanguagesManager;
use Piwik\Plugins\SitesManager\API as APISitesManager; use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\Site; use Piwik\Site;
use Piwik\Tracker\IgnoreCookie; use Piwik\Tracker\IgnoreCookie;
use Piwik\Url; use Piwik\Url;
use Piwik\UrlHelper;
use Piwik\View; use Piwik\View;
/** /**
...@@ -88,6 +93,55 @@ class Controller extends \Piwik\Plugin\ControllerAdmin ...@@ -88,6 +93,55 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
echo $view->render(); echo $view->render();
} }
public function pluginSettings()
{
Piwik::checkUserIsNotAnonymous();
$view = new View('@CoreAdminHome/pluginSettings');
$view->pluginSettings = SettingsManager::getAllPluginSettings();
$this->setBasicVariablesView($view);
echo $view->render();
}
public function setPluginSettings()
{
Piwik::checkUserIsNotAnonymous();
Json::sendHeaderJSON();
$updateSettings = Common::getRequestVar('settings', null, 'json');
$pluginSettings = SettingsManager::getAllPluginSettings();
try {
foreach ($updateSettings as $pluginName => $serializedSetting) {
$unserializedSettings = UrlHelper::getArrayFromQueryString($serializedSetting);
if (!array_key_exists($pluginName, $pluginSettings)) {
// this plugin is not using settings, skip it
continue;
}
$pluginSetting = $pluginSettings[$pluginName];
foreach ($unserializedSettings as $key => $value) {
$pluginSetting->setSettingValue($key, $value);
}
}
foreach ($pluginSettings as $pluginSetting) {
$pluginSetting->save();
}
} catch (Exception $e) {
echo json_encode(array('result' => 'error', 'message' => $e->getMessage()));
return;
}
echo json_encode(array('result' => 'success'));
}
public function setGeneralSettings() public function setGeneralSettings()
{ {
Piwik::checkUserIsSuperUser(); Piwik::checkUserIsSuperUser();
......
...@@ -18,6 +18,7 @@ use Piwik\Menu\MenuAdmin; ...@@ -18,6 +18,7 @@ use Piwik\Menu\MenuAdmin;
use Piwik\Piwik; use Piwik\Piwik;
use Piwik\ScheduledTask; use Piwik\ScheduledTask;
use Piwik\ScheduledTime\Daily; use Piwik\ScheduledTime\Daily;
use Piwik\Settings\Manager as SettingsManager;
/** /**
* *
...@@ -77,6 +78,7 @@ class CoreAdminHome extends \Piwik\Plugin ...@@ -77,6 +78,7 @@ class CoreAdminHome extends \Piwik\Plugin
$jsFiles[] = "plugins/CoreHome/javascripts/broadcast.js"; $jsFiles[] = "plugins/CoreHome/javascripts/broadcast.js";
$jsFiles[] = "plugins/CoreAdminHome/javascripts/generalSettings.js"; $jsFiles[] = "plugins/CoreAdminHome/javascripts/generalSettings.js";
$jsFiles[] = "plugins/CoreHome/javascripts/donate.js"; $jsFiles[] = "plugins/CoreHome/javascripts/donate.js";
$jsFiles[] = "plugins/CoreAdminHome/javascripts/pluginSettings.js";
} }
function addMenu() function addMenu()
...@@ -92,6 +94,14 @@ class CoreAdminHome extends \Piwik\Plugin ...@@ -92,6 +94,14 @@ class CoreAdminHome extends \Piwik\Plugin
array('module' => 'CoreAdminHome', 'action' => 'trackingCodeGenerator'), array('module' => 'CoreAdminHome', 'action' => 'trackingCodeGenerator'),
Piwik::isUserHasSomeAdminAccess(), Piwik::isUserHasSomeAdminAccess(),
$order = 4); $order = 4);
if (SettingsManager::hasPluginSettingsForCurrentUser()) {
MenuAdmin::getInstance()->add('General_Settings', 'General_Plugins',
array('module' => 'CoreAdminHome', 'action' => 'pluginSettings'),
Piwik::isUserHasSomeAdminAccess(),
$order = 7);
}
} }
function purgeOutdatedArchives() function purgeOutdatedArchives()
......
/*!
* Piwik - Web Analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
$(document).ready(function () {
$submit = $('.pluginsSettingsSubmit');
if (!$submit) {
return;
}
$submit.click(updatePluginSettings);
function updatePluginSettings()
{
var ajaxHandler = new ajaxHelper();
ajaxHandler.addParams({
module: 'CoreAdminHome',
action: 'setPluginSettings'
}, 'GET');
ajaxHandler.addParams({settings: JSON.stringify(getSettings())}, 'POST');
ajaxHandler.redirectOnSuccess();
ajaxHandler.setLoadingElement(getLoadingElement());
ajaxHandler.setErrorElement(getErrorElement());
ajaxHandler.send(true);
}
function getSettings()
{
var $pluginSections = $( "#pluginSettings[data-pluginname]" );
var values = {};
$pluginSections.each(function (index, pluginSection) {
$pluginSection = $(pluginSection);
var pluginName = $pluginSection.attr('data-pluginname');
var serialized = $('input, textarea, select', $pluginSection ).serialize();
values[pluginName] = serialized;
});
return values;
}
function getErrorElement()
{
return $('#ajaxErrorPluginSettings');
}
function getLoadingElement()
{
return $('#ajaxLoadingPluginSettings');
}
});
\ No newline at end of file
{% extends 'admin.twig' %}
{% block content %}
{% import 'macros.twig' as piwik %}
{% import 'ajaxMacros.twig' as ajax %}
<h2>{{ 'CoreAdminHome_PluginSettings'|translate }}</h2>
{{ ajax.errorDiv('ajaxErrorPluginSettings') }}
{{ ajax.loadingDiv('ajaxLoadingPluginSettings') }}
<input type="submit" value="{{ 'General_Save'|translate }}" class="pluginsSettingsSubmit submit"/>
{% for plugin, settings in pluginSettings %}
<h3 id="{{ plugin }}">{{ plugin }}</h3>
<table class="adminTable" style='width:620px;' id="pluginSettings" data-pluginname="{{ plugin }}">
{% for setting in settings.getSettingsForCurrentUser %}
<tr>
<td style='width:400px'>
{{ setting.title }}
<br />
<span class='form-description'>
{{ setting.description }}
</span>
</td>
<td style='width:220px'>
<fieldset>
<label>
<input type="{{ setting.field }}"
name="{{ setting.name }}"
{% for attr, val in setting.fieldAttributes %}
{{ attr|e('html_attr') }}="{{ val|e('html_attr') }}"
{% endfor %}
value="{{ settings.getSettingValue(setting.name)|e('html_attr') }}"
>
{% if setting.defaultValue %}
<br/>
<span class='form-description'>
{{ 'General_Default'|translate }} {{ setting.defaultValue }}
</span>
{% endif %}
</label>
</fieldset>
</td>
</tr>
{% endfor %}
</table>
{% endfor %}
<input type="submit" value="{{ 'General_Save'|translate }}" class="pluginsSettingsSubmit submit"/>
{% endblock %}
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter