| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Plugins\Dashboard; |
|
|
| use Piwik\API\Request; |
| use Piwik\Piwik; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class API extends \Piwik\Plugin\API |
| { |
| |
| |
| |
| private $dashboard; |
|
|
| |
| |
| |
| private $model; |
|
|
| public function __construct(Dashboard $dashboard, Model $model) |
| { |
| $this->dashboard = $dashboard; |
| $this->model = $model; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function getDashboards(string $login = '', bool $returnDefaultIfEmpty = true): array |
| { |
| $login = $login ?: Piwik::getCurrentUserLogin(); |
|
|
| $dashboards = []; |
|
|
| if (!Piwik::isUserIsAnonymous()) { |
| Piwik::checkUserHasSuperUserAccessOrIsTheUser($login); |
| $dashboards = $this->getUserDashboards($login); |
| } |
|
|
| if (empty($dashboards) && $returnDefaultIfEmpty) { |
| $dashboards = [$this->getDefaultDashboard()]; |
| } |
|
|
| return $dashboards; |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public function createNewDashboardForUser(string $login, string $dashboardName = '', bool $addDefaultWidgets = true) |
| { |
| $this->checkLoginIsNotAnonymous($login); |
| Piwik::checkUserHasSuperUserAccessOrIsTheUser($login); |
|
|
| $layout = '{}'; |
|
|
| if ($addDefaultWidgets) { |
| $layout = $this->dashboard->getDefaultLayout(); |
| } |
|
|
| return $this->model->createNewDashboardForUser($login, $dashboardName, $layout); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function removeDashboard(int $idDashboard, string $login = ''): void |
| { |
| $login = $login ?: Piwik::getCurrentUserLogin(); |
|
|
| $this->checkLoginIsNotAnonymous($login); |
| Piwik::checkUserHasSuperUserAccessOrIsTheUser($login); |
|
|
| $this->model->deleteDashboardForUser($idDashboard, $login); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public function copyDashboardToUser(int $idDashboard, string $copyToUser, string $dashboardName = '') |
| { |
| Piwik::checkUserHasSomeAdminAccess(); |
|
|
| |
| |
| $users = Request::processRequest('UsersManager.getUsers', ['filter_limit' => -1]); |
| $userFound = false; |
| foreach ($users as $user) { |
| if ($user['login'] === $copyToUser) { |
| $userFound = true; |
| break; |
| } |
| } |
|
|
| if (!$userFound) { |
| throw new \Exception(sprintf('Cannot copy dashboard to user %s, user not found.', $copyToUser)); |
| } |
|
|
| $login = Piwik::getCurrentUserLogin(); |
| $layout = $this->dashboard->getLayoutForUser($login, $idDashboard); |
|
|
| if ($layout !== false) { |
| return $this->model->createNewDashboardForUser($copyToUser, $dashboardName, $layout); |
| } |
|
|
| throw new \Exception('Dashboard not found'); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function resetDashboardLayout(int $idDashboard, string $login = ''): void |
| { |
| $login = $login ?: Piwik::getCurrentUserLogin(); |
|
|
| $this->checkLoginIsNotAnonymous($login); |
| Piwik::checkUserHasSuperUserAccessOrIsTheUser($login); |
|
|
| $layout = $this->dashboard->getDefaultLayout(); |
|
|
| $this->model->updateLayoutForUser($login, $idDashboard, $layout); |
| } |
|
|
| |
| |
| |
| private function getDefaultDashboard(): array |
| { |
| $defaultLayout = $this->dashboard->getDefaultLayout(); |
| $defaultLayout = $this->dashboard->decodeLayout($defaultLayout); |
| $defaultDashboard = ['name' => Piwik::translate('Dashboard_Dashboard'), 'layout' => $defaultLayout, 'iddashboard' => 1]; |
|
|
| $widgets = $this->getVisibleWidgetsWithinDashboard($defaultDashboard); |
|
|
| return $this->buildDashboard($defaultDashboard, $widgets); |
| } |
|
|
| |
| |
| |
| private function getUserDashboards(string $userLogin): array |
| { |
| $userDashboards = $this->dashboard->getAllDashboards($userLogin); |
|
|
| $dashboards = []; |
|
|
| foreach ($userDashboards as $userDashboard) { |
| $widgets = $this->getVisibleWidgetsWithinDashboard($userDashboard); |
| $dashboards[] = $this->buildDashboard($userDashboard, $widgets); |
| } |
|
|
| return $dashboards; |
| } |
|
|
| |
| |
| |
| |
| private function getVisibleWidgetsWithinDashboard(array $dashboard): array |
| { |
| $columns = $this->getColumnsFromDashboard($dashboard); |
|
|
| $widgets = []; |
| $columns = array_filter($columns); |
|
|
| foreach ($columns as $column) { |
| foreach ($column as $widget) { |
| if ($this->widgetIsNotHidden($widget) && !empty($widget->parameters->module)) { |
| $module = $widget->parameters->module; |
| $action = $widget->parameters->action; |
|
|
| $widgets[] = ['module' => $module, 'action' => $action]; |
| } |
| } |
| } |
|
|
| return $widgets; |
| } |
|
|
| private function checkLoginIsNotAnonymous(string $login): void |
| { |
| Piwik::checkUserIsNotAnonymous(); |
|
|
| if (strtolower($login) === 'anonymous') { |
| throw new \Exception('This method can\'t be performed for anonymous user'); |
| } |
| } |
|
|
| |
| |
| |
| private function getColumnsFromDashboard(array $dashboard): array |
| { |
| if (empty($dashboard['layout'])) { |
| return []; |
| } |
|
|
| if (is_array($dashboard['layout'])) { |
| return $dashboard['layout']; |
| } |
|
|
| if (!empty($dashboard['layout']->columns)) { |
| return $dashboard['layout']->columns; |
| } |
|
|
| return []; |
| } |
|
|
| |
| |
| |
| |
| |
| private function buildDashboard(array $dashboard, array $widgets): array |
| { |
| return ['name' => $dashboard['name'], 'id' => (int)$dashboard['iddashboard'], 'widgets' => $widgets]; |
| } |
|
|
| private function widgetIsNotHidden(object $widget): bool |
| { |
| return empty($widget->isHidden); |
| } |
| } |
|
|