update Piwik to version 2.16 (fixes #91)

This commit is contained in:
oliver 2016-04-10 18:55:57 +02:00
commit 47263617c5
5833 changed files with 418860 additions and 226988 deletions

View file

@ -1,6 +1,6 @@
<?php
/**
* Piwik - Open source web analytics
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
@ -8,18 +8,18 @@
*/
namespace Piwik\ViewDataTable;
use Piwik\API\Proxy;
use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
/**
* Provides a means of creating {@link Piwik\Plugin\ViewDataTable} instances by ID.
*
* ### Examples
*
*
* **Creating a ViewDataTable for a report**
*
*
* // method in MyPlugin\Controller
* public function myReport()
* {
@ -28,9 +28,9 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
* $view->config->translations['myFancyMetric'] = "My Fancy Metric";
* return $view->render();
* }
*
*
* **Displaying a report in another way**
*
*
* // method in MyPlugin\Controller
* // use the same data that's used in myReport() above, but transform it in some way before
* // displaying.
@ -40,9 +40,9 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
* $view->config->filters[] = array('MyMagicFilter', array('an arg', 'another arg'));
* return $view->render();
* }
*
*
* **Force a report to be shown as a bar graph**
*
*
* // method in MyPlugin\Controller
* // force the myReport report to show as a bar graph if there is no viewDataTable query param,
* // even though it is configured to show as a table.
@ -52,7 +52,7 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
* $forceDefault = true);
* return $view->render();
* }
*
*
*
* @api
*/
@ -68,76 +68,140 @@ class Factory
/**
* Creates a {@link Piwik\Plugin\ViewDataTable} instance by ID. If the **viewDataTable** query parameter is set,
* this parameter's value is used as the ID.
*
*
* See {@link Piwik\Plugin\ViewDataTable} to read about the visualizations that are packaged with Piwik.
*
*
* @param string|null $defaultType A ViewDataTable ID representing the default ViewDataTable type to use. If
* the **viewDataTable** query parameter is not found, this value is used as
* the ID of the ViewDataTable to create.
*
*
* If a visualization type is configured for the report being displayed, it
* is used instead of the default type. (See {@hook ViewDataTable.getDefaultType}).
* If nothing is configured for the report and `null` is supplied for this
* argument, **table** is used.
* @param string|false $apiAction The API method for the report that will be displayed, eg,
* `'UserSettings.getBrowser'`.
* @param string|false $controllerAction The controller name and action dedicated to displaying the report. This
* @param bool|false|string $apiAction The API method for the report that will be displayed, eg,
* `'DevicesDetection.getBrowsers'`.
* @param bool|false|string $controllerAction The controller name and action dedicated to displaying the report. This
* action is used when reloading reports or changing the report visualization.
* Defaulted to `$apiAction` if `false` is supplied.
* @param bool $forceDefault If true, then the visualization type that was configured for the report will be
* ignored and `$defaultType` will be used as the default.
* @param bool $loadViewDataTableParametersForUser Whether the per-user parameters for this user, this ViewDataTable and this Api action
* should be loaded from the user preferences and override the default params values.
* @throws \Exception
* @return \Piwik\Plugin\ViewDataTable
*/
public static function build($defaultType = null, $apiAction = false, $controllerAction = false, $forceDefault = false)
public static function build($defaultType = null, $apiAction = false, $controllerAction = false, $forceDefault = false, $loadViewDataTableParametersForUser = null)
{
if (false === $controllerAction) {
$controllerAction = $apiAction;
}
$defaultViewType = self::getDefaultViewTypeForReport($apiAction);
$report = self::getReport($apiAction);
if (!$forceDefault && !empty($defaultViewType)) {
$defaultType = $defaultViewType;
$defaultViewType = self::getDefaultViewTypeForReport($report, $apiAction);
$params = array();
if(is_null($loadViewDataTableParametersForUser)) {
$loadViewDataTableParametersForUser = ('0' == Common::getRequestVar('widget', '0', 'string'));
}
if ($loadViewDataTableParametersForUser) {
$login = Piwik::getCurrentUserLogin();
$params = Manager::getViewDataTableParameters($login, $controllerAction);
}
$type = Common::getRequestVar('viewDataTable', false, 'string');
// Common::getRequestVar removes backslashes from the defaultValue in case magic quotes are enabled.
// therefore do not pass this as a default value to getRequestVar()
if ('' === $type) {
$type = $defaultType ? : HtmlTable::ID;
if (!self::isDefaultViewTypeForReportFixed($report)) {
$savedViewDataTable = false;
if (!empty($params['viewDataTable'])) {
$savedViewDataTable = $params['viewDataTable'];
}
// order of default viewDataTables' priority is: function specified default, saved default, configured default for report
// function specified default is preferred
// -> force default == true : defaultType ?: saved ?: defaultView
// -> force default == false : saved ?: defaultType ?: defaultView
if ($forceDefault) {
$defaultType = $defaultType ?: $savedViewDataTable ?: $defaultViewType;
} else {
$defaultType = $savedViewDataTable ?: $defaultType ?: $defaultViewType;
}
$type = Common::getRequestVar('viewDataTable', $defaultType, 'string');
// Common::getRequestVar removes backslashes from the defaultValue in case magic quotes are enabled.
// therefore do not pass this as a default value to getRequestVar()
if ('' === $type) {
$type = $defaultType ?: HtmlTable::ID;
}
} else {
$type = $defaultViewType;
}
$params['viewDataTable'] = $type;
$visualizations = Manager::getAvailableViewDataTables();
if (array_key_exists($type, $visualizations)) {
return new $visualizations[$type]($controllerAction, $apiAction);
}
if (class_exists($type)) {
return new $type($controllerAction, $apiAction);
return self::createViewDataTableInstance($visualizations[$type], $controllerAction, $apiAction, $params);
}
if (array_key_exists($defaultType, $visualizations)) {
return new $visualizations[$defaultType]($controllerAction, $apiAction);
return self::createViewDataTableInstance($visualizations[$defaultType], $controllerAction, $apiAction, $params);
}
if (array_key_exists(HtmlTable::ID, $visualizations)) {
return new $visualizations[HtmlTable::ID]($controllerAction, $apiAction);
return self::createViewDataTableInstance($visualizations[HtmlTable::ID], $controllerAction, $apiAction, $params);
}
throw new \Exception('No visualization found to render ViewDataTable');
}
/**
* Returns the default viewDataTable ID to use when determining which visualization to use.
* Return the report object for the given apiAction
* @param $apiAction
* @return null|Report
*/
private static function getDefaultViewTypeForReport($apiAction)
private static function getReport($apiAction)
{
list($module, $action) = explode('.', $apiAction);
$report = Report::factory($module, $action);
return $report;
}
/**
* Returns the default viewDataTable ID to use when determining which visualization to use.
*
* @param Report $report
* @param string $apiAction
*
* @return bool|string
*/
private static function getDefaultViewTypeForReport($report, $apiAction)
{
if (!empty($report) && $report->isEnabled()) {
return $report->getDefaultTypeViewDataTable();
}
$defaultViewTypes = self::getDefaultTypeViewDataTable();
return isset($defaultViewTypes[$apiAction]) ? $defaultViewTypes[$apiAction] : false;
}
/**
* Returns if the default viewDataTable ID to use is fixed.
*
* @param Report $report
* @return bool
*/
private static function isDefaultViewTypeForReportFixed($report)
{
if (!empty($report) && $report->isEnabled()) {
return $report->alwaysUseDefaultViewDataTable();
}
return false;
}
/**
* Returns a list of default viewDataTables ID to use when determining which visualization to use for multiple
* reports.
@ -147,28 +211,39 @@ class Factory
if (null === self::$defaultViewTypes) {
self::$defaultViewTypes = array();
/**
* Triggered when gathering the default view types for all available reports.
*
* If you define your own report, you may want to subscribe to this event to
* make sure the correct default Visualization is used (for example, a pie graph,
* bar graph, or something else).
*
* If there is no default type associated with a report, the **table** visualization
* used.
*
* **Example**
*
* public function getDefaultTypeViewDataTable(&$defaultViewTypes)
* {
* $defaultViewTypes['Referrers.getSocials'] = HtmlTable::ID;
* $defaultViewTypes['Referrers.getUrlsForSocial'] = Pie::ID;
* }
*
* @param array &$defaultViewTypes The array mapping report IDs with visualization IDs.
* @ignore
*/
Piwik::postEvent('ViewDataTable.getDefaultType', array(&self::$defaultViewTypes));
}
return self::$defaultViewTypes;
}
/**
* @param string $klass
* @param string $controllerAction
* @param string $apiAction
* @param array $params
*
* @internal param string $viewDataTableId
* @return \Piwik\Plugin\ViewDataTable
*/
private static function createViewDataTableInstance($klass, $controllerAction, $apiAction, $params)
{
if (empty($params)) {
$params = array();
}
if (!is_subclass_of($klass, 'Piwik\Plugin\Visualization')) {
// for now we ignore those params in case it is not a visualization. We do not want to apply
// any of those saved parameters to sparklines etc. Need to find a better solution here
$params = array();
}
if(!is_subclass_of($klass, 'Piwik\View\ViewInterface')) {
throw new \Exception("viewDataTable $klass must implement Piwik\View\ViewInterface interface.");
}
return new $klass($controllerAction, $apiAction, $params);
}
}