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--core/Db/Schema/Mysql.php23
-rw-r--r--core/Plugin/VisitDimension.php49
-rw-r--r--core/Tracker/Action.php4
-rw-r--r--core/Tracker/GoalManager.php105
-rw-r--r--core/Tracker/Referrer.php301
-rw-r--r--core/Tracker/Settings.php30
-rw-r--r--core/Tracker/Visit.php51
-rw-r--r--core/Tracker/Visitor.php11
-rw-r--r--piwik.php1
-rw-r--r--plugins/CoreHome/Columns/IdSite.php11
-rw-r--r--plugins/CoreHome/Columns/VisitLastActionTime.php1
-rw-r--r--plugins/CoreHome/Columns/VisitorDaysSinceFirst.php11
-rw-r--r--plugins/CoreHome/Columns/VisitorDaysSinceOrder.php11
-rw-r--r--plugins/CoreHome/Columns/VisitorReturning.php12
-rw-r--r--plugins/CoreHome/Columns/VisitsCount.php11
-rw-r--r--plugins/Referrers/Columns/Base.php91
-rw-r--r--plugins/Referrers/Columns/Keyword.php11
-rw-r--r--plugins/Referrers/Columns/ReferrerName.php11
-rw-r--r--plugins/Referrers/Columns/ReferrerType.php11
-rw-r--r--plugins/Referrers/Columns/ReferrerVisitServerDate.php35
-rw-r--r--plugins/UserCountry/Columns/City.php11
-rw-r--r--plugins/UserCountry/Columns/Country.php24
-rw-r--r--plugins/UserCountry/Columns/Latitude.php11
-rw-r--r--plugins/UserCountry/Columns/Longitude.php11
-rw-r--r--plugins/UserCountry/Columns/Region.php11
-rw-r--r--plugins/UserSettings/Columns/PluginCookie.php37
-rw-r--r--plugins/UserSettings/Columns/PluginDirector.php37
-rw-r--r--plugins/UserSettings/Columns/PluginFlash.php37
-rw-r--r--plugins/UserSettings/Columns/PluginGears.php37
-rw-r--r--plugins/UserSettings/Columns/PluginJava.php37
-rw-r--r--plugins/UserSettings/Columns/PluginPdf.php37
-rw-r--r--plugins/UserSettings/Columns/PluginQuickTime.php37
-rw-r--r--plugins/UserSettings/Columns/PluginRealPlayer.php37
-rw-r--r--plugins/UserSettings/Columns/PluginSilverlight.php37
-rw-r--r--plugins/UserSettings/Columns/PluginWindowsMedia.php37
35 files changed, 747 insertions, 482 deletions
diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php
index f23321be43..2a0a8144f2 100644
--- a/core/Db/Schema/Mysql.php
+++ b/core/Db/Schema/Mysql.php
@@ -150,16 +150,6 @@ class Mysql implements SchemaInterface
idvisitor BINARY(8) NOT NULL,
visit_last_action_time DATETIME NOT NULL,
config_id BINARY(8) NOT NULL,
- config_pdf TINYINT(1) NOT NULL,
- config_flash TINYINT(1) NOT NULL,
- config_java TINYINT(1) NOT NULL,
- config_director TINYINT(1) NOT NULL,
- config_quicktime TINYINT(1) NOT NULL,
- config_realplayer TINYINT(1) NOT NULL,
- config_windowsmedia TINYINT(1) NOT NULL,
- config_gears TINYINT(1) NOT NULL,
- config_silverlight TINYINT(1) NOT NULL,
- config_cookie TINYINT(1) NOT NULL,
location_ip VARBINARY(16) NOT NULL,
PRIMARY KEY(idvisit),
INDEX index_idsite_config_datetime (idsite, config_id, visit_last_action_time),
@@ -198,19 +188,6 @@ class Mysql implements SchemaInterface
server_time datetime NOT NULL,
idaction_url int(11) default NULL,
idlink_va int(11) default NULL,
- referer_visit_server_date date default NULL,
- referer_type int(10) unsigned default NULL,
- referer_name varchar(70) default NULL,
- referer_keyword varchar(255) default NULL,
- visitor_returning tinyint(1) NOT NULL,
- visitor_count_visits SMALLINT(5) UNSIGNED NOT NULL,
- visitor_days_since_first SMALLINT(5) UNSIGNED NOT NULL,
- visitor_days_since_order SMALLINT(5) UNSIGNED NOT NULL,
- location_country char(3) NOT NULL,
- location_region char(2) DEFAULT NULL,
- location_city varchar(255) DEFAULT NULL,
- location_latitude float(10, 6) DEFAULT NULL,
- location_longitude float(10, 6) DEFAULT NULL,
url text NOT NULL,
idgoal int(10) NOT NULL,
buster int unsigned NOT NULL,
diff --git a/core/Plugin/VisitDimension.php b/core/Plugin/VisitDimension.php
index d8434f9ee9..451ba7b181 100644
--- a/core/Plugin/VisitDimension.php
+++ b/core/Plugin/VisitDimension.php
@@ -10,7 +10,6 @@ namespace Piwik\Plugin;
use Piwik\Common;
use Piwik\Db;
-use Piwik\Tracker\Request;
use Piwik\Plugin\Manager as PluginManager;
/**
@@ -36,6 +35,14 @@ abstract class VisitDimension
}
+ public function hasImplementedEvent($method)
+ {
+ $reflectionObject = new \ReflectionObject($this);
+ $declaringClass = $reflectionObject->getMethod($method)->getDeclaringClass();
+
+ return get_class() !== $declaringClass->name;
+ }
+
public function install()
{
if (empty($this->fieldName) || empty($this->fieldType)) {
@@ -43,8 +50,24 @@ abstract class VisitDimension
}
try {
- $sql = "ALTER TABLE `" . Common::prefixTable("log_visit") . "` ADD `$this->fieldName` $this->fieldType";
- Db::exec($sql);
+ if ($this->hasImplementedEvent('onNewVisit')
+ || $this->hasImplementedEvent('onExistingVisit')
+ || $this->hasImplementedEvent('onConvertedVisit') ) {
+ $sql = "ALTER TABLE `" . Common::prefixTable("log_visit") . "` ADD `$this->fieldName` $this->fieldType;";
+ Db::exec($sql);
+ }
+
+ } catch (\Exception $e) {
+ if (!Db::get()->isErrNo($e, '1060')) {
+ throw $e;
+ }
+ }
+
+ try {
+ if ($this->hasImplementedEvent('onRecordGoal')) {
+ $sql = "ALTER TABLE `" . Common::prefixTable("log_conversion") . "` ADD `$this->fieldName` $this->fieldType;";
+ Db::exec($sql);
+ }
} catch (\Exception $e) {
if (!Db::get()->isErrNo($e, '1060')) {
@@ -82,6 +105,26 @@ abstract class VisitDimension
return $this->fieldName;
}
+ public function onNewVisit()
+ {
+ return false;
+ }
+
+ public function onExistingVisit()
+ {
+ return false;
+ }
+
+ public function onConvertedVisit()
+ {
+ return false;
+ }
+
+ public function onRecordGoal()
+ {
+ return false;
+ }
+
abstract public function getName();
/** @return \Piwik\Plugin\VisitDimension[] */
diff --git a/core/Tracker/Action.php b/core/Tracker/Action.php
index 75ea3fd58f..02067c2101 100644
--- a/core/Tracker/Action.php
+++ b/core/Tracker/Action.php
@@ -78,9 +78,11 @@ abstract class Action
{
$key = array_search($actionType->getActionType(), self::$factoryPriority);
- if (!$key) {
+ if (false === $key) {
return -1;
}
+
+ return $key;
}
public function shouldHandle()
diff --git a/core/Tracker/GoalManager.php b/core/Tracker/GoalManager.php
index daa88bd7b9..9d7ece7c05 100644
--- a/core/Tracker/GoalManager.php
+++ b/core/Tracker/GoalManager.php
@@ -12,6 +12,7 @@ use Exception;
use Piwik\Common;
use Piwik\Config;
use Piwik\Piwik;
+use Piwik\Plugin\VisitDimension;
use Piwik\Plugins\CustomVariables\CustomVariables;
use Piwik\Tracker;
@@ -186,43 +187,23 @@ class GoalManager
/**
* Records one or several goals matched in this request.
*
- * @param int $idSite
+ * @param Visitor $visitor
* @param array $visitorInformation
* @param array $visitCustomVariables
* @param Action $action
*/
- public function recordGoals($idSite, $visitorInformation, $visitCustomVariables, $action)
+ public function recordGoals(Visitor $visitor, $visitorInformation, $visitCustomVariables, $action)
{
- $referrerTimestamp = $this->request->getParam('_refts');
- $referrerUrl = $this->request->getParam('_ref');
- $referrerCampaignName = trim(urldecode($this->request->getParam('_rcn')));
- $referrerCampaignKeyword = trim(urldecode($this->request->getParam('_rck')));
- $browserLanguage = $this->request->getBrowserLanguage();
-
- $location_country = isset($visitorInformation['location_country'])
- ? $visitorInformation['location_country']
- : Common::getCountry(
- $browserLanguage,
- $enableLanguageToCountryGuess = Config::getInstance()->Tracker['enable_language_to_country_guess'],
- $visitorInformation['location_ip']
- );
-
$goal = array(
- 'idvisit' => $visitorInformation['idvisit'],
- 'idsite' => $idSite,
- 'idvisitor' => $visitorInformation['idvisitor'],
- 'server_time' => Tracker::getDatetimeFromTimestamp($visitorInformation['visit_last_action_time']),
- 'location_country' => $location_country,
- 'visitor_returning' => $visitorInformation['visitor_returning'],
- 'visitor_days_since_first' => $visitorInformation['visitor_days_since_first'],
- 'visitor_days_since_order' => $visitorInformation['visitor_days_since_order'],
- 'visitor_count_visits' => $visitorInformation['visitor_count_visits'],
+ 'idvisit' => $visitorInformation['idvisit'],
+ 'idvisitor' => $visitorInformation['idvisitor'],
+ 'server_time' => Tracker::getDatetimeFromTimestamp($visitorInformation['visit_last_action_time'])
);
- $extraLocationCols = array('location_region', 'location_city', 'location_latitude', 'location_longitude');
- foreach ($extraLocationCols as $col) {
- if (isset($visitorInformation[$col])) {
- $goal[$col] = $visitorInformation[$col];
+ foreach (VisitDimension::getAllDimensions() as $dimension) {
+ $value = $dimension->onRecordGoal($this->request, $visitor, $action);
+ if (false !== $value) {
+ $goal[$dimension->getFieldName()] = $value;
}
}
@@ -244,55 +225,6 @@ class GoalManager
}
}
- // Attributing the correct Referrer to this conversion.
- // Priority order is as follows:
- // 0) In some cases, the campaign is not passed from the JS so we look it up from the current visit
- // 1) Campaign name/kwd parsed in the JS
- // 2) Referrer URL stored in the _ref cookie
- // 3) If no info from the cookie, attribute to the current visit referrer
-
- // 3) Default values: current referrer
- $type = $visitorInformation['referer_type'];
- $name = $visitorInformation['referer_name'];
- $keyword = $visitorInformation['referer_keyword'];
- $time = $visitorInformation['visit_first_action_time'];
-
- // 0) In some (unknown!?) cases the campaign is not found in the attribution cookie, but the URL ref was found.
- // In this case we look up if the current visit is credited to a campaign and will credit this campaign rather than the URL ref (since campaigns have higher priority)
- if (empty($referrerCampaignName)
- && $type == Common::REFERRER_TYPE_CAMPAIGN
- && !empty($name)
- ) {
- // Use default values per above
- } // 1) Campaigns from 1st party cookie
- elseif (!empty($referrerCampaignName)) {
- $type = Common::REFERRER_TYPE_CAMPAIGN;
- $name = $referrerCampaignName;
- $keyword = $referrerCampaignKeyword;
- $time = $referrerTimestamp;
- } // 2) Referrer URL parsing
- elseif (!empty($referrerUrl)) {
- $referrer = new Referrer();
- $referrer = $referrer->getReferrerInformation($referrerUrl, $currentUrl = '', $idSite);
-
- // if the parsed referrer is interesting enough, ie. website or search engine
- if (in_array($referrer['referer_type'], array(Common::REFERRER_TYPE_SEARCH_ENGINE, Common::REFERRER_TYPE_WEBSITE))) {
- $type = $referrer['referer_type'];
- $name = $referrer['referer_name'];
- $keyword = $referrer['referer_keyword'];
- $time = $referrerTimestamp;
- }
- }
- $this->setCampaignValuesToLowercase($type, $name, $keyword);
-
- $goal += array(
- 'referer_type' => $type,
- 'referer_name' => $name,
- 'referer_keyword' => $keyword,
- // this field is currently unused
- 'referer_visit_server_date' => date("Y-m-d", $time),
- );
-
// some goals are converted, so must be ecommerce Order or Cart Update
if ($this->requestIsEcommerce) {
$this->recordEcommerceGoal($goal, $visitorInformation);
@@ -841,23 +773,6 @@ class GoalManager
}
/**
- * @param $type
- * @param $name
- * @param $keyword
- */
- protected function setCampaignValuesToLowercase($type, &$name, &$keyword)
- {
- if ($type === Common::REFERRER_TYPE_CAMPAIGN) {
- if (!empty($name)) {
- $name = Common::mb_strtolower($name);
- }
- if (!empty($keyword)) {
- $keyword = Common::mb_strtolower($keyword);
- }
- }
- }
-
- /**
* @param $goal
* @param $pattern_type
* @param $url
diff --git a/core/Tracker/Referrer.php b/core/Tracker/Referrer.php
deleted file mode 100644
index 12d8ff747d..0000000000
--- a/core/Tracker/Referrer.php
+++ /dev/null
@@ -1,301 +0,0 @@
-<?php
-/**
- * Piwik - Open source web analytics
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Tracker;
-
-use Piwik\Common;
-use Piwik\Piwik;
-use Piwik\UrlHelper;
-
-/**
- */
-class Referrer
-{
- // @see detect*() referrer methods
- protected $typeReferrerAnalyzed;
- protected $nameReferrerAnalyzed;
- protected $keywordReferrerAnalyzed;
- protected $referrerHost;
- protected $referrerUrl;
- protected $referrerUrlParse;
- protected $currentUrlParse;
- protected $idsite;
-
- // Used to prefix when a adsense referrer is detected
- const LABEL_PREFIX_ADWORDS_KEYWORD = '(adwords) ';
- const LABEL_ADWORDS_NAME = 'AdWords';
-
- /**
- * Returns an array containing the following information:
- * - referer_type
- * - direct -- absence of referrer URL OR referrer URL has the same host
- * - site -- based on the referrer URL
- * - search_engine -- based on the referrer URL
- * - campaign -- based on campaign URL parameter
- *
- * - referer_name
- * - ()
- * - piwik.net -- site host name
- * - google.fr -- search engine host name
- * - adwords-search -- campaign name
- *
- * - referer_keyword
- * - ()
- * - ()
- * - my keyword
- * - my paid keyword
- * - ()
- * - ()
- *
- * - referer_url : the same for all the referrer types
- *
- * @param string $referrerUrl must be URL Encoded
- * @param string $currentUrl
- * @param int $idSite
- * @return array
- */
- public function getReferrerInformation($referrerUrl, $currentUrl, $idSite)
- {
- $this->idsite = $idSite;
-
- // default values for the referer_* fields
- $referrerUrl = Common::unsanitizeInputValue($referrerUrl);
- if (!empty($referrerUrl)
- && !UrlHelper::isLookLikeUrl($referrerUrl)
- ) {
- $referrerUrl = '';
- }
-
- $currentUrl = PageUrl::cleanupUrl($currentUrl);
-
- $this->referrerUrl = $referrerUrl;
- $this->referrerUrlParse = @parse_url($this->referrerUrl);
- $this->currentUrlParse = @parse_url($currentUrl);
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
- $this->nameReferrerAnalyzed = '';
- $this->keywordReferrerAnalyzed = '';
- $this->referrerHost = '';
-
- if (isset($this->referrerUrlParse['host'])) {
- $this->referrerHost = $this->referrerUrlParse['host'];
- }
-
- $referrerDetected = $this->detectReferrerCampaign();
-
- if (!$referrerDetected) {
- if ($this->detectReferrerDirectEntry()
- || $this->detectReferrerSearchEngine()
- ) {
- $referrerDetected = true;
- }
- }
-
- if (!empty($this->referrerHost)
- && !$referrerDetected
- ) {
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_WEBSITE;
- $this->nameReferrerAnalyzed = Common::mb_strtolower($this->referrerHost);
- }
-
- $referrerInformation = array(
- 'referer_type' => $this->typeReferrerAnalyzed,
- 'referer_name' => $this->nameReferrerAnalyzed,
- 'referer_keyword' => $this->keywordReferrerAnalyzed,
- 'referer_url' => $this->referrerUrl,
- );
-
- return $referrerInformation;
- }
-
- /**
- * Search engine detection
- * @return bool
- */
- protected function detectReferrerSearchEngine()
- {
- $searchEngineInformation = UrlHelper::extractSearchEngineInformationFromUrl($this->referrerUrl);
-
- /**
- * Triggered when detecting the search engine of a referrer URL.
- *
- * Plugins can use this event to provide custom search engine detection
- * logic.
- *
- * @param array &$searchEngineInformation An array with the following information:
- *
- * - **name**: The search engine name.
- * - **keywords**: The search keywords used.
- *
- * This parameter is initialized to the results
- * of Piwik's default search engine detection
- * logic.
- * @param string referrerUrl The referrer URL from the tracking request.
- */
- Piwik::postEvent('Tracker.detectReferrerSearchEngine', array(&$searchEngineInformation, $this->referrerUrl));
- if ($searchEngineInformation === false) {
- return false;
- }
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_SEARCH_ENGINE;
- $this->nameReferrerAnalyzed = $searchEngineInformation['name'];
- $this->keywordReferrerAnalyzed = $searchEngineInformation['keywords'];
- return true;
- }
-
- /**
- * @param string $string
- * @return bool
- */
- protected function detectCampaignFromString($string)
- {
- foreach ($this->campaignNames as $campaignNameParameter) {
- $campaignName = trim(urldecode(UrlHelper::getParameterFromQueryString($string, $campaignNameParameter)));
- if (!empty($campaignName)) {
- break;
- }
- }
-
- if (empty($campaignName)) {
- return false;
- }
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_CAMPAIGN;
- $this->nameReferrerAnalyzed = $campaignName;
-
- foreach ($this->campaignKeywords as $campaignKeywordParameter) {
- $campaignKeyword = UrlHelper::getParameterFromQueryString($string, $campaignKeywordParameter);
- if (!empty($campaignKeyword)) {
- $this->keywordReferrerAnalyzed = trim(urldecode($campaignKeyword));
- break;
- }
- }
- return !empty($this->keywordReferrerAnalyzed);
- }
-
- protected function detectReferrerCampaignFromLandingUrl()
- {
- if (!isset($this->currentUrlParse['query'])
- && !isset($this->currentUrlParse['fragment'])
- ) {
- return false;
- }
- $campaignParameters = Common::getCampaignParameters();
- $this->campaignNames = $campaignParameters[0];
- $this->campaignKeywords = $campaignParameters[1];
-
- $found = false;
-
- // 1) Detect campaign from query string
- if (isset($this->currentUrlParse['query'])) {
- $found = $this->detectCampaignFromString($this->currentUrlParse['query']);
- }
-
- // 2) Detect from fragment #hash
- if (!$found
- && isset($this->currentUrlParse['fragment'])
- ) {
- $this->detectCampaignFromString($this->currentUrlParse['fragment']);
- }
- }
-
- /**
- * We have previously tried to detect the campaign variables in the URL
- * so at this stage, if the referrer host is the current host,
- * or if the referrer host is any of the registered URL for this website,
- * it is considered a direct entry
- * @return bool
- */
- protected function detectReferrerDirectEntry()
- {
- if (!empty($this->referrerHost)) {
- // is the referrer host the current host?
- if (isset($this->currentUrlParse['host'])) {
- $currentHost = mb_strtolower($this->currentUrlParse['host'], 'UTF-8');
- if ($currentHost == mb_strtolower($this->referrerHost, 'UTF-8')) {
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
- return true;
- }
- }
- if (Visit::isHostKnownAliasHost($this->referrerHost, $this->idsite)) {
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
- return true;
- }
- }
- return false;
- }
-
- protected function detectCampaignKeywordFromReferrerUrl()
- {
- if(!empty($this->nameReferrerAnalyzed)
- && !empty($this->keywordReferrerAnalyzed)) {
- // keyword is already set, we skip
- return true;
- }
-
- // Set the Campaign keyword to the keyword found in the Referrer URL if any
- if(!empty($this->nameReferrerAnalyzed)) {
- $referrerUrlInfo = UrlHelper::extractSearchEngineInformationFromUrl($this->referrerUrl);
- if (!empty($referrerUrlInfo['keywords'])) {
- $this->keywordReferrerAnalyzed = $referrerUrlInfo['keywords'];
- }
- }
-
- // Set the keyword, to the hostname found, in a Adsense Referrer URL '&url=' parameter
- if (empty($this->keywordReferrerAnalyzed)
- && !empty($this->referrerUrlParse['query'])
- && !empty($this->referrerHost)
- && (strpos($this->referrerHost, 'googleads') !== false || strpos($this->referrerHost, 'doubleclick') !== false)
- ) {
- // This parameter sometimes is found & contains the page with the adsense ad bringing visitor to our site
- $value = $this->getParameterValueFromReferrerUrl('url');
- if (!empty($value)) {
- $parsedAdsenseReferrerUrl = parse_url($value);
- if (!empty($parsedAdsenseReferrerUrl['host'])) {
-
- if(empty($this->nameReferrerAnalyzed)) {
- $type = $this->getParameterValueFromReferrerUrl('ad_type');
- $type = $type ? " ($type)" : '';
- $this->nameReferrerAnalyzed = self::LABEL_ADWORDS_NAME . $type;
- $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_CAMPAIGN;
- }
- $this->keywordReferrerAnalyzed = self::LABEL_PREFIX_ADWORDS_KEYWORD . $parsedAdsenseReferrerUrl['host'];
- }
- }
- }
-
- }
-
- /**
- * @return string
- */
- protected function getParameterValueFromReferrerUrl($adsenseReferrerParameter)
- {
- $value = trim(urldecode(UrlHelper::getParameterFromQueryString($this->referrerUrlParse['query'], $adsenseReferrerParameter)));
- return $value;
- }
-
- /**
- * @return bool
- */
- protected function detectReferrerCampaign()
- {
- $this->detectReferrerCampaignFromLandingUrl();
- $this->detectCampaignKeywordFromReferrerUrl();
-
- if ($this->typeReferrerAnalyzed != Common::REFERRER_TYPE_CAMPAIGN) {
- return false;
- }
- // if we detected a campaign but there is still no keyword set, we set the keyword to the Referrer host
- if(empty($this->keywordReferrerAnalyzed)) {
- $this->keywordReferrerAnalyzed = $this->referrerHost;
- }
-
- $this->keywordReferrerAnalyzed = Common::mb_strtolower($this->keywordReferrerAnalyzed);
- $this->nameReferrerAnalyzed = Common::mb_strtolower($this->nameReferrerAnalyzed);
- return true;
- }
-
-}
diff --git a/core/Tracker/Settings.php b/core/Tracker/Settings.php
index 341eb6d69b..142c071446 100644
--- a/core/Tracker/Settings.php
+++ b/core/Tracker/Settings.php
@@ -15,17 +15,18 @@ class Settings
{
function __construct(Request $request, $ip)
{
- $this->request = $request;
+ $this->request = $request;
$this->ipAddress = $ip;
- $this->params = array();
+ $this->configId = null;
}
- function getInfo()
+ function getConfigId()
{
- if(empty($this->params)) {
+ if (empty($this->configId)) {
$this->loadInfo();
}
- return $this->params;
+
+ return $this->configId;
}
protected function loadInfo()
@@ -40,14 +41,15 @@ class Settings
$deviceDetector->parse();
$aBrowserInfo = $deviceDetector->getBrowser();
- $browserName = !empty($aBrowserInfo['short_name']) ? $aBrowserInfo['short_name'] : 'UNK';
+ $browserName = !empty($aBrowserInfo['short_name']) ? $aBrowserInfo['short_name'] : 'UNK';
$browserVersion = !empty($aBrowserInfo['version']) ? $aBrowserInfo['version'] : '';
$os = $deviceDetector->getOS();
$os = empty($os['short_name']) ? 'UNK' : $os['short_name'];
$browserLang = substr($this->request->getBrowserLanguage(), 0, 20); // limit the length of this string to match db
- $configurationHash = $this->getConfigHash(
+
+ $this->configId = $this->getConfigHash(
$os,
$browserName,
$browserVersion,
@@ -63,20 +65,6 @@ class Settings
$plugin_Cookie,
$this->ipAddress,
$browserLang);
-
- $this->params = array(
- 'config_id' => $configurationHash,
- 'config_pdf' => $plugin_PDF,
- 'config_flash' => $plugin_Flash,
- 'config_java' => $plugin_Java,
- 'config_director' => $plugin_Director,
- 'config_quicktime' => $plugin_Quicktime,
- 'config_realplayer' => $plugin_RealPlayer,
- 'config_windowsmedia' => $plugin_WindowsMedia,
- 'config_gears' => $plugin_Gears,
- 'config_silverlight' => $plugin_Silverlight,
- 'config_cookie' => $plugin_Cookie
- );
}
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index 3a0ed0b575..7dceab977a 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -142,12 +142,13 @@ class Visit implements VisitInterface
/***
* Visitor recognition
*/
- $visitor = new Visitor($this->request, $this->getSettingsObject(), $this->visitorInfo, $this->visitorCustomVariables);
+ $visitorId = $this->getSettingsObject()->getConfigId();
+ $visitor = new Visitor($this->request, $visitorId, $this->visitorInfo, $this->visitorCustomVariables);
$visitor->recognize();
$this->visitorInfo = $visitor->getVisitorInfo();
- $isLastActionInTheSameVisit = $this->isLastActionInTheSameVisit();
+ $isLastActionInTheSameVisit = $this->isLastActionInTheSameVisit($visitor);
if (!$isLastActionInTheSameVisit) {
Common::printDebug("Visitor detected, but last action was more than 30 minutes ago...");
@@ -162,7 +163,7 @@ class Visit implements VisitInterface
if ($visitor->isVisitorKnown()
&& $isLastActionInTheSameVisit
) {
- $idReferrerActionUrl = $this->visitorInfo['visit_exit_idaction_url'];
+ $idReferrerActionUrl = $this->visitorInfo['visit_exit_idaction_url'];
$idReferrerActionName = $this->visitorInfo['visit_exit_idaction_name'];
try {
$this->handleExistingVisit($visitor, $action, $visitIsConverted);
@@ -208,7 +209,7 @@ class Visit implements VisitInterface
// record the goals if applicable
if ($someGoalsConverted) {
$this->goalManager->recordGoals(
- $this->request->getIdSite(),
+ $visitor,
$this->visitorInfo,
$this->visitorCustomVariables,
$action
@@ -259,6 +260,9 @@ class Visit implements VisitInterface
Piwik::postEvent('Tracker.existingVisitInformation', array(&$valuesToUpdate, $this->visitorInfo));
$this->updateExistingVisit($valuesToUpdate);
+
+ $this->visitorInfo['visit_last_action_time'] = $this->request->getCurrentTimestamp();
+ $visitor->setVisitorColumn('visit_last_action_time', $this->visitorInfo['visit_last_action_time']);
}
/**
@@ -320,10 +324,13 @@ class Visit implements VisitInterface
$idVisit = $this->insertNewVisit( $this->visitorInfo );
- $visitor->setVisitorColumn('idvisit', $idVisit);
$this->visitorInfo['idvisit'] = $idVisit;
$this->visitorInfo['visit_first_action_time'] = $this->request->getCurrentTimestamp();
$this->visitorInfo['visit_last_action_time'] = $this->request->getCurrentTimestamp();
+
+ $visitor->setVisitorColumn('idvisit', $this->visitorInfo['idvisit']);
+ $visitor->setVisitorColumn('visit_first_action_time', $this->visitorInfo['visit_first_action_time']);
+ $visitor->setVisitorColumn('visit_last_action_time', $this->visitorInfo['visit_last_action_time']);
}
/**
@@ -383,11 +390,13 @@ class Visit implements VisitInterface
* Returns true if the last action was done during the last 30 minutes
* @return bool
*/
- protected function isLastActionInTheSameVisit()
+ protected function isLastActionInTheSameVisit(Visitor $visitor)
{
- return isset($this->visitorInfo['visit_last_action_time'])
- && ($this->visitorInfo['visit_last_action_time']
- > ($this->request->getCurrentTimestamp() - Config::getInstance()->Tracker['visit_standard_length']));
+ $lastActionTime = $visitor->getVisitorColumn('visit_last_action_time');
+
+ return isset($lastActionTime)
+ && false !== $lastActionTime
+ && ($lastActionTime > ($this->request->getCurrentTimestamp() - Config::getInstance()->Tracker['visit_standard_length']));
}
// is the referrer host any of the registered URLs for this website?
@@ -451,8 +460,6 @@ class Visit implements VisitInterface
$result = Tracker::getDatabase()->query($sqlQuery, $sqlBind);
- $this->visitorInfo['visit_last_action_time'] = $this->request->getCurrentTimestamp();
-
// Debug output
if (isset($valuesToUpdate['idvisitor'])) {
$valuesToUpdate['idvisitor'] = bin2hex($valuesToUpdate['idvisitor']);
@@ -479,22 +486,10 @@ class Visit implements VisitInterface
protected function getNewVisitorInformation($idVisitor)
{
- $userInfo = $this->getSettingsObject()->getInfo();
-
return array(
- 'idvisitor' => $idVisitor,
- 'config_id' => $userInfo['config_id'],
- 'config_pdf' => $userInfo['config_pdf'],
- 'config_flash' => $userInfo['config_flash'],
- 'config_java' => $userInfo['config_java'],
- 'config_director' => $userInfo['config_director'],
- 'config_quicktime' => $userInfo['config_quicktime'],
- 'config_realplayer' => $userInfo['config_realplayer'],
- 'config_windowsmedia' => $userInfo['config_windowsmedia'],
- 'config_gears' => $userInfo['config_gears'],
- 'config_silverlight' => $userInfo['config_silverlight'],
- 'config_cookie' => $userInfo['config_cookie'],
- 'location_ip' => $this->getVisitorIp(),
+ 'idvisitor' => $idVisitor,
+ 'config_id' => $this->getSettingsObject()->getConfigId(),
+ 'location_ip' => $this->getVisitorIp(),
);
}
@@ -539,10 +534,6 @@ class Visit implements VisitInterface
private function triggerHookOnDimensions($dimensions, $hook, $visitor, $action, $valuesToUpdate = null)
{
foreach ($dimensions as $dimension) {
- if (!method_exists($dimension, $hook)) {
- continue;
- }
-
$value = $dimension->$hook($this->request, $visitor, $action);
if ($value !== false) {
diff --git a/core/Tracker/Visitor.php b/core/Tracker/Visitor.php
index 8839c30a5b..dbdcac2988 100644
--- a/core/Tracker/Visitor.php
+++ b/core/Tracker/Visitor.php
@@ -20,14 +20,14 @@ class Visitor
private $visitorKnown = false;
private $request;
private $visitorInfo;
- private $userInfo;
+ private $configId;
- public function __construct(Request $request, Tracker\Settings $settings, $visitorInfo = array(), $customVariables = null)
+ public function __construct(Request $request, $configId, $visitorInfo = array(), $customVariables = null)
{
$this->request = $request;
$this->visitorInfo = $visitorInfo;
$this->customVariables = $customVariables;
- $this->userInfo = $settings->getInfo();
+ $this->configId = $configId;
}
/**
@@ -41,7 +41,7 @@ class Visitor
{
$this->setIsVisitorKonwn(false);
- $configId = $this->userInfo['config_id'];
+ $configId = $this->configId;
$idVisitor = $this->request->getVisitorId();
$isVisitorIdToLookup = !empty($idVisitor);
@@ -270,11 +270,10 @@ class Visitor
$dimensions = VisitDimension::getAllDimensions();
foreach ($dimensions as $dimension) {
- if (method_exists($dimension, 'onExistingVisit')) {
+ if ($dimension->hasImplementedEvent('onExistingVisit')) {
$fields[] = $dimension->getFieldName();
}
-
/**
* This event collects a list of [visit entity]() properties that should be loaded when reading
* the existing visit. Properties that appear in this list will be available in other tracking
diff --git a/piwik.php b/piwik.php
index 40096c11ce..325e35692a 100644
--- a/piwik.php
+++ b/piwik.php
@@ -71,7 +71,6 @@ require_once PIWIK_INCLUDE_PATH . '/core/Tracker/TableLogAction.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Action.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/ActionPageview.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Request.php';
-require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Referrer.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/VisitExcluded.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/VisitorNotFoundInDb.php';
require_once PIWIK_INCLUDE_PATH . '/core/CacheFile.php';
diff --git a/plugins/CoreHome/Columns/IdSite.php b/plugins/CoreHome/Columns/IdSite.php
index 2c29df898b..369bfc31ce 100644
--- a/plugins/CoreHome/Columns/IdSite.php
+++ b/plugins/CoreHome/Columns/IdSite.php
@@ -38,4 +38,15 @@ class IdSite extends VisitDimension
{
return $request->getIdSite();
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $request->getIdSite();
+ }
} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitLastActionTime.php b/plugins/CoreHome/Columns/VisitLastActionTime.php
index 9bf5990687..21a2103370 100644
--- a/plugins/CoreHome/Columns/VisitLastActionTime.php
+++ b/plugins/CoreHome/Columns/VisitLastActionTime.php
@@ -49,5 +49,4 @@ class VisitLastActionTime extends VisitDimension
{
return $this->onNewVisit($request, $visitor, $action);
}
-
} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
index 04791dcf81..7e2230432d 100644
--- a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
+++ b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
@@ -43,4 +43,15 @@ class VisitorDaysSinceFirst extends VisitDimension
{
return $request->getDaysSinceFirstVisit();
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
index d4007bc58a..8ccde5c0e0 100644
--- a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
+++ b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
@@ -50,4 +50,15 @@ class VisitorDaysSinceOrder extends VisitDimension
return $daysSinceLastOrder;
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitorReturning.php b/plugins/CoreHome/Columns/VisitorReturning.php
index bfd3c47633..cf78ee44bf 100644
--- a/plugins/CoreHome/Columns/VisitorReturning.php
+++ b/plugins/CoreHome/Columns/VisitorReturning.php
@@ -23,6 +23,7 @@ class VisitorReturning extends VisitDimension
protected $fieldName = 'visitor_returning';
protected $fieldType = 'TINYINT(1) NOT NULL';
+ protected $conversionField = true;
protected function init()
{
@@ -69,4 +70,15 @@ class VisitorReturning extends VisitDimension
return self::IS_NEW;
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitsCount.php b/plugins/CoreHome/Columns/VisitsCount.php
index 6fb53c6ff0..b1df599495 100644
--- a/plugins/CoreHome/Columns/VisitsCount.php
+++ b/plugins/CoreHome/Columns/VisitsCount.php
@@ -43,4 +43,15 @@ class VisitsCount extends VisitDimension
{
return $request->getVisitCount();
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php
index 268cd8b2c1..470753715e 100644
--- a/plugins/Referrers/Columns/Base.php
+++ b/plugins/Referrers/Columns/Base.php
@@ -12,7 +12,10 @@ use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\VisitDimension;
use Piwik\Tracker\PageUrl;
+use Piwik\Tracker\Request;
use Piwik\Tracker\Visit;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
use Piwik\UrlHelper;
@@ -301,4 +304,92 @@ abstract class Base extends VisitDimension
return true;
}
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function getValueForRecordGoal(Request $request, Visitor $visitor)
+ {
+ $referrerTimestamp = $request->getParam('_refts');
+ $referrerUrl = $request->getParam('_ref');
+ $referrerCampaignName = trim(urldecode($request->getParam('_rcn')));
+ $referrerCampaignKeyword = trim(urldecode($request->getParam('_rck')));
+
+ // Attributing the correct Referrer to this conversion.
+ // Priority order is as follows:
+ // 0) In some cases, the campaign is not passed from the JS so we look it up from the current visit
+ // 1) Campaign name/kwd parsed in the JS
+ // 2) Referrer URL stored in the _ref cookie
+ // 3) If no info from the cookie, attribute to the current visit referrer
+
+ // 3) Default values: current referrer
+ $type = $visitor->getVisitorColumn('referer_type');
+ $name = $visitor->getVisitorColumn('referer_name');
+ $keyword = $visitor->getVisitorColumn('referer_keyword');
+ $time = $visitor->getVisitorColumn('visit_first_action_time');
+
+ // 0) In some (unknown!?) cases the campaign is not found in the attribution cookie, but the URL ref was found.
+ // In this case we look up if the current visit is credited to a campaign and will credit this campaign rather than the URL ref (since campaigns have higher priority)
+ if (empty($referrerCampaignName)
+ && $type == Common::REFERRER_TYPE_CAMPAIGN
+ && !empty($name)
+ ) {
+ // Use default values per above
+ } // 1) Campaigns from 1st party cookie
+ elseif (!empty($referrerCampaignName)) {
+ $type = Common::REFERRER_TYPE_CAMPAIGN;
+ $name = $referrerCampaignName;
+ $keyword = $referrerCampaignKeyword;
+ $time = $referrerTimestamp;
+ } // 2) Referrer URL parsing
+ elseif (!empty($referrerUrl)) {
+
+ $idSite = $request->getIdSite();
+ $referrer = $this->getReferrerInformation($referrerUrl, $currentUrl = '', $idSite);
+
+ // if the parsed referrer is interesting enough, ie. website or search engine
+ if (in_array($referrer['referer_type'], array(Common::REFERRER_TYPE_SEARCH_ENGINE, Common::REFERRER_TYPE_WEBSITE))) {
+ $type = $referrer['referer_type'];
+ $name = $referrer['referer_name'];
+ $keyword = $referrer['referer_keyword'];
+ $time = $referrerTimestamp;
+ }
+ }
+
+ $this->setCampaignValuesToLowercase($type, $name, $keyword);
+
+ $fields = array(
+ 'referer_type' => $type,
+ 'referer_name' => $name,
+ 'referer_keyword' => $keyword,
+ // this field is currently unused
+ 'referer_visit_server_date' => date("Y-m-d", $time),
+ );
+
+ if (array_key_exists($this->fieldName, $fields)) {
+ return $fields[$this->fieldName];
+ }
+
+ return false;
+ }
+
+ /**
+ * @param $type
+ * @param $name
+ * @param $keyword
+ */
+ protected function setCampaignValuesToLowercase($type, &$name, &$keyword)
+ {
+ if ($type === Common::REFERRER_TYPE_CAMPAIGN) {
+ if (!empty($name)) {
+ $name = Common::mb_strtolower($name);
+ }
+ if (!empty($keyword)) {
+ $keyword = Common::mb_strtolower($keyword);
+ }
+ }
+ }
+
}
diff --git a/plugins/Referrers/Columns/Keyword.php b/plugins/Referrers/Columns/Keyword.php
index 31e495e96e..573aa8b44d 100644
--- a/plugins/Referrers/Columns/Keyword.php
+++ b/plugins/Referrers/Columns/Keyword.php
@@ -52,4 +52,15 @@ class Keyword extends Base
return $information['referer_keyword'];
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $this->getValueForRecordGoal($request, $visitor);
+ }
}
diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php
index 38e1ec9bb1..854fb9a682 100644
--- a/plugins/Referrers/Columns/ReferrerName.php
+++ b/plugins/Referrers/Columns/ReferrerName.php
@@ -52,4 +52,15 @@ class ReferrerName extends Base
return $information['referer_name'];
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $this->getValueForRecordGoal($request, $visitor);
+ }
}
diff --git a/plugins/Referrers/Columns/ReferrerType.php b/plugins/Referrers/Columns/ReferrerType.php
index 93df8e406d..03976c101e 100644
--- a/plugins/Referrers/Columns/ReferrerType.php
+++ b/plugins/Referrers/Columns/ReferrerType.php
@@ -49,4 +49,15 @@ class ReferrerType extends Base
return $information['referer_type'];
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $this->getValueForRecordGoal($request, $visitor);
+ }
}
diff --git a/plugins/Referrers/Columns/ReferrerVisitServerDate.php b/plugins/Referrers/Columns/ReferrerVisitServerDate.php
new file mode 100644
index 0000000000..5eb4e758e9
--- /dev/null
+++ b/plugins/Referrers/Columns/ReferrerVisitServerDate.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Referrers\Columns;
+
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class ReferrerVisitServerDate extends Base
+{
+ protected $fieldName = 'referer_visit_server_date';
+ protected $fieldType = 'date default NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $this->getValueForRecordGoal($request, $visitor);
+ }
+}
diff --git a/plugins/UserCountry/Columns/City.php b/plugins/UserCountry/Columns/City.php
index 929dae92f2..aa353e6ca3 100644
--- a/plugins/UserCountry/Columns/City.php
+++ b/plugins/UserCountry/Columns/City.php
@@ -63,4 +63,15 @@ class City extends Base
{
return $this->getUrlOverrideValueIfAllowed('city', $request);
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Country.php b/plugins/UserCountry/Columns/Country.php
index a9feced9f6..9e7e41b47a 100644
--- a/plugins/UserCountry/Columns/Country.php
+++ b/plugins/UserCountry/Columns/Country.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\UserCountry\Columns;
use Piwik\Common;
+use Piwik\Config;
use Piwik\IP;
use Piwik\Piwik;
use Piwik\Plugins\Provider\Provider;
@@ -114,4 +115,27 @@ class Country extends Base
{
return $this->getUrlOverrideValueIfAllowed('country', $request);
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ $country = $visitor->getVisitorColumn($this->fieldName);
+
+ if (isset($country) && false !== $country) {
+ return $country;
+ }
+
+ $browserLanguage = $request->getBrowserLanguage();
+ $enableLanguageToCountryGuess = Config::getInstance()->Tracker['enable_language_to_country_guess'];
+ $locationIp = $visitor->getVisitorColumn('location_ip');
+
+ $country = Common::getCountry($browserLanguage, $enableLanguageToCountryGuess, $locationIp);
+
+ return $country;
+ }
} \ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Latitude.php b/plugins/UserCountry/Columns/Latitude.php
index afadffee9d..ec1b543c5c 100644
--- a/plugins/UserCountry/Columns/Latitude.php
+++ b/plugins/UserCountry/Columns/Latitude.php
@@ -63,4 +63,15 @@ class Latitude extends Base
{
return $this->getUrlOverrideValueIfAllowed('lat', $request);
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Longitude.php b/plugins/UserCountry/Columns/Longitude.php
index d5971321c3..5fd4261329 100644
--- a/plugins/UserCountry/Columns/Longitude.php
+++ b/plugins/UserCountry/Columns/Longitude.php
@@ -63,4 +63,15 @@ class Longitude extends Base
{
return $this->getUrlOverrideValueIfAllowed('long', $request);
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Region.php b/plugins/UserCountry/Columns/Region.php
index 6010a7de5f..b85ac2ab3b 100644
--- a/plugins/UserCountry/Columns/Region.php
+++ b/plugins/UserCountry/Columns/Region.php
@@ -63,4 +63,15 @@ class Region extends Base
{
return $this->getUrlOverrideValueIfAllowed('region', $request);
}
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onRecordGoal(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->fieldName);
+ }
} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginCookie.php b/plugins/UserSettings/Columns/PluginCookie.php
new file mode 100644
index 0000000000..653bd757da
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginCookie.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginCookie extends VisitDimension
+{
+ protected $fieldName = 'config_cookie';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('cookie', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginDirector.php b/plugins/UserSettings/Columns/PluginDirector.php
new file mode 100644
index 0000000000..8e8ec9041b
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginDirector.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginDirector extends VisitDimension
+{
+ protected $fieldName = 'config_director';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('dir', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginFlash.php b/plugins/UserSettings/Columns/PluginFlash.php
new file mode 100644
index 0000000000..b2b546704f
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginFlash.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginFlash extends VisitDimension
+{
+ protected $fieldName = 'config_flash';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('fla', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginGears.php b/plugins/UserSettings/Columns/PluginGears.php
new file mode 100644
index 0000000000..46aee3d6b5
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginGears.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginGears extends VisitDimension
+{
+ protected $fieldName = 'config_gears';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('gears', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginJava.php b/plugins/UserSettings/Columns/PluginJava.php
new file mode 100644
index 0000000000..1caf4845d3
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginJava.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginJava extends VisitDimension
+{
+ protected $fieldName = 'config_java';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('java', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginPdf.php b/plugins/UserSettings/Columns/PluginPdf.php
new file mode 100644
index 0000000000..8270387b49
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginPdf.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginPdf extends VisitDimension
+{
+ protected $fieldName = 'config_pdf';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('pdf', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginQuickTime.php b/plugins/UserSettings/Columns/PluginQuickTime.php
new file mode 100644
index 0000000000..dbb1ccb569
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginQuickTime.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginQuickTime extends VisitDimension
+{
+ protected $fieldName = 'config_quicktime';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('qt', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginRealPlayer.php b/plugins/UserSettings/Columns/PluginRealPlayer.php
new file mode 100644
index 0000000000..66f2453e15
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginRealPlayer.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginRealPlayer extends VisitDimension
+{
+ protected $fieldName = 'config_realplayer';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('realp', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginSilverlight.php b/plugins/UserSettings/Columns/PluginSilverlight.php
new file mode 100644
index 0000000000..7462b61933
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginSilverlight.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginSilverlight extends VisitDimension
+{
+ protected $fieldName = 'config_silverlight';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('ag', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserSettings/Columns/PluginWindowsMedia.php b/plugins/UserSettings/Columns/PluginWindowsMedia.php
new file mode 100644
index 0000000000..2879a7cbce
--- /dev/null
+++ b/plugins/UserSettings/Columns/PluginWindowsMedia.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserSettings\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+
+class PluginWindowsMedia extends VisitDimension
+{
+ protected $fieldName = 'config_windowsmedia';
+ protected $fieldType = 'TINYINT(1) NOT NULL';
+
+ public function getName()
+ {
+ return '';
+ }
+
+ /**
+ * @param Request $request
+ * @param Visitor $visitor
+ * @param Action|null $action
+ * @return mixed
+ */
+ public function onNewVisit(Request $request, Visitor $visitor, $action)
+ {
+ return Common::getRequestVar('wma', 0, 'int', $request->getParams());
+ }
+} \ No newline at end of file