PageRenderTime 52ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/UserCountryMap/Controller.php

https://github.com/CodeYellowBV/piwik
PHP | 266 lines | 206 code | 34 blank | 26 comment | 13 complexity | 2fe2015f2f736cfd619b419d4e6a8d74 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\UserCountryMap;
  10. use Exception;
  11. use Piwik\API\Request;
  12. use Piwik\Common;
  13. use Piwik\Config;
  14. use Piwik\Piwik;
  15. use Piwik\Plugins\Goals\API as APIGoals;
  16. use Piwik\Site;
  17. use Piwik\View;
  18. /**
  19. *
  20. */
  21. class Controller extends \Piwik\Plugin\Controller
  22. {
  23. // By default plot up to the last 30 days of visitors on the map, for low traffic sites
  24. const REAL_TIME_WINDOW = 'last30';
  25. public function visitorMap($fetch = false, $segmentOverride = false)
  26. {
  27. $this->checkUserCountryPluginEnabled();
  28. $idSite = Common::getRequestVar('idSite', 1, 'int');
  29. Piwik::checkUserHasViewAccess($idSite);
  30. $period = Common::getRequestVar('period');
  31. $date = Common::getRequestVar('date');
  32. $segment = $segmentOverride ? : Request::getRawSegmentFromRequest() ? : '';
  33. $token_auth = Piwik::getCurrentUserTokenAuth();
  34. $view = new View('@UserCountryMap/visitorMap');
  35. // request visits summary
  36. $request = new Request(
  37. 'method=VisitsSummary.get&format=PHP'
  38. . '&idSite=' . $idSite
  39. . '&period=' . $period
  40. . '&date=' . $date
  41. . '&segment=' . $segment
  42. . '&token_auth=' . $token_auth
  43. . '&filter_limit=-1'
  44. );
  45. $config = array();
  46. $config['visitsSummary'] = unserialize($request->process());
  47. $config['countryDataUrl'] = $this->_report('UserCountry', 'getCountry',
  48. $idSite, $period, $date, $token_auth, false, $segment);
  49. $config['regionDataUrl'] = $this->_report('UserCountry', 'getRegion',
  50. $idSite, $period, $date, $token_auth, true, $segment);
  51. $config['cityDataUrl'] = $this->_report('UserCountry', 'getCity',
  52. $idSite, $period, $date, $token_auth, true, $segment);
  53. $config['countrySummaryUrl'] = $this->getApiRequestUrl('VisitsSummary', 'get',
  54. $idSite, $period, $date, $token_auth, true, $segment);
  55. $view->defaultMetric = 'nb_visits';
  56. // some translations
  57. $view->localeJSON = Common::json_encode(array(
  58. 'nb_visits' => Piwik::translate('General_NVisits'),
  59. 'one_visit' => Piwik::translate('General_OneVisit'),
  60. 'no_visit' => Piwik::translate('UserCountryMap_NoVisit'),
  61. 'nb_actions' => Piwik::translate('VisitsSummary_NbActionsDescription'),
  62. 'nb_actions_per_visit' => Piwik::translate('VisitsSummary_NbActionsPerVisit'),
  63. 'bounce_rate' => Piwik::translate('VisitsSummary_NbVisitsBounced'),
  64. 'avg_time_on_site' => Piwik::translate('VisitsSummary_AverageVisitDuration'),
  65. 'and_n_others' => Piwik::translate('UserCountryMap_AndNOthers'),
  66. 'no_data' => Piwik::translate('CoreHome_ThereIsNoDataForThisReport'),
  67. 'nb_uniq_visitors' => Piwik::translate('VisitsSummary_NbUniqueVisitors')
  68. ));
  69. $view->reqParamsJSON = $this->getEnrichedRequest($params = array(
  70. 'period' => $period,
  71. 'idSite' => $idSite,
  72. 'date' => $date,
  73. 'segment' => $segment,
  74. 'token_auth' => $token_auth,
  75. 'enable_filter_excludelowpop' => 1,
  76. 'filter_excludelowpop_value' => -1
  77. ));
  78. $view->metrics = $config['metrics'] = $this->getMetrics($idSite, $period, $date, $token_auth);
  79. $config['svgBasePath'] = 'plugins/UserCountryMap/svg/';
  80. $config['mapCssPath'] = 'plugins/UserCountryMap/stylesheets/map.css';
  81. $view->config = Common::json_encode($config);
  82. $view->noData = empty($config['visitsSummary']['nb_visits']);
  83. return $view->render();
  84. }
  85. /**
  86. * Used to build the report Visitor > Real time map
  87. */
  88. public function realtimeWorldMap()
  89. {
  90. return $this->realtimeMap($standalone = true);
  91. }
  92. /**
  93. * @param bool $standalone When set to true, the Top controls will be hidden to provide better full screen view
  94. * @param bool $fetch
  95. * @param bool|string $segmentOverride
  96. *
  97. * @return string
  98. */
  99. public function realtimeMap($standalone = false, $fetch = false, $segmentOverride = false)
  100. {
  101. $this->checkUserCountryPluginEnabled();
  102. $idSite = Common::getRequestVar('idSite', 1, 'int');
  103. Piwik::checkUserHasViewAccess($idSite);
  104. $token_auth = Piwik::getCurrentUserTokenAuth();
  105. $view = new View('@UserCountryMap/realtimeMap');
  106. $view->mapIsStandaloneNotWidget = $standalone;
  107. $view->metrics = $this->getMetrics($idSite, 'range', self::REAL_TIME_WINDOW, $token_auth);
  108. $view->defaultMetric = 'nb_visits';
  109. $liveRefreshAfterMs = (int)Config::getInstance()->General['live_widget_refresh_after_seconds'] * 1000;
  110. $goals = APIGoals::getInstance()->getGoals($idSite);
  111. $site = new Site($idSite);
  112. $hasGoals = !empty($goals) || $site->isEcommerceEnabled();
  113. // maximum number of visits to be displayed in the map
  114. $maxVisits = Common::getRequestVar('filter_limit', 100, 'int');
  115. // some translations
  116. $locale = array(
  117. 'nb_actions' => Piwik::translate('VisitsSummary_NbActionsDescription'),
  118. 'local_time' => Piwik::translate('VisitTime_ColumnLocalTime'),
  119. 'from' => Piwik::translate('General_FromReferrer'),
  120. 'seconds' => Piwik::translate('UserCountryMap_Seconds'),
  121. 'seconds_ago' => Piwik::translate('UserCountryMap_SecondsAgo'),
  122. 'minutes' => Piwik::translate('UserCountryMap_Minutes'),
  123. 'minutes_ago' => Piwik::translate('UserCountryMap_MinutesAgo'),
  124. 'hours' => Piwik::translate('UserCountryMap_Hours'),
  125. 'hours_ago' => Piwik::translate('UserCountryMap_HoursAgo'),
  126. 'days_ago' => Piwik::translate('UserCountryMap_DaysAgo'),
  127. 'actions' => Piwik::translate('VisitsSummary_NbPageviewsDescription'),
  128. 'searches' => Piwik::translate('UserCountryMap_Searches'),
  129. 'goal_conversions' => Piwik::translate('UserCountryMap_GoalConversions'),
  130. );
  131. $segment = $segmentOverride ? : Request::getRawSegmentFromRequest() ? : '';
  132. $params = array(
  133. 'period' => 'range',
  134. 'idSite' => $idSite,
  135. 'segment' => $segment,
  136. 'token_auth' => $token_auth,
  137. );
  138. $realtimeWindow = Common::getRequestVar('realtimeWindow', self::REAL_TIME_WINDOW, 'string');
  139. if ($realtimeWindow != 'false') { // handle special value
  140. $params['date'] = $realtimeWindow;
  141. }
  142. $reqParams = $this->getEnrichedRequest($params, $encode = false);
  143. $view->config = array(
  144. 'metrics' => array(),
  145. 'svgBasePath' => $view->piwikUrl . 'plugins/UserCountryMap/svg/',
  146. 'liveRefreshAfterMs' => $liveRefreshAfterMs,
  147. '_' => $locale,
  148. 'reqParams' => $reqParams,
  149. 'siteHasGoals' => $hasGoals,
  150. 'maxVisits' => $maxVisits,
  151. 'changeVisitAlpha' => Common::getRequestVar('changeVisitAlpha', true, 'int'),
  152. 'removeOldVisits' => Common::getRequestVar('removeOldVisits', true, 'int'),
  153. 'showFooterMessage' => Common::getRequestVar('showFooterMessage', true, 'int'),
  154. 'showDateTime' => Common::getRequestVar('showDateTime', true, 'int'),
  155. 'doNotRefreshVisits' => Common::getRequestVar('doNotRefreshVisits', false, 'int'),
  156. 'enableAnimation' => Common::getRequestVar('enableAnimation', true, 'int'),
  157. 'forceNowValue' => Common::getRequestVar('forceNowValue', false, 'int')
  158. );
  159. return $view->render();
  160. }
  161. private function getEnrichedRequest($params, $encode = true)
  162. {
  163. $params['format'] = 'json';
  164. $params['showRawMetrics'] = 1;
  165. if (empty($params['segment'])) {
  166. $segment = \Piwik\API\Request::getRawSegmentFromRequest();
  167. if (!empty($segment)) {
  168. $params['segment'] = urldecode($segment);
  169. }
  170. }
  171. if ($encode) {
  172. $params = Common::json_encode($params);
  173. }
  174. return $params;
  175. }
  176. private function checkUserCountryPluginEnabled()
  177. {
  178. if (!\Piwik\Plugin\Manager::getInstance()->isPluginActivated('UserCountry')) {
  179. throw new Exception(Piwik::translate('General_Required', 'Plugin UserCountry'));
  180. }
  181. }
  182. private function getMetrics($idSite, $period, $date, $token_auth)
  183. {
  184. $request = new Request(
  185. 'method=API.getMetadata&format=PHP'
  186. . '&apiModule=UserCountry&apiAction=getCountry'
  187. . '&idSite=' . $idSite
  188. . '&period=' . $period
  189. . '&date=' . $date
  190. . '&token_auth=' . $token_auth
  191. . '&filter_limit=-1'
  192. );
  193. $metaData = $request->process();
  194. $metrics = array();
  195. foreach ($metaData[0]['metrics'] as $id => $val) {
  196. if (Common::getRequestVar('period') == 'day' || $id != 'nb_uniq_visitors') {
  197. $metrics[] = array($id, $val);
  198. }
  199. }
  200. foreach ($metaData[0]['processedMetrics'] as $id => $val) {
  201. $metrics[] = array($id, $val);
  202. }
  203. return $metrics;
  204. }
  205. private function getApiRequestUrl($module, $action, $idSite, $period, $date, $token_auth, $filter_by_country = false, $segmentOverride = false)
  206. {
  207. // use processed reports
  208. $url = "?module=" . $module
  209. . "&method=" . $module . "." . $action . "&format=JSON"
  210. . "&idSite=" . $idSite
  211. . "&period=" . $period
  212. . "&date=" . $date
  213. . "&token_auth=" . $token_auth
  214. . "&segment=" . ($segmentOverride ? : Request::getRawSegmentFromRequest())
  215. . "&enable_filter_excludelowpop=1"
  216. . "&showRawMetrics=1";
  217. if ($filter_by_country) {
  218. $url .= "&filter_column=country"
  219. . "&filter_sort_column=nb_visits"
  220. . "&filter_limit=-1"
  221. . "&filter_pattern=";
  222. } else {
  223. $url .= "&filter_limit=-1";
  224. }
  225. return $url;
  226. }
  227. private function _report($module, $action, $idSite, $period, $date, $token_auth, $filter_by_country = false, $segmentOverride = false)
  228. {
  229. return $this->getApiRequestUrl('API', 'getProcessedReport&apiModule=' . $module . '&apiAction=' . $action,
  230. $idSite, $period, $date, $token_auth, $filter_by_country, $segmentOverride);
  231. }
  232. }