PageRenderTime 49ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/core/ViewDataTable/Manager.php

https://github.com/CodeYellowBV/piwik
PHP | 327 lines | 191 code | 52 blank | 84 comment | 29 complexity | 7faa90c8c28544a4c5e22192d6a7c399 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\ViewDataTable;
  10. use Piwik\Common;
  11. use Piwik\Option;
  12. use Piwik\Piwik;
  13. use Piwik\Plugin\ViewDataTable;
  14. use Piwik\Plugins\CoreVisualizations\Visualizations\Cloud;
  15. use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
  16. use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Bar;
  17. use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Pie;
  18. use Piwik\Plugins\Goals\Visualizations\Goals;
  19. use Piwik\Plugins\Insights\Visualizations\Insight;
  20. /**
  21. * ViewDataTable Manager.
  22. *
  23. */
  24. class Manager
  25. {
  26. /**
  27. * Returns the viewDataTable IDs of a visualization's class lineage.
  28. *
  29. * @see self::getVisualizationClassLineage
  30. *
  31. * @param string $klass The visualization class.
  32. *
  33. * @return array
  34. */
  35. public static function getIdsWithInheritance($klass)
  36. {
  37. $klasses = Common::getClassLineage($klass);
  38. $result = array();
  39. foreach ($klasses as $klass) {
  40. try {
  41. $result[] = $klass::getViewDataTableId();
  42. } catch (\Exception $e) {
  43. // in case $klass did not define an id: eg Plugin\ViewDataTable
  44. continue;
  45. }
  46. }
  47. return $result;
  48. }
  49. /**
  50. * Returns all registered visualization classes. Uses the 'Visualization.getAvailable'
  51. * event to retrieve visualizations.
  52. *
  53. * @return array Array mapping visualization IDs with their associated visualization classes.
  54. * @throws \Exception If a visualization class does not exist or if a duplicate visualization ID
  55. * is found.
  56. * @return array
  57. */
  58. public static function getAvailableViewDataTables()
  59. {
  60. /** @var string[] $visualizations */
  61. $visualizations = array();
  62. /**
  63. * Triggered when gathering all available DataTable visualizations.
  64. *
  65. * Plugins that want to expose new DataTable visualizations should subscribe to
  66. * this event and add visualization class names to the incoming array.
  67. *
  68. * **Example**
  69. *
  70. * public function addViewDataTable(&$visualizations)
  71. * {
  72. * $visualizations[] = 'Piwik\\Plugins\\MyPlugin\\MyVisualization';
  73. * }
  74. *
  75. * @param array &$visualizations The array of all available visualizations.
  76. */
  77. Piwik::postEvent('ViewDataTable.addViewDataTable', array(&$visualizations));
  78. $result = array();
  79. foreach ($visualizations as $viz) {
  80. if (!class_exists($viz)) {
  81. throw new \Exception("Invalid visualization class '$viz' found in Visualization.getAvailableVisualizations.");
  82. }
  83. if (!is_subclass_of($viz, '\\Piwik\\Plugin\\ViewDataTable')) {
  84. throw new \Exception("ViewDataTable class '$viz' does not extend Plugin/ViewDataTable");
  85. }
  86. $vizId = $viz::getViewDataTableId();
  87. if (isset($result[$vizId])) {
  88. throw new \Exception("ViewDataTable ID '$vizId' is already in use!");
  89. }
  90. $result[$vizId] = $viz;
  91. }
  92. return $result;
  93. }
  94. /**
  95. * Returns all available visualizations that are not part of the CoreVisualizations plugin.
  96. *
  97. * @return array Array mapping visualization IDs with their associated visualization classes.
  98. */
  99. public static function getNonCoreViewDataTables()
  100. {
  101. $result = array();
  102. foreach (static::getAvailableViewDataTables() as $vizId => $vizClass) {
  103. if (false === strpos($vizClass, 'Piwik\\Plugins\\CoreVisualizations')
  104. && false === strpos($vizClass, 'Piwik\\Plugins\\Goals\\Visualizations\\Goals')) {
  105. $result[$vizId] = $vizClass;
  106. }
  107. }
  108. return $result;
  109. }
  110. /**
  111. * This method determines the default set of footer icons to display below a report.
  112. *
  113. * $result has the following format:
  114. *
  115. * ```
  116. * array(
  117. * array( // footer icon group 1
  118. * 'class' => 'footerIconGroup1CssClass',
  119. * 'buttons' => array(
  120. * 'id' => 'myid',
  121. * 'title' => 'My Tooltip',
  122. * 'icon' => 'path/to/my/icon.png'
  123. * )
  124. * ),
  125. * array( // footer icon group 2
  126. * 'class' => 'footerIconGroup2CssClass',
  127. * 'buttons' => array(...)
  128. * ),
  129. * ...
  130. * )
  131. * ```
  132. */
  133. public static function configureFooterIcons(ViewDataTable $view)
  134. {
  135. $result = array();
  136. // add normal view icons (eg, normal table, all columns, goals)
  137. $normalViewIcons = array(
  138. 'class' => 'tableAllColumnsSwitch',
  139. 'buttons' => array(),
  140. );
  141. if ($view->config->show_table) {
  142. $normalViewIcons['buttons'][] = static::getFooterIconFor(HtmlTable::ID);
  143. }
  144. if ($view->config->show_table_all_columns) {
  145. $normalViewIcons['buttons'][] = static::getFooterIconFor(HtmlTable\AllColumns::ID);
  146. }
  147. if ($view->config->show_goals) {
  148. $goalButton = static::getFooterIconFor(Goals::ID);
  149. if (Common::getRequestVar('idGoal', false) == 'ecommerceOrder') {
  150. $goalButton['icon'] = 'plugins/Morpheus/images/ecommerceOrder.gif';
  151. }
  152. $normalViewIcons['buttons'][] = $goalButton;
  153. }
  154. if ($view->config->show_ecommerce) {
  155. $normalViewIcons['buttons'][] = array(
  156. 'id' => 'ecommerceOrder',
  157. 'title' => Piwik::translate('General_EcommerceOrders'),
  158. 'icon' => 'plugins/Morpheus/images/ecommerceOrder.gif',
  159. 'text' => Piwik::translate('General_EcommerceOrders')
  160. );
  161. $normalViewIcons['buttons'][] = array(
  162. 'id' => 'ecommerceAbandonedCart',
  163. 'title' => Piwik::translate('General_AbandonedCarts'),
  164. 'icon' => 'plugins/Morpheus/images/ecommerceAbandonedCart.gif',
  165. 'text' => Piwik::translate('General_AbandonedCarts')
  166. );
  167. }
  168. $normalViewIcons['buttons'] = array_filter($normalViewIcons['buttons']);
  169. if (!empty($normalViewIcons['buttons'])) {
  170. $result[] = $normalViewIcons;
  171. }
  172. // add insight views
  173. $insightsViewIcons = array(
  174. 'class' => 'tableInsightViews',
  175. 'buttons' => array(),
  176. );
  177. // add graph views
  178. $graphViewIcons = array(
  179. 'class' => 'tableGraphViews tableGraphCollapsed',
  180. 'buttons' => array(),
  181. );
  182. if ($view->config->show_all_views_icons) {
  183. if ($view->config->show_bar_chart) {
  184. $graphViewIcons['buttons'][] = static::getFooterIconFor(Bar::ID);
  185. }
  186. if ($view->config->show_pie_chart) {
  187. $graphViewIcons['buttons'][] = static::getFooterIconFor(Pie::ID);
  188. }
  189. if ($view->config->show_tag_cloud) {
  190. $graphViewIcons['buttons'][] = static::getFooterIconFor(Cloud::ID);
  191. }
  192. }
  193. $nonCoreVisualizations = static::getNonCoreViewDataTables();
  194. foreach ($nonCoreVisualizations as $id => $klass) {
  195. if ($klass::canDisplayViewDataTable($view)) {
  196. $footerIcon = static::getFooterIconFor($id);
  197. if (Insight::ID == $footerIcon['id']) {
  198. $insightsViewIcons['buttons'][] = static::getFooterIconFor($id);
  199. } else {
  200. $graphViewIcons['buttons'][] = static::getFooterIconFor($id);
  201. }
  202. }
  203. }
  204. $graphViewIcons['buttons'] = array_filter($graphViewIcons['buttons']);
  205. if (!empty($insightsViewIcons['buttons'])) {
  206. $result[] = $insightsViewIcons;
  207. }
  208. if (!empty($graphViewIcons['buttons'])) {
  209. $result[] = $graphViewIcons;
  210. }
  211. return $result;
  212. }
  213. /**
  214. * Returns an array with information necessary for adding the viewDataTable to the footer.
  215. *
  216. * @param string $viewDataTableId
  217. *
  218. * @return array
  219. */
  220. private static function getFooterIconFor($viewDataTableId)
  221. {
  222. $tables = static::getAvailableViewDataTables();
  223. if (!array_key_exists($viewDataTableId, $tables)) {
  224. return;
  225. }
  226. $klass = $tables[$viewDataTableId];
  227. return array(
  228. 'id' => $klass::getViewDataTableId(),
  229. 'title' => Piwik::translate($klass::FOOTER_ICON_TITLE),
  230. 'icon' => $klass::FOOTER_ICON,
  231. );
  232. }
  233. public static function clearAllViewDataTableParameters()
  234. {
  235. Option::deleteLike('viewDataTableParameters_%');
  236. }
  237. public static function clearUserViewDataTableParameters($userLogin)
  238. {
  239. Option::deleteLike('viewDataTableParameters_' . $userLogin . '_%');
  240. }
  241. public static function getViewDataTableParameters($login, $controllerAction)
  242. {
  243. $paramsKey = self::buildViewDataTableParametersOptionKey($login, $controllerAction);
  244. $params = Option::get($paramsKey);
  245. if (empty($params)) {
  246. return array();
  247. }
  248. $params = json_decode($params);
  249. $params = (array) $params;
  250. return $params;
  251. }
  252. public static function saveViewDataTableParameters($login, $controllerAction, $parametersToOverride)
  253. {
  254. $params = self::getViewDataTableParameters($login, $controllerAction);
  255. foreach ($parametersToOverride as $key => $value) {
  256. if ($key === 'viewDataTable'
  257. && !empty($params[$key])
  258. && $params[$key] !== $value) {
  259. if (!empty($params['columns'])) {
  260. unset($params['columns']);
  261. }
  262. if (!empty($params['columns_to_display'])) {
  263. unset($params['columns_to_display']);
  264. }
  265. }
  266. $params[$key] = $value;
  267. }
  268. $paramsKey = self::buildViewDataTableParametersOptionKey($login, $controllerAction);
  269. Option::set($paramsKey, json_encode($params));
  270. }
  271. private static function buildViewDataTableParametersOptionKey($login, $controllerAction)
  272. {
  273. return sprintf('viewDataTableParameters_%s_%s', $login, $controllerAction);
  274. }
  275. }