PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/Dashboard/Dashboard.php

https://github.com/CodeYellowBV/piwik
PHP | 246 lines | 196 code | 27 blank | 23 comment | 16 complexity | 4ecb096870992c3308069723091a6e89 MD5 | raw file
Possible License(s): LGPL-3.0, JSON, MIT, GPL-3.0, LGPL-2.1, GPL-2.0, AGPL-1.0, BSD-2-Clause, BSD-3-Clause
  1. <?php
  2. /**
  3. * Piwik - free/libre analytics platform
  4. *
  5. * @link http://piwik.org
  6. * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  7. *
  8. */
  9. namespace Piwik\Plugins\Dashboard;
  10. use Exception;
  11. use Piwik\Common;
  12. use Piwik\Db;
  13. use Piwik\DbHelper;
  14. use Piwik\Menu\MenuAbstract;
  15. use Piwik\Menu\MenuMain;
  16. use Piwik\Menu\MenuTop;
  17. use Piwik\Piwik;
  18. use Piwik\Site;
  19. use Piwik\WidgetsList;
  20. /**
  21. */
  22. class Dashboard extends \Piwik\Plugin
  23. {
  24. /**
  25. * @see Piwik\Plugin::getListHooksRegistered
  26. */
  27. public function getListHooksRegistered()
  28. {
  29. return array(
  30. 'AssetManager.getJavaScriptFiles' => 'getJsFiles',
  31. 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
  32. 'UsersManager.deleteUser' => 'deleteDashboardLayout',
  33. 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys'
  34. );
  35. }
  36. /**
  37. * Returns the layout in the DB for the given user, or false if the layout has not been set yet.
  38. * Parameters must be checked BEFORE this function call
  39. *
  40. * @param string $login
  41. * @param int $idDashboard
  42. *
  43. * @return bool|string
  44. */
  45. public function getLayoutForUser($login, $idDashboard)
  46. {
  47. $paramsBind = array($login, $idDashboard);
  48. $query = sprintf('SELECT layout FROM %s WHERE login = ? AND iddashboard = ?',
  49. Common::prefixTable('user_dashboard'));
  50. $return = Db::fetchAll($query, $paramsBind);
  51. if (count($return) == 0) {
  52. return false;
  53. }
  54. return $return[0]['layout'];
  55. }
  56. public function getDefaultLayout()
  57. {
  58. $defaultLayout = $this->getLayoutForUser('', 1);
  59. if (empty($defaultLayout)) {
  60. if (Piwik::hasUserSuperUserAccess()) {
  61. $topWidget = '{"uniqueId":"widgetCoreHomegetDonateForm",'
  62. . '"parameters":{"module":"CoreHome","action":"getDonateForm"}},';
  63. } else {
  64. $topWidget = '{"uniqueId":"widgetCoreHomegetPromoVideo",'
  65. . '"parameters":{"module":"CoreHome","action":"getPromoVideo"}},';
  66. }
  67. $defaultLayout = '[
  68. [
  69. {"uniqueId":"widgetVisitsSummarygetEvolutionGraphcolumnsArray","parameters":{"module":"VisitsSummary","action":"getEvolutionGraph","columns":"nb_visits"}},
  70. {"uniqueId":"widgetLivewidget","parameters":{"module":"Live","action":"widget"}},
  71. {"uniqueId":"widgetVisitorInterestgetNumberOfVisitsPerVisitDuration","parameters":{"module":"VisitorInterest","action":"getNumberOfVisitsPerVisitDuration"}}
  72. ],
  73. [
  74. ' . $topWidget . '
  75. {"uniqueId":"widgetReferrersgetKeywords","parameters":{"module":"Referrers","action":"getKeywords"}},
  76. {"uniqueId":"widgetReferrersgetWebsites","parameters":{"module":"Referrers","action":"getWebsites"}}
  77. ],
  78. [
  79. {"uniqueId":"widgetUserCountryMapvisitorMap","parameters":{"module":"UserCountryMap","action":"visitorMap"}},
  80. {"uniqueId":"widgetUserSettingsgetBrowser","parameters":{"module":"UserSettings","action":"getBrowser"}},
  81. {"uniqueId":"widgetReferrersgetSearchEngines","parameters":{"module":"Referrers","action":"getSearchEngines"}},
  82. {"uniqueId":"widgetVisitTimegetVisitInformationPerServerTime","parameters":{"module":"VisitTime","action":"getVisitInformationPerServerTime"}},
  83. {"uniqueId":"widgetExampleRssWidgetrssPiwik","parameters":{"module":"ExampleRssWidget","action":"rssPiwik"}}
  84. ]
  85. ]';
  86. }
  87. $defaultLayout = $this->removeDisabledPluginFromLayout($defaultLayout);
  88. return $defaultLayout;
  89. }
  90. public function getAllDashboards($login)
  91. {
  92. $dashboards = Db::fetchAll('SELECT iddashboard, name, layout
  93. FROM ' . Common::prefixTable('user_dashboard') .
  94. ' WHERE login = ? ORDER BY iddashboard', array($login));
  95. $nameless = 1;
  96. foreach ($dashboards AS &$dashboard) {
  97. if (empty($dashboard['name'])) {
  98. $dashboard['name'] = Piwik::translate('Dashboard_DashboardOf', $login);
  99. if ($nameless > 1) {
  100. $dashboard['name'] .= " ($nameless)";
  101. }
  102. $nameless++;
  103. }
  104. $dashboard['name'] = Common::unsanitizeInputValue($dashboard['name']);
  105. $layout = '[]';
  106. if (!empty($dashboard['layout'])) {
  107. $layout = $dashboard['layout'];
  108. }
  109. $dashboard['layout'] = $this->decodeLayout($layout);
  110. }
  111. return $dashboards;
  112. }
  113. private function isAlreadyDecodedLayout($layout)
  114. {
  115. return !is_string($layout);
  116. }
  117. public function removeDisabledPluginFromLayout($layout)
  118. {
  119. $layoutObject = $this->decodeLayout($layout);
  120. // if the json decoding works (ie. new Json format)
  121. // we will only return the widgets that are from enabled plugins
  122. if (is_array($layoutObject)) {
  123. $layoutObject = (object)array(
  124. 'config' => array('layout' => '33-33-33'),
  125. 'columns' => $layoutObject
  126. );
  127. }
  128. if (empty($layoutObject) || empty($layoutObject->columns)) {
  129. $layoutObject = (object)array(
  130. 'config' => array('layout' => '33-33-33'),
  131. 'columns' => array()
  132. );
  133. }
  134. foreach ($layoutObject->columns as &$row) {
  135. if (!is_array($row)) {
  136. $row = array();
  137. continue;
  138. }
  139. foreach ($row as $widgetId => $widget) {
  140. if (isset($widget->parameters->module)) {
  141. $controllerName = $widget->parameters->module;
  142. $controllerAction = $widget->parameters->action;
  143. if (!WidgetsList::isDefined($controllerName, $controllerAction)) {
  144. unset($row[$widgetId]);
  145. }
  146. } else {
  147. unset($row[$widgetId]);
  148. }
  149. }
  150. }
  151. $layout = $this->encodeLayout($layoutObject);
  152. return $layout;
  153. }
  154. public function decodeLayout($layout)
  155. {
  156. if ($this->isAlreadyDecodedLayout($layout)) {
  157. return $layout;
  158. }
  159. $layout = html_entity_decode($layout);
  160. $layout = str_replace("\\\"", "\"", $layout);
  161. $layout = str_replace("\n", "", $layout);
  162. return Common::json_decode($layout, $assoc = false);
  163. }
  164. public function encodeLayout($layout)
  165. {
  166. return Common::json_encode($layout);
  167. }
  168. public function getJsFiles(&$jsFiles)
  169. {
  170. $jsFiles[] = "plugins/Dashboard/javascripts/widgetMenu.js";
  171. $jsFiles[] = "libs/javascript/json2.js";
  172. $jsFiles[] = "plugins/Dashboard/javascripts/dashboardObject.js";
  173. $jsFiles[] = "plugins/Dashboard/javascripts/dashboardWidget.js";
  174. $jsFiles[] = "plugins/Dashboard/javascripts/dashboard.js";
  175. }
  176. public function getStylesheetFiles(&$stylesheets)
  177. {
  178. $stylesheets[] = "plugins/CoreHome/stylesheets/dataTable.less";
  179. $stylesheets[] = "plugins/Dashboard/stylesheets/dashboard.less";
  180. }
  181. public function deleteDashboardLayout($userLogin)
  182. {
  183. Db::query('DELETE FROM ' . Common::prefixTable('user_dashboard') . ' WHERE login = ?', array($userLogin));
  184. }
  185. public function install()
  186. {
  187. $dashboard = "login VARCHAR( 100 ) NOT NULL ,
  188. iddashboard INT NOT NULL ,
  189. name VARCHAR( 100 ) NULL DEFAULT NULL ,
  190. layout TEXT NOT NULL,
  191. PRIMARY KEY ( login , iddashboard )";
  192. DbHelper::createTable('user_dashboard', $dashboard);
  193. }
  194. public function uninstall()
  195. {
  196. Db::dropTables(Common::prefixTable('user_dashboard'));
  197. }
  198. public function getClientSideTranslationKeys(&$translationKeys)
  199. {
  200. $translationKeys[] = 'Dashboard_AddPreviewedWidget';
  201. $translationKeys[] = 'Dashboard_WidgetPreview';
  202. $translationKeys[] = 'Dashboard_Maximise';
  203. $translationKeys[] = 'Dashboard_Minimise';
  204. $translationKeys[] = 'Dashboard_LoadingWidget';
  205. $translationKeys[] = 'Dashboard_WidgetNotFound';
  206. $translationKeys[] = 'Dashboard_DashboardCopied';
  207. $translationKeys[] = 'General_Close';
  208. $translationKeys[] = 'General_Refresh';
  209. }
  210. }