Skip to content
Extraits de code Groupes Projets
Valider 3821a56d rédigé par diosmosis's avatar diosmosis
Parcourir les fichiers

Move more conversion/actions related logic from Visit::handle() to plugin...

Move more conversion/actions related logic from Visit::handle() to plugin specific RequestProcessors in manipulateVisitProperties method. Also temporarily made GoalManager a singleton that is set as a static var in GoalsRequestProcessor. Should be in DI, but until all of Visit::handle() is dealt w/, this can't be done.
parent 2ba74fba
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -12,6 +12,8 @@ use Piwik\Tracker\Visit\VisitProperties; ...@@ -12,6 +12,8 @@ use Piwik\Tracker\Visit\VisitProperties;
/** /**
* TODO * TODO
*
* TODO: maybe we should rename manipulateVisitProperties to afterRequestProcessed and rename processRequest to handleRequest or recordLogs
*/ */
abstract class RequestProcessor abstract class RequestProcessor
{ {
...@@ -26,7 +28,7 @@ abstract class RequestProcessor ...@@ -26,7 +28,7 @@ abstract class RequestProcessor
/** /**
* TODO * TODO
*/ */
public function manipulateVisitProperties(VisitProperties $visitProperties) public function manipulateVisitProperties(VisitProperties $visitProperties, Request $request)
{ {
return false; return false;
} }
......
...@@ -18,6 +18,7 @@ use Piwik\Exception\UnexpectedWebsiteFoundException; ...@@ -18,6 +18,7 @@ use Piwik\Exception\UnexpectedWebsiteFoundException;
use Piwik\Network\IPUtils; use Piwik\Network\IPUtils;
use Piwik\Piwik; use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension; use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\Goals\Tracker\GoalsRequestProcessor;
use Piwik\SettingsPiwik; use Piwik\SettingsPiwik;
use Piwik\Tracker; use Piwik\Tracker;
use Piwik\Tracker\Visit\VisitProperties; use Piwik\Tracker\Visit\VisitProperties;
...@@ -111,29 +112,6 @@ class Visit implements VisitInterface ...@@ -111,29 +112,6 @@ class Visit implements VisitInterface
} }
} }
/**
* Goals & Ecommerce conversions
*/
/** @var Action $action */
$action = $this->visitProperties->getRequestMetadata('Actions', 'action');
$goalManager = new GoalManager($this->request);
$isManualGoalConversion = $goalManager->isManualGoalConversion();
$requestIsEcommerce = $goalManager->requestIsEcommerce;
if (!empty($action)) {
if (!$requestIsEcommerce && !$isManualGoalConversion) {
$someGoalsConverted = $goalManager->detectGoalsMatchingUrl($this->request->getIdSite(), $action);
$this->visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted);
$this->visitProperties->setRequestMetadata('Goals', 'visitIsConverted', $someGoalsConverted);
$action->loadIdsFromLogActionTable();
}
}
/*** /***
* Visitor recognition * Visitor recognition
*/ */
...@@ -143,8 +121,15 @@ class Visit implements VisitInterface ...@@ -143,8 +121,15 @@ class Visit implements VisitInterface
$this->visitProperties->visitorInfo = $visitor->getVisitorInfo(); $this->visitProperties->visitorInfo = $visitor->getVisitorInfo();
/** @var Action $action */
$action = $this->visitProperties->getRequestMetadata('Actions', 'action');
$isNewVisit = $this->isVisitNew($visitor, $action); $isNewVisit = $this->isVisitNew($visitor, $action);
$goalManager = GoalsRequestProcessor::$goalManager;
$isManualGoalConversion = $goalManager->isManualGoalConversion();
$requestIsEcommerce = $goalManager->requestIsEcommerce;
// TODO: re-add optimization where if custom variables exist in request, don't bother selecting them in Visitor // TODO: re-add optimization where if custom variables exist in request, don't bother selecting them in Visitor
$this->visitorCustomVariables = $this->request->getCustomVariables($scope = 'visit'); $this->visitorCustomVariables = $this->request->getCustomVariables($scope = 'visit');
if (!empty($this->visitorCustomVariables)) { if (!empty($this->visitorCustomVariables)) {
...@@ -153,7 +138,7 @@ class Visit implements VisitInterface ...@@ -153,7 +138,7 @@ class Visit implements VisitInterface
} }
foreach ($this->requestProcessors as $processor) { foreach ($this->requestProcessors as $processor) {
$abort = $processor->manipulateVisitProperties($this->visitProperties); $abort = $processor->manipulateVisitProperties($this->visitProperties, $this->request);
if ($abort) { if ($abort) {
return; return;
} }
......
...@@ -28,4 +28,14 @@ class ActionsRequestProcessor extends RequestProcessor ...@@ -28,4 +28,14 @@ class ActionsRequestProcessor extends RequestProcessor
$visitProperties->setRequestMetadata('Actions', 'action', $action); $visitProperties->setRequestMetadata('Actions', 'action', $action);
} }
}
\ No newline at end of file public function manipulateVisitProperties(VisitProperties $visitProperties, Request $request)
{
/** @var Action $action */
$action = $visitProperties->getRequestMetadata('Actions', 'action');
if (!empty($action)) { // other plugins can unset the action if they want
$action->loadIdsFromLogActionTable();
}
}
}
...@@ -43,7 +43,7 @@ class VisitRequestProcessor extends RequestProcessor ...@@ -43,7 +43,7 @@ class VisitRequestProcessor extends RequestProcessor
return false; return false;
} }
public function manipulateVisitProperties(VisitProperties $visitProperties) public function manipulateVisitProperties(VisitProperties $visitProperties, Request $request)
{ {
/** /**
* Triggered after visits are tested for exclusion so plugins can modify the IP address * Triggered after visits are tested for exclusion so plugins can modify the IP address
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
namespace Piwik\Plugins\Goals\Tracker; namespace Piwik\Plugins\Goals\Tracker;
use Piwik\Common; use Piwik\Common;
use Piwik\Tracker\Action;
use Piwik\Tracker\GoalManager; use Piwik\Tracker\GoalManager;
use Piwik\Tracker\Request; use Piwik\Tracker\Request;
use Piwik\Tracker\RequestProcessor; use Piwik\Tracker\RequestProcessor;
...@@ -21,13 +22,20 @@ use Piwik\Tracker\Visit\VisitProperties; ...@@ -21,13 +22,20 @@ use Piwik\Tracker\Visit\VisitProperties;
*/ */
class GoalsRequestProcessor extends RequestProcessor class GoalsRequestProcessor extends RequestProcessor
{ {
/**
* TODO: GoalManager should be stateless and stored in DI.
*
* @var GoalManager
*/
public static $goalManager = null;
public function processRequestParams(VisitProperties $visitProperties, Request $request) public function processRequestParams(VisitProperties $visitProperties, Request $request)
{ {
$goalManager = new GoalManager($request); // TODO: GoalManager should be stateless and stored in DI. self::$goalManager = new GoalManager($request);
if ($goalManager->isManualGoalConversion()) { if (self::$goalManager->isManualGoalConversion()) {
// this request is from the JS call to piwikTracker.trackGoal() // this request is from the JS call to piwikTracker.trackGoal()
$someGoalsConverted = $goalManager->detectGoalId($request->getIdSite()); $someGoalsConverted = self::$goalManager->detectGoalId($request->getIdSite());
$visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted); $visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted);
$visitProperties->setRequestMetadata('Goals', 'visitIsConverted', $someGoalsConverted); $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', $someGoalsConverted);
...@@ -36,11 +44,30 @@ class GoalsRequestProcessor extends RequestProcessor ...@@ -36,11 +44,30 @@ class GoalsRequestProcessor extends RequestProcessor
// if we find a idgoal in the URL, but then the goal is not valid, this is most likely a fake request // if we find a idgoal in the URL, but then the goal is not valid, this is most likely a fake request
if (!$someGoalsConverted) { if (!$someGoalsConverted) {
Common::printDebug('Invalid goal tracking request for goal id = ' . $goalManager->idGoal); Common::printDebug('Invalid goal tracking request for goal id = ' . self::$goalManager->idGoal);
return true; return true;
} }
} }
return false; return false;
} }
}
\ No newline at end of file public function manipulateVisitProperties(VisitProperties $visitProperties, Request $request)
{
$visitsConverted = $visitProperties->getRequestMetadata('Goals', 'visitIsConverted');
/** @var Action $action */
$action = $visitProperties->getRequestMetadata('Actions', 'action');
// if the visit hasn't already been converted another way (ie, manual goal conversion or ecommerce conversion,
// try to convert based on the action)
if (!$visitsConverted
&& $action
) {
$someGoalsConverted = self::$goalManager->detectGoalsMatchingUrl($request->getIdSite(), $action);
$visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', $someGoalsConverted);
$visitProperties->setRequestMetadata('Goals', 'visitIsConverted', $someGoalsConverted);
}
}
}
...@@ -24,7 +24,12 @@ class PingRequestProcessor extends RequestProcessor ...@@ -24,7 +24,12 @@ class PingRequestProcessor extends RequestProcessor
Common::printDebug("-> ping=1 request: we do not track a new action nor a new visit nor any goal."); 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('Actions', 'action', null);
}
}
public function manipulateVisitProperties(VisitProperties $visitProperties, Request $request)
{
if ($this->isPingRequest($request)) {
$visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', false); $visitProperties->setRequestMetadata('Goals', 'someGoalsConverted', false);
$visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false); $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false);
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter