From 883c18ff8277fedbcd1f26070e5e90c7d82734d4 Mon Sep 17 00:00:00 2001 From: BeezyT Date: Mon, 15 Oct 2012 14:16:05 +0000 Subject: refs #2992, refs #3332: integrating previous and following internal searches into transitions. the code is starting to get a little complicated ;-) git-svn-id: http://dev.piwik.org/svn/trunk@7201 59fd770c-687e-43c8-a1e3-f5a4ff64c105 --- plugins/Transitions/API.php | 21 ++++-- plugins/Transitions/Controller.php | 4 ++ plugins/Transitions/Transitions.php | 93 +++++++++++++++++++-------- plugins/Transitions/templates/transitions.js | 28 ++++++-- plugins/Transitions/templates/transitions.tpl | 2 + 5 files changed, 109 insertions(+), 39 deletions(-) (limited to 'plugins/Transitions') diff --git a/plugins/Transitions/API.php b/plugins/Transitions/API.php index e94f28f3aa..e17b85b726 100644 --- a/plugins/Transitions/API.php +++ b/plugins/Transitions/API.php @@ -86,15 +86,23 @@ class Piwik_Transitions_API - $report['pageMetrics']['loops']; // replace column names in the data tables - $columnNames = array( - 'label' => 'url', - Piwik_Archive::INDEX_NB_ACTIONS => 'referrals' + $reportNames = array( + 'previousPages' => true, + 'previousSiteSearches' => false, + 'followingPages' => true, + 'followingSiteSearches' => false, + 'outlinks' => true, + 'downloads' => true ); - $reportNames = array('previousPages', 'followingPages', 'outlinks', 'downloads'); - foreach ($reportNames as $reportName) + foreach ($reportNames as $reportName => $replaceLabel) { if (isset($report[$reportName])) { + $columnNames = array(Piwik_Archive::INDEX_NB_ACTIONS => 'referrals'); + if ($replaceLabel) + { + $columnNames[Piwik_Archive::INDEX_NB_ACTIONS] = 'referrals'; + } $report[$reportName]->filter('ReplaceColumnNames', array($columnNames)); } } @@ -137,7 +145,7 @@ class Piwik_Transitions_API /** * Add the internal referrers to the report: - * previous pages + * previous pages and previous site searches * * @param Piwik_Transitions $transitionsArchiving * @param $archiveProcessing @@ -159,6 +167,7 @@ class Piwik_Transitions_API } $report['previousPages'] = &$data['previousPages']; + $report['previousSiteSearches'] = &$data['previousSiteSearches']; $report['pageMetrics']['loops'] = $data['loops']; $report['pageMetrics']['pageviews'] = $data['pageviews']; } diff --git a/plugins/Transitions/Controller.php b/plugins/Transitions/Controller.php index 1a6977447e..7516b61e5c 100644 --- a/plugins/Transitions/Controller.php +++ b/plugins/Transitions/Controller.php @@ -27,6 +27,8 @@ class Piwik_Transitions_Controller extends Piwik_Controller 'loopsInline' => 'Transitions_LoopsInline', 'fromPreviousPages' => 'Transitions_FromPreviousPages', 'fromPreviousPagesInline' => 'Transitions_FromPreviousPagesInline', + 'fromPreviousSiteSearches' => 'Transitions_FromPreviousSiteSearches', + 'fromPreviousSiteSearchesInline' => 'Transitions_FromPreviousSiteSearchesInline', 'fromSearchEngines' => 'Transitions_FromSearchEngines', 'fromSearchEnginesInline' => 'Transitions_FromSearchEnginesInline', 'fromWebsites' => 'Transitions_FromWebsites', @@ -37,6 +39,8 @@ class Piwik_Transitions_Controller extends Piwik_Controller 'directEntriesInline' => 'Referers_TypeDirectEntries', 'toFollowingPages' => 'Transitions_ToFollowingPages', 'toFollowingPagesInline' => 'Transitions_ToFollowingPagesInline', + 'toFollowingSiteSearches' => 'Transitions_ToFollowingSiteSearches', + 'toFollowingSiteSearchesInline' => 'Transitions_ToFollowingSiteSearchesInline', 'downloads' => 'Actions_ColumnDownloads', 'downloadsInline' => 'VisitsSummary_NbDownloadsDescription', 'outlinks' => 'Actions_ColumnOutlinks', diff --git a/plugins/Transitions/Transitions.php b/plugins/Transitions/Transitions.php index 593b67fc7b..de7da14a65 100644 --- a/plugins/Transitions/Transitions.php +++ b/plugins/Transitions/Transitions.php @@ -145,31 +145,48 @@ class Piwik_Transitions extends Piwik_Plugin $rankingQuery = new Piwik_RankingQuery($limitBeforeGrouping ? $limitBeforeGrouping : $this->limitBeforeGrouping); $rankingQuery->addLabelColumn(array('name', 'url_prefix')); $rankingQuery->setColumnToMarkExcludedRows('is_self'); - $rankingQuery->partitionResultIntoMultipleGroups('only_show_this', array(0, 1)); + $rankingQuery->partitionResultIntoMultipleGroups('action_partition', array(0, 1, 2)); $type = $this->getColumnTypeSuffix($actionType); - $onlyShowType = Piwik_Tracker_Action::TYPE_ACTION_URL; + $mainActionType = Piwik_Tracker_Action::TYPE_ACTION_URL; $dimension = 'idaction_url_ref'; $isTitle = $actionType == 'title'; if ($isTitle) { - $onlyShowType = Piwik_Tracker_Action::TYPE_ACTION_NAME; + $mainActionType = Piwik_Tracker_Action::TYPE_ACTION_NAME; $dimension = 'idaction_name_ref'; } $addSelect = ' log_action.name, log_action.url_prefix, CASE WHEN log_link_visit_action.idaction_'.$type.'_ref = '.intval($idaction).' THEN 1 ELSE 0 END AS is_self, - CASE WHEN log_action.type = '.$onlyShowType.' THEN 1 ELSE 0 END AS only_show_this'; + CASE + WHEN log_action.type = '.$mainActionType.' THEN 1 + WHEN log_action.type = '.Piwik_Tracker_Action::TYPE_SITE_SEARCH.' THEN 2 + ELSE 0 + END AS action_partition'; $where = ' log_link_visit_action.idaction_'.$type.' = '.intval($idaction); + if ($dimension == 'idaction_url_ref') + { + // site search referrers are logged with url_ref=NULL + // when we find one, we have to join on name_ref + $dimension = 'IF( idaction_url_ref IS NULL, idaction_name_ref, idaction_url_ref )'; + $joinLogActionOn = $dimension; + } + else + { + $joinLogActionOn = $dimension; + $dimension = array($dimension); + } + $orderBy = '`'.Piwik_Archive::INDEX_NB_ACTIONS.'` DESC'; $metrics = array(Piwik_Archive::INDEX_NB_ACTIONS); - $data = $archiveProcessing->queryActionsByDimension(array($dimension), $where, $metrics, $orderBy, - $rankingQuery, $dimension, $addSelect); + $data = $archiveProcessing->queryActionsByDimension($dimension, $where, $metrics, $orderBy, + $rankingQuery, $joinLogActionOn, $addSelect); $loops = 0; $nbPageviews = 0; @@ -189,6 +206,22 @@ class Piwik_Transitions extends Piwik_Plugin } } + $previousSearchesDataTable = new Piwik_DataTable; + if (isset($data['result'][2])) + { + foreach ($data['result'][2] as &$search) + { + $nbActions = intval($search[Piwik_Archive::INDEX_NB_ACTIONS]); + $previousSearchesDataTable->addRow(new Piwik_DataTable_Row(array( + Piwik_DataTable_Row::COLUMNS => array( + 'label' => $search['name'], + Piwik_Archive::INDEX_NB_ACTIONS => $nbActions + ) + ))); + $nbPageviews += $nbActions; + } + } + if (isset($data['result'][0])) { foreach ($data['result'][0] as &$referrer) @@ -206,6 +239,7 @@ class Piwik_Transitions extends Piwik_Plugin return array( 'pageviews' => $nbPageviews, 'previousPages' => $previousPagesDataTable, + 'previousSiteSearches' => $previousSearchesDataTable, 'loops' => $loops ); } @@ -230,7 +264,7 @@ class Piwik_Transitions extends Piwik_Plugin } /** - * Get information about the following actions (following pages, outlinks, downloads) + * Get information about the following actions (following pages, site searches, outlinks, downloads) * * @param $idaction * @param $actionType @@ -247,8 +281,10 @@ class Piwik_Transitions extends Piwik_Plugin if (!$isTitle) { // specific setup for page urls $types[Piwik_Tracker_Action::TYPE_ACTION_URL] = 'followingPages'; - $dimension = array('idaction_url'); - $joinLogActionColumn = 'idaction_url'; + $dimension = 'IF( idaction_url IS NULL, idaction_name, idaction_url )'; + // site search referrers are logged with url=NULL + // when we find one, we have to join on name + $joinLogActionColumn = $dimension; $addSelect = 'log_action.name, log_action.url_prefix, log_action.type'; } else { // specific setup for page titles: @@ -257,18 +293,30 @@ class Piwik_Transitions extends Piwik_Plugin // the table joined on url is log_action1 $joinLogActionColumn = array('idaction_url', 'idaction_name'); $dimension = ' - CASE log_action1.type - WHEN 1 THEN log_action2.idaction + CASE + ' /* following site search */ . ' + WHEN log_link_visit_action.idaction_url IS NULL THEN log_action2.idaction + ' /* following page view: use page title */ . ' + WHEN log_action1.type = '.Piwik_Tracker_Action::TYPE_ACTION_URL.' THEN log_action2.idaction + ' /* following download or outlink: use url */ . ' ELSE log_action1.idaction END '; $addSelect = ' - CASE log_action1.type - WHEN 1 THEN log_action2.name + CASE + ' /* following site search */ . ' + WHEN log_link_visit_action.idaction_url IS NULL THEN log_action2.name + ' /* following page view: use page title */ . ' + WHEN log_action1.type = '.Piwik_Tracker_Action::TYPE_ACTION_URL.' THEN log_action2.name + ' /* following download or outlink: use url */ . ' ELSE log_action1.name END AS name, - CASE log_action1.type - WHEN 1 THEN log_action2.type + CASE + ' /* following site search */ . ' + WHEN log_link_visit_action.idaction_url IS NULL THEN log_action2.type + ' /* following page view: use page title */ . ' + WHEN log_action1.type = '.Piwik_Tracker_Action::TYPE_ACTION_URL.' THEN log_action2.type + ' /* following download or outlink: use url */ . ' ELSE log_action1.type END AS type, NULL AS url_prefix @@ -276,25 +324,18 @@ class Piwik_Transitions extends Piwik_Plugin } // these types are available for both titles and urls + $types[Piwik_Tracker_Action::TYPE_SITE_SEARCH] = 'followingSiteSearches'; $types[Piwik_Tracker_Action::TYPE_OUTLINK] = 'outlinks'; $types[Piwik_Tracker_Action::TYPE_DOWNLOAD] = 'downloads'; - $rankingQuery = new Piwik_RankingQuery($limitBeforeGrouping ? $limitBeforeGrouping : $this->limitBeforeGrouping); $rankingQuery->addLabelColumn(array('name', 'url_prefix')); $rankingQuery->partitionResultIntoMultipleGroups('type', array_keys($types)); $type = $this->getColumnTypeSuffix($actionType); - $where = 'log_link_visit_action.idaction_'.$type.'_ref = '.intval($idaction).' AND '; - if ($isTitle) - { - $where .= '(log_link_visit_action.idaction_'.$type.' IS NULL OR ' - . 'log_link_visit_action.idaction_'.$type.' != '.intval($idaction).')'; - } - else - { - $where .= 'log_link_visit_action.idaction_'.$type.' != '.intval($idaction); - } + $where = 'log_link_visit_action.idaction_'.$type.'_ref = '.intval($idaction).' AND ' + . '(log_link_visit_action.idaction_'.$type.' IS NULL OR ' + . 'log_link_visit_action.idaction_'.$type.' != '.intval($idaction).')'; $orderBy = '`'.Piwik_Archive::INDEX_NB_ACTIONS.'` DESC'; diff --git a/plugins/Transitions/templates/transitions.js b/plugins/Transitions/templates/transitions.js index 29fa9cb79c..42a57ba724 100644 --- a/plugins/Transitions/templates/transitions.js +++ b/plugins/Transitions/templates/transitions.js @@ -119,8 +119,8 @@ function Piwik_Transitions(actionType, actionName, rowAction) { this.ajax = new Piwik_Transitions_Ajax(); this.model = new Piwik_Transitions_Model(this.ajax); - this.leftGroups = ['previousPages', 'searchEngines', 'websites', 'campaigns']; - this.rightGroups = ['followingPages', 'downloads', 'outlinks']; + this.leftGroups = ['previousPages', 'previousSiteSearches', 'searchEngines', 'websites', 'campaigns']; + this.rightGroups = ['followingPages', 'followingSiteSearches', 'downloads', 'outlinks']; } Piwik_Transitions.prototype.reset = function(actionType, actionName) { @@ -353,12 +353,14 @@ Piwik_Transitions.prototype.renderCenterBox = function() { }; showMetric('DirectEntries', 'directEntries', 'left', false); + showMetric('PreviousSiteSearches', 'previousSiteSearchesNbTransitions', 'left', false); showMetric('PreviousPages', 'previousPagesNbTransitions', 'left', true); showMetric('SearchEngines', 'searchEnginesNbTransitions', 'left', true); showMetric('Websites', 'websitesNbTransitions', 'left', true); showMetric('Campaigns', 'campaignsNbTransitions', 'left', true); showMetric('FollowingPages', 'followingPagesNbTransitions', 'right', true); + showMetric('FollowingSiteSearches', 'followingSiteSearchesNbTransitions', 'left', false); showMetric('Outlinks', 'outlinksNbTransitions', 'right', true); showMetric('Downloads', 'downloadsNbTransitions', 'right', true); showMetric('Exits', 'exits', 'right', false); @@ -764,8 +766,8 @@ function Piwik_Transitions_Canvas(canvasBgLeft, canvasBgRight, canvasLeft, canva * for more than 3 referrer groups. */ Piwik_Transitions_Canvas.prototype.narrowMode = function() { - this.smallBoxHeight = 30; - this.boxSpacing = 5; + this.smallBoxHeight = 26; + this.boxSpacing = 4; this.narrowMode = true; }; @@ -910,7 +912,7 @@ Piwik_Transitions_Canvas.prototype.renderBox = function(params) { var curveHeight = params.curveHeight ? params.curveHeight : Math.round(this.totalHeightOfConnections * params.share); curveHeight = Math.max(curveHeight, 1); - + var boxHeight = this.boxHeight; if (params.smallBox) { boxHeight = this.smallBoxHeight; @@ -1015,7 +1017,7 @@ Piwik_Transitions_Canvas.prototype.renderLeftBoxBg = function(context, boxHeight var leftLower = {x: this.leftCurveBeginX, y: this.leftBoxPositionY + boxHeight}; var rightUpper = {x: this.leftCurveEndX, y: this.leftCurvePositionY}; var rightLower = {x: this.leftCurveEndX, y: this.leftCurvePositionY + curveHeight}; - + // derive control points for bezier curve var center = (this.leftCurveBeginX + this.leftCurveEndX) / 2; var cp1Upper = {x: center, y: leftUpper.y}; @@ -1183,13 +1185,17 @@ function Piwik_Transitions_Model(ajax) { Piwik_Transitions_Model.prototype.htmlLoaded = function() { this.groupTitles.previousPages = Piwik_Transitions_Translations.fromPreviousPages; + this.groupTitles.previousSiteSearches = Piwik_Transitions_Translations.fromPreviousSiteSearches; this.groupTitles.followingPages = Piwik_Transitions_Translations.toFollowingPages; + this.groupTitles.followingSiteSearches = Piwik_Transitions_Translations.toFollowingSiteSearches; this.groupTitles.outlinks = Piwik_Transitions_Translations.outlinks; this.groupTitles.downloads = Piwik_Transitions_Translations.downloads; this.shareInGroupTexts = { previousPages: Piwik_Transitions_Translations.fromPreviousPagesInline, + previousSiteSearches: Piwik_Transitions_Translations.fromPreviousSiteSearchesInline, followingPages: Piwik_Transitions_Translations.toFollowingPagesInline, + followingSiteSearches: Piwik_Transitions_Translations.toFollowingSiteSearchesInline, searchEngines: Piwik_Transitions_Translations.fromSearchEnginesInline, websites: Piwik_Transitions_Translations.fromWebsitesInline, campaigns: Piwik_Transitions_Translations.fromCampaignsInline, @@ -1227,6 +1233,12 @@ Piwik_Transitions_Model.prototype.loadData = function(actionType, actionName, ca this.outlinksNbTransitions = 0; this.outlinks = []; + + this.previousSiteSearchesNbTransitions = 0; + this.previousSiteSearches = []; + + this.followingSiteSearchesNbTransitions = 0; + this.followingSiteSearches = []; this.date = ''; @@ -1264,10 +1276,12 @@ Piwik_Transitions_Model.prototype.loadData = function(actionType, actionName, ca } self.loadAndSumReport(report, 'previousPages'); + self.loadAndSumReport(report, 'previousSiteSearches'); self.loadAndSumReport(report, 'followingPages'); + self.loadAndSumReport(report, 'followingSiteSearches'); self.loadAndSumReport(report, 'downloads'); self.loadAndSumReport(report, 'outlinks'); - + if (typeof Piwik_Transitions_Model.totalNbPageviews == 'undefined') { Piwik_Transitions_Model.totalNbPageviews = false; self.ajax.loadTotalNbPageviews(function(nbPageviews) { diff --git a/plugins/Transitions/templates/transitions.tpl b/plugins/Transitions/templates/transitions.tpl index 83bc989dff..0006c2e372 100644 --- a/plugins/Transitions/templates/transitions.tpl +++ b/plugins/Transitions/templates/transitions.tpl @@ -8,6 +8,7 @@

{'Transitions_IncomingTraffic'|translate}

{$translations.fromPreviousPagesInline|translate}

+

{$translations.fromPreviousSiteSearchesInline|translate}

{$translations.fromSearchEnginesInline|translate}

{$translations.fromWebsitesInline|translate}

{$translations.fromCampaignsInline|translate}

@@ -17,6 +18,7 @@

{'Transitions_OutgoingTraffic'|translate}

{$translations.toFollowingPagesInline|translate}

+

{$translations.toFollowingSiteSearchesInline|translate}

{$translations.downloadsInline|translate}

{$translations.exitsInline|translate}

-- cgit v1.2.3