Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Goals/VisitorDetails.php')
-rw-r--r--plugins/Goals/VisitorDetails.php124
1 files changed, 124 insertions, 0 deletions
diff --git a/plugins/Goals/VisitorDetails.php b/plugins/Goals/VisitorDetails.php
new file mode 100644
index 0000000000..0d45b06367
--- /dev/null
+++ b/plugins/Goals/VisitorDetails.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Goals;
+
+use Piwik\Common;
+use Piwik\Config;
+use Piwik\Date;
+use Piwik\Db;
+use Piwik\Metrics\Formatter;
+use Piwik\Piwik;
+use Piwik\Plugins\CustomVariables\CustomVariables;
+use Piwik\Plugins\Live\VisitorDetailsAbstract;
+use Piwik\Site;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\PageUrl;
+
+class VisitorDetails extends VisitorDetailsAbstract
+{
+ const EVENT_VALUE_PRECISION = 3;
+
+ protected $lastGoalResults = array();
+ protected $lastVisitIds = array();
+
+ public function extendVisitorDetails(&$visitor)
+ {
+ $idVisit = $visitor['idVisit'];
+
+ if (in_array($idVisit, $this->lastVisitIds)) {
+ $goalConversionDetails = isset($this->lastGoalResults[$idVisit]) ? $this->lastGoalResults[$idVisit] : array();
+ } else {
+ $goalConversionDetails = $this->queryGoalConversionsForVisits(array($idVisit));
+ }
+
+ $visitor['goalConversions'] = count($goalConversionDetails);
+ }
+
+ public function provideActionsForVisitIds(&$actions, $idVisits)
+ {
+ $this->lastVisitIds = $idVisits;
+ $this->lastGoalResults = array();
+ $goalConversionDetails = $this->queryGoalConversionsForVisits($idVisits);
+
+ // use while / array_shift combination instead of foreach to save memory
+ while (is_array($goalConversionDetails) && count($goalConversionDetails)) {
+ $goalConversionDetail = array_shift($goalConversionDetails);
+ $idVisit = $goalConversionDetail['idvisit'];
+
+ unset($goalConversionDetail['idvisit']);
+
+ $this->lastGoalResults[$idVisit][] = $actions[$idVisit][] = $goalConversionDetail;
+ }
+ }
+
+ /**
+ * @param $idVisit
+ * @return array
+ * @throws \Exception
+ */
+ protected function queryGoalConversionsForVisits($idVisits)
+ {
+ $sql = "
+ SELECT
+ log_conversion.idvisit,
+ 'goal' as type,
+ goal.name as goalName,
+ goal.idgoal as goalId,
+ log_conversion.revenue as revenue,
+ log_conversion.idlink_va,
+ log_conversion.idlink_va as goalPageId,
+ log_conversion.server_time as serverTimePretty,
+ log_conversion.url as url
+ FROM " . Common::prefixTable('log_conversion') . " AS log_conversion
+ LEFT JOIN " . Common::prefixTable('goal') . " AS goal
+ ON (goal.idsite = log_conversion.idsite
+ AND
+ goal.idgoal = log_conversion.idgoal)
+ AND goal.deleted = 0
+ WHERE log_conversion.idvisit IN ('" . implode("','", $idVisits) . "')
+ AND log_conversion.idgoal > 0
+ ORDER BY log_conversion.idvisit, server_time ASC
+ ";
+ return Db::fetchAll($sql);
+ }
+
+
+ public function initProfile($visits, &$profile)
+ {
+ $profile['totalGoalConversions'] = 0;
+ $profile['totalConversionsByGoal'] = array();
+ }
+
+ public function handleProfileVisit($visit, &$profile)
+ {
+ $profile['totalGoalConversions'] += $visit->getColumn('goalConversions');
+ }
+
+ public function handleProfileAction($action, &$profile)
+ {
+ if ($action['type'] != 'goal') {
+ return;
+ }
+
+ $idGoal = $action['goalId'];
+ $idGoalKey = 'idgoal=' . $idGoal;
+
+ if (!isset($profile['totalConversionsByGoal'][$idGoalKey])) {
+ $profile['totalConversionsByGoal'][$idGoalKey] = 0;
+ }
+ ++$profile['totalConversionsByGoal'][$idGoalKey];
+
+ if (!empty($action['revenue'])) {
+ if (!isset($profile['totalRevenueByGoal'][$idGoalKey])) {
+ $profile['totalRevenueByGoal'][$idGoalKey] = 0;
+ }
+ $profile['totalRevenueByGoal'][$idGoalKey] += $action['revenue'];
+ }
+ }
+} \ No newline at end of file