forked from vergnet/site-accueil-insa
334 lines
12 KiB
PHP
334 lines
12 KiB
PHP
<?php
|
|
/**
|
|
* Matomo - free/libre analytics platform
|
|
*
|
|
* @link https://matomo.org
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
*
|
|
*/
|
|
namespace Piwik\Plugins\Dashboard;
|
|
|
|
use Piwik\API\Request;
|
|
use Piwik\Common;
|
|
use Piwik\Container\StaticContainer;
|
|
use Piwik\Piwik;
|
|
use Piwik\Category\Subcategory;
|
|
use Piwik\Widget\WidgetConfig;
|
|
use Piwik\Plugin;
|
|
|
|
/**
|
|
*/
|
|
class Dashboard extends \Piwik\Plugin
|
|
{
|
|
/**
|
|
* @see \Piwik\Plugin::registerEvents
|
|
*/
|
|
public function registerEvents()
|
|
{
|
|
return array(
|
|
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
|
|
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
|
|
'UsersManager.deleteUser' => 'deleteDashboardLayout',
|
|
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
|
|
'Widget.addWidgetConfigs' => 'addWidgetConfigs',
|
|
'Category.addSubcategories' => 'addSubcategories',
|
|
'Widgetize.shouldEmbedIframeEmpty' => 'shouldEmbedIframeEmpty',
|
|
'Db.getTablesInstalled' => 'getTablesInstalled'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Register the new tables, so Matomo knows about them.
|
|
*
|
|
* @param array $allTablesInstalled
|
|
*/
|
|
public function getTablesInstalled(&$allTablesInstalled)
|
|
{
|
|
$allTablesInstalled[] = Common::prefixTable('user_dashboard');
|
|
}
|
|
|
|
public function shouldEmbedIframeEmpty(&$shouldEmbedEmpty, $controllerName, $actionName)
|
|
{
|
|
if ($controllerName == 'Dashboard' && $actionName == 'index') {
|
|
$shouldEmbedEmpty = true;
|
|
}
|
|
}
|
|
|
|
public function addWidgetConfigs(&$widgets)
|
|
{
|
|
if (Piwik::isUserIsAnonymous()) {
|
|
$this->addDefaultDashboard($widgets);
|
|
} else {
|
|
$dashboards = $this->getDashboards();
|
|
|
|
if (empty($dashboards)) {
|
|
$this->addDefaultDashboard($widgets);
|
|
} else {
|
|
foreach ($dashboards as $dashboard) {
|
|
$config = new WidgetConfig();
|
|
$config->setIsNotWidgetizable();
|
|
$config->setModule('Dashboard');
|
|
$config->setAction('embeddedIndex');
|
|
$config->setCategoryId('Dashboard_Dashboard');
|
|
$config->setSubcategoryId($dashboard['id']);
|
|
$config->setParameters(array('idDashboard' => $dashboard['id']));
|
|
$widgets[] = $config;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private function getDashboards()
|
|
{
|
|
return Request::processRequest('Dashboard.getDashboards',
|
|
['filter_limit' => '-1', 'filter_offset' => 0],
|
|
[]
|
|
);
|
|
}
|
|
|
|
private function addDefaultDashboard(&$widgets)
|
|
{
|
|
$config = new WidgetConfig();
|
|
$config->setIsNotWidgetizable();
|
|
$config->setModule('Dashboard');
|
|
$config->setAction('embeddedIndex');
|
|
$config->setCategoryId('Dashboard_Dashboard');
|
|
$config->setSubcategoryId('1');
|
|
$config->setParameters(array('idDashboard' => 1));
|
|
$widgets[] = $config;
|
|
}
|
|
|
|
public function addSubcategories(&$subcategories)
|
|
{
|
|
if (Piwik::isUserIsAnonymous()) {
|
|
$this->addDefaultSubcategory($subcategories);
|
|
} else {
|
|
$dashboards = $this->getDashboards();
|
|
|
|
if (empty($dashboards)) {
|
|
$this->addDefaultSubcategory($subcategories);
|
|
} else {
|
|
$order = 0;
|
|
foreach ($dashboards as $dashboard) {
|
|
$subcategory = new Subcategory();
|
|
$subcategory->setName($dashboard['name']);
|
|
$subcategory->setCategoryId('Dashboard_Dashboard');
|
|
$subcategory->setId($dashboard['id']);
|
|
$subcategory->setOrder($order++);
|
|
$subcategories[] = $subcategory;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private function addDefaultSubcategory(&$subcategories)
|
|
{
|
|
$subcategory = new Subcategory();
|
|
$subcategory->setName('Dashboard_Dashboard');
|
|
$subcategory->setCategoryId('Dashboard_Dashboard');
|
|
$subcategory->setId('1');
|
|
$subcategory->setOrder(1);
|
|
$subcategories[] = $subcategory;
|
|
}
|
|
|
|
/**
|
|
* Returns the layout in the DB for the given user, or false if the layout has not been set yet.
|
|
* Parameters must be checked BEFORE this function call
|
|
*
|
|
* @param string $login
|
|
* @param int $idDashboard
|
|
*
|
|
* @return bool|string
|
|
*/
|
|
public function getLayoutForUser($login, $idDashboard)
|
|
{
|
|
$return = $this->getModel()->getLayoutForUser($login, $idDashboard);
|
|
|
|
if (count($return) == 0) {
|
|
return false;
|
|
}
|
|
|
|
return $return[0]['layout'];
|
|
}
|
|
|
|
private function getModel()
|
|
{
|
|
return new Model();
|
|
}
|
|
|
|
public function getDefaultLayout()
|
|
{
|
|
$defaultLayout = $this->getLayoutForUser('', 1);
|
|
|
|
if (empty($defaultLayout)) {
|
|
$pluginManager = Plugin\Manager::getInstance();
|
|
|
|
$advertisingWidget = '';
|
|
$advertising = StaticContainer::get('Piwik\ProfessionalServices\Advertising');
|
|
if ($advertising->areAdsForProfessionalServicesEnabled() && $pluginManager->isPluginActivated('ProfessionalServices')) {
|
|
$advertisingWidget = '{"uniqueId":"widgetProfessionalServicespromoServices","parameters":{"module":"ProfessionalServices","action":"promoServices"}},';
|
|
}
|
|
$piwikPromoWidget = '{"uniqueId":"widgetCoreHomegetPromoVideo","parameters":{"module":"CoreHome","action":"getPromoVideo"}}';
|
|
$insightsWidget = '';
|
|
if ($pluginManager->isPluginActivated('Insights')) {
|
|
$insightsWidget = '{"uniqueId":"widgetInsightsgetOverallMoversAndShakers","parameters":{"module":"Insights","action":"getOverallMoversAndShakers"}},';
|
|
}
|
|
$defaultLayout = '[
|
|
[
|
|
{"uniqueId":"widgetLivewidget","parameters":{"module":"Live","action":"widget"}},
|
|
' . $piwikPromoWidget . '
|
|
],
|
|
[
|
|
{"uniqueId":"widgetVisitsSummarygetEvolutionGraphforceView1viewDataTablegraphEvolution","parameters":{"forceView":"1","viewDataTable":"graphEvolution","module":"VisitsSummary","action":"getEvolutionGraph"}},
|
|
' . $advertisingWidget . '
|
|
' . $insightsWidget . '
|
|
{"uniqueId":"widgetVisitsSummarygetforceView1viewDataTablesparklines","parameters":{"forceView":"1","viewDataTable":"sparklines","module":"VisitsSummary","action":"get"}}
|
|
],
|
|
[
|
|
{"uniqueId":"widgetUserCountryMapvisitorMap","parameters":{"module":"UserCountryMap","action":"visitorMap"}},
|
|
{"uniqueId":"widgetReferrersgetReferrerType","parameters":{"module":"Referrers","action":"getReferrerType"}},
|
|
{"uniqueId":"widgetRssWidgetrssPiwik","parameters":{"module":"RssWidget","action":"rssPiwik"}}
|
|
]
|
|
]';
|
|
}
|
|
|
|
/**
|
|
* Allows other plugins to modify the default dashboard layout.
|
|
*
|
|
* @param string &$defaultLayout JSON encoded string of the default dashboard layout. Contains an
|
|
* array of columns where each column is an array of widgets. Each
|
|
* widget is an associative array w/ the following elements:
|
|
*
|
|
* * **uniqueId**: The widget's unique ID.
|
|
* * **parameters**: The array of query parameters that should be used to get this widget's report.
|
|
*/
|
|
Piwik::postEvent("Dashboard.changeDefaultDashboardLayout", array(&$defaultLayout));
|
|
|
|
$defaultLayout = $this->removeDisabledPluginFromLayout($defaultLayout);
|
|
|
|
return $defaultLayout;
|
|
}
|
|
|
|
public function getAllDashboards($login)
|
|
{
|
|
$dashboards = $this->getModel()->getAllDashboardsForUser($login);
|
|
|
|
$nameless = 1;
|
|
foreach ($dashboards as &$dashboard) {
|
|
|
|
if (empty($dashboard['name'])) {
|
|
$dashboard['name'] = Piwik::translate('Dashboard_DashboardOf', $login);
|
|
if ($nameless > 1) {
|
|
$dashboard['name'] .= " ($nameless)";
|
|
}
|
|
|
|
$nameless++;
|
|
}
|
|
|
|
$dashboard['name'] = Common::unsanitizeInputValue($dashboard['name']);
|
|
|
|
$layout = '[]';
|
|
if (!empty($dashboard['layout'])) {
|
|
$layout = $dashboard['layout'];
|
|
}
|
|
|
|
$dashboard['layout'] = $this->decodeLayout($layout);
|
|
}
|
|
|
|
return $dashboards;
|
|
}
|
|
|
|
private function isAlreadyDecodedLayout($layout)
|
|
{
|
|
return !is_string($layout);
|
|
}
|
|
|
|
public function removeDisabledPluginFromLayout($layout)
|
|
{
|
|
$layoutObject = $this->decodeLayout($layout);
|
|
|
|
// if the json decoding works (ie. new Json format)
|
|
// we will only return the widgets that are from enabled plugins
|
|
|
|
if (is_array($layoutObject)) {
|
|
$layoutObject = (object)array(
|
|
'config' => array('layout' => '33-33-33'),
|
|
'columns' => $layoutObject
|
|
);
|
|
}
|
|
|
|
if (empty($layoutObject) || empty($layoutObject->columns)) {
|
|
$layoutObject = (object)array(
|
|
'config' => array('layout' => '33-33-33'),
|
|
'columns' => array()
|
|
);
|
|
}
|
|
|
|
$layout = $this->encodeLayout($layoutObject);
|
|
return $layout;
|
|
}
|
|
|
|
public function decodeLayout($layout)
|
|
{
|
|
if ($this->isAlreadyDecodedLayout($layout)) {
|
|
return $layout;
|
|
}
|
|
|
|
$layout = html_entity_decode($layout, ENT_COMPAT | ENT_HTML401, 'UTF-8');
|
|
$layout = str_replace("\\\"", "\"", $layout);
|
|
$layout = str_replace("\n", "", $layout);
|
|
|
|
return json_decode($layout, $assoc = false);
|
|
}
|
|
|
|
public function encodeLayout($layout)
|
|
{
|
|
return json_encode($layout);
|
|
}
|
|
|
|
public function getJsFiles(&$jsFiles)
|
|
{
|
|
$jsFiles[] = "plugins/Dashboard/javascripts/widgetMenu.js";
|
|
$jsFiles[] = "plugins/Dashboard/javascripts/dashboardObject.js";
|
|
$jsFiles[] = "plugins/Dashboard/javascripts/dashboardWidget.js";
|
|
$jsFiles[] = "plugins/Dashboard/javascripts/dashboard.js";
|
|
}
|
|
|
|
public function getStylesheetFiles(&$stylesheets)
|
|
{
|
|
$stylesheets[] = "plugins/CoreHome/stylesheets/dataTable.less";
|
|
$stylesheets[] = "plugins/Dashboard/stylesheets/dashboard.less";
|
|
$stylesheets[] = "plugins/Dashboard/stylesheets/widget.less";
|
|
}
|
|
|
|
public function deleteDashboardLayout($userLogin)
|
|
{
|
|
$this->getModel()->deleteAllLayoutsForUser($userLogin);
|
|
}
|
|
|
|
public function install()
|
|
{
|
|
Model::install();
|
|
}
|
|
|
|
public function uninstall()
|
|
{
|
|
Model::uninstall();
|
|
}
|
|
|
|
public function getClientSideTranslationKeys(&$translationKeys)
|
|
{
|
|
$translationKeys[] = 'Dashboard_AddPreviewedWidget';
|
|
$translationKeys[] = 'Dashboard_WidgetPreview';
|
|
$translationKeys[] = 'Dashboard_Maximise';
|
|
$translationKeys[] = 'Dashboard_Minimise';
|
|
$translationKeys[] = 'Dashboard_LoadingWidget';
|
|
$translationKeys[] = 'Dashboard_WidgetNotFound';
|
|
$translationKeys[] = 'Dashboard_DashboardCopied';
|
|
$translationKeys[] = 'Dashboard_Dashboard';
|
|
$translationKeys[] = 'Dashboard_RemoveDefaultDashboardNotPossible';
|
|
$translationKeys[] = 'General_Close';
|
|
$translationKeys[] = 'General_HelpResources';
|
|
$translationKeys[] = 'General_Refresh';
|
|
}
|
|
}
|