Skip to content

Commit

Permalink
refs #4126 started to work on plugin settings
Browse files Browse the repository at this point in the history
  • Loading branch information
tsteur committed Oct 22, 2013
1 parent a385e54 commit d4f2a75
Show file tree
Hide file tree
Showing 6 changed files with 435 additions and 0 deletions.
184 changes: 184 additions & 0 deletions core/Plugin/Settings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
<?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;
}
}
}

}
65 changes: 65 additions & 0 deletions core/Settings/Manager.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?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;
}
}
54 changes: 54 additions & 0 deletions plugins/CoreAdminHome/Controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,24 @@
namespace Piwik\Plugins\CoreAdminHome;

use Exception;
use Piwik\API\Request;
use Piwik\API\ResponseBuilder;
use Piwik\ArchiveProcessor\Rules;
use Piwik\Common;
use Piwik\Config;
use Piwik\DataTable\Renderer\Json;
use Piwik\Menu\MenuTop;
use Piwik\Nonce;
use Piwik\Piwik;
use Piwik\Settings\Manager as SettingsManager;
use Piwik\Plugin\Manager;
use Piwik\Plugins\LanguagesManager\API as APILanguagesManager;
use Piwik\Plugins\LanguagesManager\LanguagesManager;
use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\Site;
use Piwik\Tracker\IgnoreCookie;
use Piwik\Url;
use Piwik\UrlHelper;
use Piwik\View;

/**
Expand Down Expand Up @@ -88,6 +93,55 @@ public function generalSettings()
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()
{
Piwik::checkUserIsSuperUser();
Expand Down
10 changes: 10 additions & 0 deletions plugins/CoreAdminHome/CoreAdminHome.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use Piwik\Piwik;
use Piwik\ScheduledTask;
use Piwik\ScheduledTime\Daily;
use Piwik\Settings\Manager as SettingsManager;

/**
*
Expand Down Expand Up @@ -77,6 +78,7 @@ public function getJsFiles(&$jsFiles)
$jsFiles[] = "plugins/CoreHome/javascripts/broadcast.js";
$jsFiles[] = "plugins/CoreAdminHome/javascripts/generalSettings.js";
$jsFiles[] = "plugins/CoreHome/javascripts/donate.js";
$jsFiles[] = "plugins/CoreAdminHome/javascripts/pluginSettings.js";
}

function addMenu()
Expand All @@ -92,6 +94,14 @@ function addMenu()
array('module' => 'CoreAdminHome', 'action' => 'trackingCodeGenerator'),
Piwik::isUserHasSomeAdminAccess(),
$order = 4);

if (SettingsManager::hasPluginSettingsForCurrentUser()) {
MenuAdmin::getInstance()->add('General_Settings', 'General_Plugins',
array('module' => 'CoreAdminHome', 'action' => 'pluginSettings'),
Piwik::isUserHasSomeAdminAccess(),
$order = 7);
}

}

function purgeOutdatedArchives()
Expand Down
Loading

0 comments on commit d4f2a75

Please sign in to comment.