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:
-rw-r--r--config/global.ini.php1
-rw-r--r--core/Plugin.php13
-rw-r--r--core/Plugin/Manager.php4
-rw-r--r--core/Tracker/Visit.php25
-rw-r--r--plugins/Actions/Tracker/ActionsRequestProcessor.php31
-rw-r--r--plugins/Actions/config/config.php9
-rw-r--r--plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php2
-rw-r--r--plugins/Goals/Tracker/GoalsRequestProcessor.php2
-rw-r--r--plugins/Heartbeat/Heartbeat.php19
-rw-r--r--plugins/Heartbeat/Tracker/PingRequestProcessor.php37
-rw-r--r--plugins/Heartbeat/config/config.php9
-rw-r--r--plugins/Heartbeat/plugin.json3
12 files changed, 136 insertions, 19 deletions
diff --git a/config/global.ini.php b/config/global.ini.php
index a6ba89234c..ba88a53e29 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -777,6 +777,7 @@ Plugins[] = TestRunner
Plugins[] = BulkTracking
Plugins[] = Resolution
Plugins[] = DevicePlugins
+Plugins[] = Heartbeat
Plugins[] = Intl
[PluginsInstalled]
diff --git a/core/Plugin.php b/core/Plugin.php
index 1cdbefdc7f..33bf3730e5 100644
--- a/core/Plugin.php
+++ b/core/Plugin.php
@@ -451,6 +451,19 @@ class Plugin
}
/**
+ * Override this method in your plugin class if you want your plugin to be loaded during tracking.
+ *
+ * Note: If you define your own dimension or handle a tracker event, your plugin will automatically
+ * be detected as a tracker plugin.
+ *
+ * @return bool
+ */
+ public function isTrackerPlugin()
+ {
+ return false;
+ }
+
+ /**
* @param $directoryWithinPlugin
* @param $expectedSubclass
* @return array
diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php
index ff4c3553dc..77b058b113 100644
--- a/core/Plugin/Manager.php
+++ b/core/Plugin/Manager.php
@@ -1102,6 +1102,10 @@ class Manager
return true;
}
+ if ($plugin->isTrackerPlugin()) {
+ return true;
+ }
+
return false;
}
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index 997fd4f805..123d3f931b 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -114,29 +114,16 @@ class Visit implements VisitInterface
/**
* Goals & Ecommerce conversions
*/
- $isManualGoalConversion = $requestIsEcommerce = false;
- $action = null;
- $goalManager = null;
+ /** @var Action $action */
+ $action = $this->visitProperties->getRequestMetadata('Actions', 'action');
- if($this->isPingRequest()) {
- // on a ping request that is received before the standard visit length, we just update the visit time w/o adding a new action
- Common::printDebug("-> ping=1 request: we do not track a new action nor a new visit nor any goal.");
+ $goalManager = new GoalManager($this->request);
+ $isManualGoalConversion = $goalManager->isManualGoalConversion();
+ $requestIsEcommerce = $goalManager->requestIsEcommerce;
- $action = null;
- $this->visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', false);
- $this->visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false);
- } else {
-
- $goalManager = new GoalManager($this->request);
-
- $isManualGoalConversion = $goalManager->isManualGoalConversion();
- $requestIsEcommerce = $goalManager->requestIsEcommerce;
+ if (!empty($action)) {
if (!$requestIsEcommerce && !$isManualGoalConversion) {
- // normal page view, potentially triggering a URL matching goal
- $action = Action::factory($this->request);
-
- $action->writeDebugInfo();
$someGoalsConverted = $goalManager->detectGoalsMatchingUrl($this->request->getIdSite(), $action);
$this->visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted);
diff --git a/plugins/Actions/Tracker/ActionsRequestProcessor.php b/plugins/Actions/Tracker/ActionsRequestProcessor.php
new file mode 100644
index 0000000000..5b19b0ac9f
--- /dev/null
+++ b/plugins/Actions/Tracker/ActionsRequestProcessor.php
@@ -0,0 +1,31 @@
+<?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\Actions\Tracker;
+
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\RequestProcessor;
+use Piwik\Tracker\Visit\VisitProperties;
+
+/**
+ * TODO
+ *
+ * TODO: document request metadata here (ie, 'actions')
+ */
+class ActionsRequestProcessor extends RequestProcessor
+{
+ public function processRequestParams(VisitProperties $visitProperties, Request $request)
+ {
+ // normal page view, potentially triggering a URL matching goal
+ $action = Action::factory($request);
+ $action->writeDebugInfo();
+
+ $visitProperties->setRequestMetadata('Actions', 'action', $action);
+ }
+} \ No newline at end of file
diff --git a/plugins/Actions/config/config.php b/plugins/Actions/config/config.php
new file mode 100644
index 0000000000..293acee476
--- /dev/null
+++ b/plugins/Actions/config/config.php
@@ -0,0 +1,9 @@
+<?php
+
+return array(
+
+ 'tracker.request.processors' => DI\add(array(
+ DI\get('Piwik\Plugins\Actions\Tracker\ActionsRequestProcessor'),
+ )),
+
+);
diff --git a/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php b/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php
index b5f0064728..41451a043e 100644
--- a/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php
+++ b/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php
@@ -29,6 +29,8 @@ class EcommerceRequestProcessor extends RequestProcessor
if ($goalManager->isGoalAnOrder()) {
$visitProperties->setRequestMetadata('Goals', 'visitIsConverted', true);
}
+
+ $visitProperties->setRequestMetadata('Actions', 'action', null); // don't track actions when tracking ecommerce orders
}
}
} \ No newline at end of file
diff --git a/plugins/Goals/Tracker/GoalsRequestProcessor.php b/plugins/Goals/Tracker/GoalsRequestProcessor.php
index ac475e5733..0cadff1a21 100644
--- a/plugins/Goals/Tracker/GoalsRequestProcessor.php
+++ b/plugins/Goals/Tracker/GoalsRequestProcessor.php
@@ -32,6 +32,8 @@ class GoalsRequestProcessor extends RequestProcessor
$visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted);
$visitProperties->setRequestMetadata('Goals', 'visitIsConverted', $someGoalsConverted);
+ $visitProperties->setRequestMetadata('Actions', 'action', null); // don't track actions when doing manual goal conversions
+
// if we find a idgoal in the URL, but then the goal is not valid, this is most likely a fake request
if (!$someGoalsConverted) {
Common::printDebug('Invalid goal tracking request for goal id = ' . $goalManager->idGoal);
diff --git a/plugins/Heartbeat/Heartbeat.php b/plugins/Heartbeat/Heartbeat.php
new file mode 100644
index 0000000000..688ac72c65
--- /dev/null
+++ b/plugins/Heartbeat/Heartbeat.php
@@ -0,0 +1,19 @@
+<?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\Heartbeat;
+
+use Piwik\Plugin;
+
+class Heartbeat extends Plugin
+{
+ public function isTrackerPlugin()
+ {
+ return true;
+ }
+}
diff --git a/plugins/Heartbeat/Tracker/PingRequestProcessor.php b/plugins/Heartbeat/Tracker/PingRequestProcessor.php
new file mode 100644
index 0000000000..44224ce0ab
--- /dev/null
+++ b/plugins/Heartbeat/Tracker/PingRequestProcessor.php
@@ -0,0 +1,37 @@
+<?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\Heartbeat\Tracker;
+
+use Piwik\Common;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\RequestProcessor;
+use Piwik\Tracker\Visit\VisitProperties;
+
+/**
+ * TODO
+ */
+class PingRequestProcessor extends RequestProcessor
+{
+ public function processRequestParams(VisitProperties $visitProperties, Request $request)
+ {
+ if ($this->isPingRequest($request)) {
+ // on a ping request that is received before the standard visit length, we just update the visit time w/o adding a new action
+ Common::printDebug("-> ping=1 request: we do not track a new action nor a new visit nor any goal.");
+
+ $visitProperties->setRequestMetadata('Actions', 'action', null);
+
+ $visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', false);
+ $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false);
+ }
+ }
+
+ private function isPingRequest(Request $request)
+ {
+ return $request->getParam('ping') == 1;
+ }
+} \ No newline at end of file
diff --git a/plugins/Heartbeat/config/config.php b/plugins/Heartbeat/config/config.php
new file mode 100644
index 0000000000..6f7a1417ab
--- /dev/null
+++ b/plugins/Heartbeat/config/config.php
@@ -0,0 +1,9 @@
+<?php
+
+return array(
+
+ 'tracker.request.processors' => DI\add(array(
+ DI\get('Piwik\Plugins\Heartbeat\Tracker\PingRequestProcessor'),
+ )),
+
+);
diff --git a/plugins/Heartbeat/plugin.json b/plugins/Heartbeat/plugin.json
new file mode 100644
index 0000000000..3d028b75db
--- /dev/null
+++ b/plugins/Heartbeat/plugin.json
@@ -0,0 +1,3 @@
+{
+ "description": "Handles ping tracker requests."
+} \ No newline at end of file