Newer
Older
<?php
/**
* Piwik - Open source web analytics
sgiehl
a validé
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
mattab
a validé
* @package Dashboard
mattab
a validé
namespace Piwik\Plugins\Dashboard;
use Piwik\Common;
use Piwik\DataTable\Renderer\Json;
use Piwik\Db;
use Piwik\Session\SessionNamespace;
use Piwik\View;
mattab
a validé
use Piwik\WidgetsList;
sgiehl
a validé
* Dashboard Controller
mattab
a validé
* @package Dashboard
mattab
a validé
class Controller extends \Piwik\Controller
mattab
a validé
* @var Dashboard
*/
private $dashboard;
protected function init()
{
parent::init();
mattab
a validé
$this->dashboard = new Dashboard();
sgiehl
a validé
protected function _getDashboardView($template)
{
$view = new View($template);
sgiehl
a validé
$this->setGeneralVariablesView($view);
$view->availableWidgets = Common::json_encode(WidgetsList::get());
sgiehl
a validé
$view->availableLayouts = $this->getAvailableLayouts();
$view->dashboardId = Common::getRequestVar('idDashboard', 1, 'int');
sgiehl
a validé
$view->dashboardLayout = $this->getLayout($view->dashboardId);
sgiehl
a validé
}
public function embeddedIndex()
{
$view = $this->_getDashboardView('@Dashboard/embeddedIndex');
sgiehl
a validé
echo $view->render();
}
public function index()
{
$view = $this->_getDashboardView('@Dashboard/index');
sgiehl
a validé
$view->dashboards = array();
if (!Piwik::isUserIsAnonymous()) {
$login = Piwik::getCurrentUserLogin();
$view->dashboards = $this->dashboard->getAllDashboards($login);
sgiehl
a validé
}
echo $view->render();
}
public function getAvailableWidgets()
{
$this->checkTokenInUrl();
Json::sendHeaderJSON();
echo Common::json_encode(WidgetsList::get());
sgiehl
a validé
}
public function getDashboardLayout()
{
$this->checkTokenInUrl();
$idDashboard = Common::getRequestVar('idDashboard', 1, 'int');
sgiehl
a validé
$layout = $this->getLayout($idDashboard);
echo $layout;
}
/**
* Resets the dashboard to the default widget configuration
*/
public function resetLayout()
{
$this->checkTokenInUrl();
$layout = $this->dashboard->getDefaultLayout();
$idDashboard = Common::getRequestVar('idDashboard', 1, 'int');
sgiehl
a validé
if (Piwik::isUserIsAnonymous()) {
mattab
a validé
$session = new SessionNamespace("Dashboard");
sgiehl
a validé
$session->dashboardLayout = $layout;
$session->setExpirationSeconds(1800);
} else {
$this->saveLayoutForUser(Piwik::getCurrentUserLogin(), $idDashboard, $layout);
}
}
/**
* Records the layout in the DB for the given user.
*
* @param string $login
* @param int $idDashboard
sgiehl
a validé
* @param string $layout
*/
protected function saveLayoutForUser($login, $idDashboard, $layout)
{
$paramsBind = array($login, $idDashboard, $layout, $layout);
$query = sprintf('INSERT INTO %s (login, iddashboard, layout) VALUES (?,?,?) ON DUPLICATE KEY UPDATE layout=?',
Common::prefixTable('user_dashboard'));
Db::query($query, $paramsBind);
sgiehl
a validé
}
/**
* Updates the name of a dashboard
*
* @param string $login
* @param int $idDashboard
sgiehl
a validé
* @param string $name
*/
protected function updateDashboardName($login, $idDashboard, $name)
{
$paramsBind = array($name, $login, $idDashboard);
$query = sprintf('UPDATE %s SET name = ? WHERE login = ? AND iddashboard = ?',
Common::prefixTable('user_dashboard'));
Db::query($query, $paramsBind);
sgiehl
a validé
}
/**
* Removes the dashboard with the given id
*/
public function removeDashboard()
{
$this->checkTokenInUrl();
if (Piwik::isUserIsAnonymous()) {
return;
}
$idDashboard = Common::getRequestVar('idDashboard', 1, 'int');
sgiehl
a validé
// first layout can't be removed
if ($idDashboard != 1) {
$query = sprintf('DELETE FROM %s WHERE iddashboard = ? AND login = ?',
Common::prefixTable('user_dashboard'));
Db::query($query, array($idDashboard, Piwik::getCurrentUserLogin()));
sgiehl
a validé
}
}
/**
* Outputs all available dashboards for the current user as a JSON string
*/
public function getAllDashboards()
{
$this->checkTokenInUrl();
mattab
a validé
if (Piwik::isUserIsAnonymous()) {
Json::sendHeaderJSON();
echo '[]';
mattab
a validé
return;
sgiehl
a validé
mattab
a validé
$login = Piwik::getCurrentUserLogin();
$dashboards = $this->dashboard->getAllDashboards($login);
sgiehl
a validé
Json::sendHeaderJSON();
echo Common::json_encode($dashboards);
sgiehl
a validé
}
/**
* Creates a new dashboard for the current user
* User needs to be logged in
*/
public function createNewDashboard()
{
$this->checkTokenInUrl();
if (Piwik::isUserIsAnonymous()) {
echo '0';
return;
$user = Piwik::getCurrentUserLogin();
$nextId = $this->getNextIdDashboard($user);
sgiehl
a validé
$name = urldecode(Common::getRequestVar('name', '', 'string'));
$type = urldecode(Common::getRequestVar('type', 'default', 'string'));
sgiehl
a validé
$layout = $this->dashboard->getDefaultLayout();
sgiehl
a validé
}
$query = sprintf('INSERT INTO %s (login, iddashboard, name, layout) VALUES (?, ?, ?, ?)',
Common::prefixTable('user_dashboard'));
Db::query($query, array($user, $nextId, $name, $layout));
Json::sendHeaderJSON();
echo Common::json_encode($nextId);
sgiehl
a validé
}
private function getNextIdDashboard($login)
{
$nextIdQuery = sprintf('SELECT MAX(iddashboard)+1 FROM %s WHERE login = ?',
Common::prefixTable('user_dashboard'));
$nextId = Db::fetchOne($nextIdQuery, array($login));
if (empty($nextId)) {
$nextId = 1;
return $nextId;
}
return $nextId;
}
public function copyDashboardToUser()
sgiehl
a validé
{
$this->checkTokenInUrl();
if (!Piwik::isUserIsSuperUser()) {
echo '0';
return;
$login = Piwik::getCurrentUserLogin();
$name = urldecode(Common::getRequestVar('name', '', 'string'));
$user = urldecode(Common::getRequestVar('user', '', 'string'));
$idDashboard = Common::getRequestVar('dashboardId', 0, 'int');
$layout = $this->dashboard->getLayoutForUser($login, $idDashboard);
if ($layout !== false) {
$nextId = $this->getNextIdDashboard($user);
$query = sprintf('INSERT INTO %s (login, iddashboard, name, layout) VALUES (?, ?, ?, ?)',
Common::prefixTable('user_dashboard'));
Db::query($query, array($user, $nextId, $name, $layout));
Json::sendHeaderJSON();
echo Common::json_encode($nextId);
return;
sgiehl
a validé
}
}
/**
* Saves the layout for the current user
* anonymous = in the session
* authenticated user = in the DB
*/
public function saveLayout()
{
$this->checkTokenInUrl();
$layout = Common::unsanitizeInputValue(Common::getRequestVar('layout'));
$idDashboard = Common::getRequestVar('idDashboard', 1, 'int');
$name = Common::getRequestVar('name', '', 'string');
sgiehl
a validé
if (Piwik::isUserIsAnonymous()) {
mattab
a validé
$session = new SessionNamespace("Dashboard");
sgiehl
a validé
$session->dashboardLayout = $layout;
$session->setExpirationSeconds(1800);
} else {
$this->saveLayoutForUser(Piwik::getCurrentUserLogin(), $idDashboard, $layout);
if (!empty($name)) {
$this->updateDashboardName(Piwik::getCurrentUserLogin(), $idDashboard, $name);
}
}
}
/**
* Saves the layout as default
*/
public function saveLayoutAsDefault()
{
$this->checkTokenInUrl();
if (Piwik::isUserIsSuperUser()) {
$layout = Common::unsanitizeInputValue(Common::getRequestVar('layout'));
sgiehl
a validé
$paramsBind = array('', '1', $layout, $layout);
$query = sprintf('INSERT INTO %s (login, iddashboard, layout) VALUES (?,?,?) ON DUPLICATE KEY UPDATE layout=?',
Common::prefixTable('user_dashboard'));
Db::query($query, $paramsBind);
sgiehl
a validé
}
}
/**
* Get the dashboard layout for the current user (anonymous or logged user)
*
* @param int $idDashboard
*
* @return string $layout
*/
protected function getLayout($idDashboard)
{
if (Piwik::isUserIsAnonymous()) {
mattab
a validé
$session = new SessionNamespace("Dashboard");
sgiehl
a validé
if (!isset($session->dashboardLayout)) {
return $this->dashboard->getDefaultLayout();
sgiehl
a validé
}
sgiehl
a validé
$layout = $session->dashboardLayout;
} else {
$layout = $this->dashboard->getLayoutForUser(Piwik::getCurrentUserLogin(), $idDashboard);
sgiehl
a validé
}
sgiehl
a validé
if (!empty($layout)) {
$layout = $this->dashboard->removeDisabledPluginFromLayout($layout);
sgiehl
a validé
}
$layout = $this->dashboard->getDefaultLayout();
sgiehl
a validé
}
return $layout;
}
/**
* Returns all available column layouts for the dashboard
*
* @return array
sgiehl
a validé
protected function getAvailableLayouts()
{
return array(
array(100),
array(50, 50), array(67, 33), array(33, 67),
array(33, 33, 33), array(40, 30, 30), array(30, 40, 30), array(30, 30, 40),
array(25, 25, 25, 25)
);
}