forked from vergnet/site-accueil-insa
249 lines
7.5 KiB
PHP
249 lines
7.5 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\Common;
|
|
use Piwik\Db;
|
|
use Piwik\DbHelper;
|
|
use Piwik\Widget\WidgetsList;
|
|
|
|
class Model
|
|
{
|
|
private static $rawPrefix = 'user_dashboard';
|
|
private $table;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->table = Common::prefixTable(self::$rawPrefix);
|
|
}
|
|
|
|
/**
|
|
* 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)
|
|
{
|
|
$query = sprintf('SELECT layout FROM %s WHERE login = ? AND iddashboard = ?',
|
|
$this->table);
|
|
$bind = array($login, $idDashboard);
|
|
$layouts = Db::fetchAll($query, $bind);
|
|
|
|
return $layouts;
|
|
}
|
|
|
|
public function getAllDashboardsForUser($login)
|
|
{
|
|
$dashboards = Db::fetchAll('SELECT iddashboard, name, layout FROM ' . $this->table .
|
|
' WHERE login = ? ORDER BY iddashboard', array($login));
|
|
|
|
return $dashboards;
|
|
}
|
|
|
|
public function deleteAllLayoutsForUser($userLogin)
|
|
{
|
|
Db::query('DELETE FROM ' . $this->table . ' WHERE login = ?', array($userLogin));
|
|
}
|
|
|
|
/**
|
|
* Updates the name of a dashboard
|
|
*
|
|
* @param string $login
|
|
* @param int $idDashboard
|
|
* @param string $name
|
|
*/
|
|
public function updateDashboardName($login, $idDashboard, $name)
|
|
{
|
|
$bind = array($name, $login, $idDashboard);
|
|
$query = sprintf('UPDATE %s SET name = ? WHERE login = ? AND iddashboard = ?', $this->table);
|
|
Db::query($query, $bind);
|
|
}
|
|
|
|
/**
|
|
* Removes the dashboard with the given id
|
|
*/
|
|
public function deleteDashboardForUser($idDashboard, $login)
|
|
{
|
|
$query = sprintf('DELETE FROM %s WHERE iddashboard = ? AND login = ?', $this->table);
|
|
Db::query($query, array($idDashboard, $login));
|
|
}
|
|
|
|
/**
|
|
* Creates a new dashboard for the current user
|
|
* User needs to be logged in
|
|
*/
|
|
public function createNewDashboardForUser($login, $name, $layout)
|
|
{
|
|
$nextId = $this->getNextIdDashboard($login);
|
|
|
|
$query = sprintf('INSERT INTO %s (login, iddashboard, name, layout) VALUES (?, ?, ?, ?)', $this->table);
|
|
$bind = array($login, $nextId, $name, $layout);
|
|
Db::query($query, $bind);
|
|
|
|
return $nextId;
|
|
}
|
|
|
|
/**
|
|
* Saves the layout as default
|
|
*/
|
|
public function createOrUpdateDashboard($login, $idDashboard, $layout)
|
|
{
|
|
$bind = array($login, $idDashboard, $layout, $layout);
|
|
$query = sprintf('INSERT INTO %s (login, iddashboard, layout) VALUES (?,?,?) ON DUPLICATE KEY UPDATE layout=?',
|
|
$this->table);
|
|
Db::query($query, $bind);
|
|
}
|
|
|
|
private function getNextIdDashboard($login)
|
|
{
|
|
$nextIdQuery = sprintf('SELECT MAX(iddashboard)+1 FROM %s WHERE login = ?', $this->table);
|
|
$nextId = Db::fetchOne($nextIdQuery, array($login));
|
|
|
|
if (empty($nextId)) {
|
|
$nextId = 1;
|
|
}
|
|
|
|
return $nextId;
|
|
}
|
|
|
|
/**
|
|
* Records the layout in the DB for the given user.
|
|
*
|
|
* @param string $login
|
|
* @param int $idDashboard
|
|
* @param string $layout
|
|
*/
|
|
public function updateLayoutForUser($login, $idDashboard, $layout)
|
|
{
|
|
$bind = array($login, $idDashboard, $layout, $layout);
|
|
$query = sprintf('INSERT INTO %s (login, iddashboard, layout) VALUES (?,?,?) ON DUPLICATE KEY UPDATE layout=?',
|
|
$this->table);
|
|
Db::query($query, $bind);
|
|
}
|
|
|
|
public static function install()
|
|
{
|
|
$dashboard = "login VARCHAR( 100 ) NOT NULL ,
|
|
iddashboard INT NOT NULL ,
|
|
name VARCHAR( 100 ) NULL DEFAULT NULL ,
|
|
layout TEXT NOT NULL,
|
|
PRIMARY KEY ( login , iddashboard )";
|
|
|
|
DbHelper::createTable(self::$rawPrefix, $dashboard);
|
|
}
|
|
|
|
public static function uninstall()
|
|
{
|
|
Db::dropTables(Common::prefixTable(self::$rawPrefix));
|
|
}
|
|
|
|
/**
|
|
* Replaces widgets on the given dashboard layout with other ones
|
|
*
|
|
* It uses the given widget definitions to find the old and to create the new widgets
|
|
* Each widget is defined with an array containing the following information
|
|
* array (
|
|
* 'module' => string
|
|
* 'action' => string
|
|
* 'params' => array()
|
|
* )
|
|
*
|
|
* if $newWidget does not contain a widget definition at the current position,
|
|
* the old widget will simply be removed
|
|
*
|
|
* @param array $oldWidgets array containing widget definitions
|
|
* @param array $newWidgets array containing widget definitions
|
|
*/
|
|
public static function replaceDashboardWidgets($dashboardLayout, $oldWidgets, $newWidgets)
|
|
{
|
|
if (empty($dashboardLayout) || !isset($dashboardLayout->columns)) {
|
|
return $dashboardLayout;
|
|
}
|
|
|
|
$newColumns = array();
|
|
|
|
foreach ($dashboardLayout->columns as $id => $column) {
|
|
|
|
$newColumn = array();
|
|
|
|
foreach ($column as $widget) {
|
|
|
|
foreach ($oldWidgets AS $pos => $oldWidgetData) {
|
|
|
|
$oldWidgetId = WidgetsList::getWidgetUniqueId($oldWidgetData['module'], $oldWidgetData['action'], $oldWidgetData['params']);
|
|
|
|
if (empty($newWidgets[$pos])) {
|
|
continue 2;
|
|
}
|
|
|
|
$newWidget = $newWidgets[$pos];
|
|
|
|
if ($widget->uniqueId == $oldWidgetId) {
|
|
|
|
if (!empty($newWidget['uniqueId'])) {
|
|
$newWidgetId = $newWidget['uniqueId'];
|
|
} else {
|
|
$newWidgetId = WidgetsList::getWidgetUniqueId($newWidget['module'], $newWidget['action'], $newWidget['params']);
|
|
}
|
|
|
|
// is new widget already is on dashboard just remove the old one
|
|
if (self::layoutContainsWidget($dashboardLayout, $newWidgetId)) {
|
|
continue 2;
|
|
}
|
|
|
|
$widget->uniqueId = $newWidgetId;
|
|
$widget->parameters->module = $newWidget['module'];
|
|
$widget->parameters->action = $newWidget['action'];
|
|
foreach ($newWidget['params'] as $key => $value) {
|
|
$widget->parameters->{$key} = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
$newColumn[] = $widget;
|
|
}
|
|
|
|
$newColumns[] = $newColumn;
|
|
}
|
|
|
|
$dashboardLayout->columns = $newColumns;
|
|
|
|
return $dashboardLayout;
|
|
}
|
|
|
|
/**
|
|
* Checks if a given dashboard layout contains a given widget
|
|
*
|
|
* @param $dashboardLayout
|
|
* @param $widgetId
|
|
* @return bool
|
|
*/
|
|
protected static function layoutContainsWidget($dashboardLayout, $widgetId)
|
|
{
|
|
if (!isset($dashboardLayout->columns)) {
|
|
return false;
|
|
}
|
|
|
|
foreach ($dashboardLayout->columns as $id => $column) {
|
|
|
|
foreach ($column as $widget) {
|
|
|
|
if ($widget->uniqueId == $widgetId) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|