From d51900d76ff9cb35c9b0d3406fe0b93757ee4bf1 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Sat, 10 Jul 2010 04:14:45 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Piwik=20=E5=88=B0=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=BA=93=E4=B8=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +YUCHENG HU+ git-svn-id: https://svn.code.sf.net/p/hawebs/svn@467 a2543c7e-f6e9-4f8a-8bff-1ffc34733512 --- oss/piwik/trunk/plugins/Referers/API.php | 164 ++++++++ .../trunk/plugins/Referers/Controller.php | 314 +++++++++++++++ oss/piwik/trunk/plugins/Referers/Referers.php | 368 ++++++++++++++++++ .../trunk/plugins/Referers/functions.php | 144 +++++++ 4 files changed, 990 insertions(+) create mode 100644 oss/piwik/trunk/plugins/Referers/API.php create mode 100644 oss/piwik/trunk/plugins/Referers/Controller.php create mode 100644 oss/piwik/trunk/plugins/Referers/Referers.php create mode 100644 oss/piwik/trunk/plugins/Referers/functions.php diff --git a/oss/piwik/trunk/plugins/Referers/API.php b/oss/piwik/trunk/plugins/Referers/API.php new file mode 100644 index 00000000..1ad85980 --- /dev/null +++ b/oss/piwik/trunk/plugins/Referers/API.php @@ -0,0 +1,164 @@ +getDataTableExpanded($name, $idSubtable); + } + else + { + $dataTable = $archive->getDataTable($name, $idSubtable); + } + $dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS, 'desc', $naturalSort = false, $expanded)); + $dataTable->queueFilter('ReplaceColumnNames', array($expanded)); + $dataTable->queueFilter('ReplaceSummaryRowLabel'); + return $dataTable; + } + + public function getRefererType($idSite, $period, $date, $typeReferer = false) + { + $dataTable = $this->getDataTable('Referers_type', $idSite, $period, $date, $expanded = false); + if($typeReferer !== false) + { + $dataTable->filter('Pattern', array('label', $typeReferer)); + } + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getRefererTypeLabel')); + return $dataTable; + } + + public function getKeywords($idSite, $period, $date, $expanded = false) + { + $dataTable = $this->getDataTable('Referers_searchEngineByKeyword', $idSite, $period, $date, $expanded); + return $dataTable; + } + + public function getSearchEnginesFromKeywordId($idSite, $period, $date, $idSubtable) + { + $dataTable = $this->getDataTable('Referers_searchEngineByKeyword',$idSite, $period, $date, $expanded = false, $idSubtable); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') ); + $dataTable->queueFilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromUrl') ); + + // get the keyword and create the URL to the search result page + $keywords = $this->getKeywords($idSite, $period, $date); + $keyword = $keywords->getRowFromIdSubDataTable($idSubtable)->getColumn('label'); + $dataTable->queueFilter('MetadataCallbackReplace', array( 'url', 'Piwik_getSearchEngineUrlFromUrlAndKeyword', array($keyword)) ); + return $dataTable; + } + + public function getSearchEngines($idSite, $period, $date, $expanded = false) + { + $dataTable = $this->getDataTable('Referers_keywordBySearchEngine',$idSite, $period, $date, $expanded); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') ); + $dataTable->queueFilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromUrl') ); + return $dataTable; + } + + public function getKeywordsFromSearchEngineId($idSite, $period, $date, $idSubtable) + { + $dataTable = $this->getDataTable('Referers_keywordBySearchEngine',$idSite, $period, $date, $expanded = false, $idSubtable); + + // get the search engine and create the URL to the search result page + $searchEngines = $this->getSearchEngines($idSite, $period, $date); + $searchEngines->applyQueuedFilters(); + $searchEngineUrl = $searchEngines->getRowFromIdSubDataTable($idSubtable)->getMetadata('url'); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromKeywordAndUrl', array($searchEngineUrl))); + return $dataTable; + } + + public function getCampaigns($idSite, $period, $date, $expanded = false) + { + $dataTable = $this->getDataTable('Referers_keywordByCampaign',$idSite, $period, $date, $expanded); + return $dataTable; + } + + public function getKeywordsFromCampaignId($idSite, $period, $date, $idSubtable) + { + $dataTable = $this->getDataTable('Referers_keywordByCampaign',$idSite, $period, $date, $expanded = false, $idSubtable); + return $dataTable; + } + + public function getWebsites($idSite, $period, $date, $expanded = false) + { + $dataTable = $this->getDataTable('Referers_urlByWebsite',$idSite, $period, $date, $expanded); + return $dataTable; + } + + public function getUrlsFromWebsiteId($idSite, $period, $date, $idSubtable) + { + $dataTable = $this->getDataTable('Referers_urlByWebsite',$idSite, $period, $date, $expanded = false, $idSubtable); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', create_function('$label', 'return $label;')) ); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getPathFromUrl')); + return $dataTable; + } + + public function getNumberOfDistinctSearchEngines($idSite, $period, $date) + { + return $this->getNumeric('Referers_distinctSearchEngines', $idSite, $period, $date); + } + + public function getNumberOfDistinctKeywords($idSite, $period, $date) + { + return $this->getNumeric('Referers_distinctKeywords', $idSite, $period, $date); + } + + public function getNumberOfDistinctCampaigns($idSite, $period, $date) + { + return $this->getNumeric('Referers_distinctCampaigns', $idSite, $period, $date); + } + + public function getNumberOfDistinctWebsites($idSite, $period, $date) + { + return $this->getNumeric('Referers_distinctWebsites', $idSite, $period, $date); + } + + public function getNumberOfDistinctWebsitesUrls($idSite, $period, $date) + { + return $this->getNumeric('Referers_distinctWebsitesUrls', $idSite, $period, $date); + } + + private function getNumeric($name, $idSite, $period, $date) + { + Piwik::checkUserHasViewAccess( $idSite ); + $archive = Piwik_Archive::build($idSite, $period, $date ); + return $archive->getDataTableFromNumeric($name); + } +} diff --git a/oss/piwik/trunk/plugins/Referers/Controller.php b/oss/piwik/trunk/plugins/Referers/Controller.php new file mode 100644 index 00000000..f7e450cd --- /dev/null +++ b/oss/piwik/trunk/plugins/Referers/Controller.php @@ -0,0 +1,314 @@ +graphEvolutionReferers = $this->getEvolutionGraph(true, Piwik_Common::REFERER_TYPE_DIRECT_ENTRY, array('nb_visits')); + $view->nameGraphEvolutionReferers = 'ReferersgetEvolutionGraph'; + + $view->numberDistinctSearchEngines = $this->getNumberOfDistinctSearchEngines(true); + $view->numberDistinctKeywords = $this->getNumberOfDistinctKeywords(true); + $view->numberDistinctWebsites = $this->getNumberOfDistinctWebsites(true); + $view->numberDistinctWebsitesUrls = $this->getNumberOfDistinctWebsitesUrls(true); + $view->numberDistinctCampaigns = $this->getNumberOfDistinctCampaigns(true); + + // building the referers summary report + $view->dataTableRefererType = $this->getRefererType(true); + + $nameValues = $this->getReferersVisitorsByType(); + foreach($nameValues as $name => $value) + { + $view->$name = $value; + } + // sparkline for the historical data of the above values + $view->urlSparklineSearchEngines = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_SEARCH_ENGINE)); + $view->urlSparklineDirectEntry = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_DIRECT_ENTRY)); + $view->urlSparklineWebsites = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_WEBSITE)); + $view->urlSparklineCampaigns = $this->getUrlSparkline('getEvolutionGraph', array('columns' => array('nb_visits'), 'typeReferer' => Piwik_Common::REFERER_TYPE_CAMPAIGN)); + + // sparklines for the evolution of the distinct keywords count/websites count/ etc + $view->urlSparklineDistinctSearchEngines = $this->getUrlSparkline('getLastDistinctSearchEnginesGraph'); + $view->urlSparklineDistinctKeywords = $this->getUrlSparkline('getLastDistinctKeywordsGraph'); + $view->urlSparklineDistinctWebsites = $this->getUrlSparkline('getLastDistinctWebsitesGraph'); + $view->urlSparklineDistinctCampaigns = $this->getUrlSparkline('getLastDistinctCampaignsGraph'); + + echo $view->render(); + } + + function getSearchEnginesAndKeywords() + { + $view = Piwik_View::factory('searchEngines_Keywords'); + $view->searchEngines = $this->getSearchEngines(true) ; + $view->keywords = $this->getKeywords(true); + echo $view->render(); + } + + function getRefererType( $fetch = false) + { + $view = Piwik_ViewDataTable::factory('tableAllColumns'); + $view->init( $this->pluginName, + __FUNCTION__, + 'Referers.getRefererType' + ); + $view->disableSearchBox(); + $view->disableOffsetInformation(); + $view->disableExcludeLowPopulation(); + $view->enableShowGoals(); + $view->setColumnsToDisplay( array('label', 'nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnRefererType')); + return $this->renderView($view, $fetch); + } + + function getKeywords( $fetch = false) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getKeywords', + 'getSearchEnginesFromKeywordId' + ); + $view->disableExcludeLowPopulation(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnKeyword')); + $view->enableShowGoals(); + $view->disableSubTableWhenShowGoals(); + return $this->renderView($view, $fetch); + } + + function getSearchEnginesFromKeywordId( $fetch = false ) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getSearchEnginesFromKeywordId' + ); + $view->disableSearchBox(); + $view->disableExcludeLowPopulation(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnSearchEngine')); + return $this->renderView($view, $fetch); + } + + + function getSearchEngines( $fetch = false) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getSearchEngines', + 'getKeywordsFromSearchEngineId' + ); + $view->disableSearchBox(); + $view->disableExcludeLowPopulation(); + $view->enableShowGoals(); + $view->disableSubTableWhenShowGoals(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnSearchEngine')); + return $this->renderView($view, $fetch); + } + + function getKeywordsFromSearchEngineId( $fetch = false ) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getKeywordsFromSearchEngineId' + ); + $view->disableSearchBox(); + $view->disableExcludeLowPopulation(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnKeyword')); + return $this->renderView($view, $fetch); + } + + function getWebsites( $fetch = false) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getWebsites', + 'getUrlsFromWebsiteId' + ); + $view->disableExcludeLowPopulation(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setLimit(10); + $view->enableShowGoals(); + $view->disableSubTableWhenShowGoals(); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnWebsite')); + return $this->renderView($view, $fetch); + } + + function getCampaigns( $fetch = false) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getCampaigns', + 'getKeywordsFromCampaignId' + ); + + $view->disableSearchBox(); + $view->disableExcludeLowPopulation(); + $view->setLimit( 5 ); + $view->enableShowGoals(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnCampaign')); + return $this->renderView($view, $fetch); + } + + function getKeywordsFromCampaignId( $fetch = false) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getKeywordsFromCampaignId' + ); + + $view->disableSearchBox(); + $view->disableExcludeLowPopulation(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnKeyword')); + + return $this->renderView($view, $fetch); + } + + function getUrlsFromWebsiteId( $fetch = false) + { + $view = Piwik_ViewDataTable::factory(); + $view->init( $this->pluginName, __FUNCTION__, + 'Referers.getUrlsFromWebsiteId' + ); + $view->disableSearchBox(); + $view->disableExcludeLowPopulation(); + $view->setColumnsToDisplay( array('label','nb_visits') ); + $view->setColumnTranslation('label', Piwik_Translate('Referers_ColumnWebsitePage')); + return $this->renderView($view, $fetch); + } + + protected function getReferersVisitorsByType() + { + // we disable the queued filters because here we want to get the visits coming from search engines + // if the filters were applied we would have to look up for a label looking like "Search Engines" + // which is not good when we have translations + $requestString = "method=Referers.getRefererType + &format=original + &disable_queued_filters=1"; + $request = new Piwik_API_Request($requestString); + $dataTableReferersType = $request->process(); + + $nameToColumnId = array( + 'visitorsFromSearchEngines' => Piwik_Common::REFERER_TYPE_SEARCH_ENGINE, + 'visitorsFromDirectEntry' => Piwik_Common::REFERER_TYPE_DIRECT_ENTRY, + 'visitorsFromWebsites' => Piwik_Common::REFERER_TYPE_WEBSITE, + 'visitorsFromCampaigns' => Piwik_Common::REFERER_TYPE_CAMPAIGN, + ); + $return = array(); + foreach($nameToColumnId as $nameVar => $columnId) + { + $value = 0; + $row = $dataTableReferersType->getRowFromLabel($columnId); + if($row !== false) + { + $value = $row->getColumn(Piwik_Archive::INDEX_NB_VISITS); + } + $return[$nameVar] = $value; + } + return $return; + } + + protected $refererTypeToLabel = array( + Piwik_Common::REFERER_TYPE_DIRECT_ENTRY => 'Referers_DirectEntry', + Piwik_Common::REFERER_TYPE_SEARCH_ENGINE => 'Referers_SearchEngines', + Piwik_Common::REFERER_TYPE_WEBSITE => 'Referers_Websites', + Piwik_Common::REFERER_TYPE_CAMPAIGN => 'Referers_Campaigns', + ); + + public function getEvolutionGraph( $fetch = false, $typeReferer = false, $columns = false) + { + $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, 'Referers.getRefererType'); + if(empty($columns)) + { + $columns = Piwik_Common::getRequestVar('columns'); + } + if(empty($typeReferer)) + { + $typeReferer = Piwik_Common::getRequestVar('typeReferer'); + } + $view->setColumnsToDisplay($columns); + $view->setParametersToModify(array('typeReferer' => $typeReferer)); + foreach($columns as $columnName) + { + $columnTranslation = $this->standardColumnNameToTranslation[$columnName]; + $refererTypeTranslation = $this->refererTypeToLabel[$typeReferer]; + $view->setColumnTranslation( + $columnName, + Piwik_Translate('Referers_MetricsFromRefererTypeGraphLegend', + array( Piwik_Translate($columnTranslation), + Piwik_Translate($refererTypeTranslation) + ) + ) + ); + } + return $this->renderView($view, $fetch); + } + + function getLastDistinctSearchEnginesGraph( $fetch = false ) + { + $view = $this->getLastUnitGraph($this->pluginName,__FUNCTION__, "Referers.getNumberOfDistinctSearchEngines"); + $view->setColumnTranslation('Referers_distinctSearchEngines', ucfirst(Piwik_Translate('Referers_DistinctSearchEngines'))); + $view->setColumnsToDisplay(array('Referers_distinctSearchEngines')); + return $this->renderView($view, $fetch); + } + function getLastDistinctKeywordsGraph( $fetch = false ) + { + $view = $this->getLastUnitGraph($this->pluginName,__FUNCTION__, "Referers.getNumberOfDistinctKeywords"); + $view->setColumnTranslation('Referers_distinctKeywords', ucfirst(Piwik_Translate('Referers_DistinctKeywords'))); + $view->setColumnsToDisplay(array('Referers_distinctKeywords')); + return $this->renderView($view, $fetch); + } + function getLastDistinctWebsitesGraph( $fetch = false ) + { + $view = $this->getLastUnitGraph($this->pluginName,__FUNCTION__, "Referers.getNumberOfDistinctWebsites"); + $view->setColumnTranslation('Referers_distinctWebsites', ucfirst(Piwik_Translate('Referers_DistinctWebsites'))); + $view->setColumnsToDisplay(array('Referers_distinctWebsites')); + return $this->renderView($view, $fetch); + } + function getLastDistinctCampaignsGraph( $fetch = false ) + { + $view = $this->getLastUnitGraph($this->pluginName,__FUNCTION__, "Referers.getNumberOfDistinctCampaigns"); + $view->setColumnTranslation('Referers_distinctCampaigns', ucfirst(Piwik_Translate('Referers_DistinctCampaigns'))); + $view->setColumnsToDisplay(array('Referers_distinctCampaigns')); + return $this->renderView($view, $fetch); + } + + function getNumberOfDistinctSearchEngines( $fetch = false) + { + return $this->getNumericValue('Referers.' . __FUNCTION__); + } + function getNumberOfDistinctKeywords( $fetch = false) + { + return $this->getNumericValue('Referers.' . __FUNCTION__); + } + function getNumberOfDistinctCampaigns( $fetch = false) + { + return $this->getNumericValue('Referers.' . __FUNCTION__); + } + function getNumberOfDistinctWebsites( $fetch = false) + { + return $this->getNumericValue('Referers.' . __FUNCTION__); + } + function getNumberOfDistinctWebsitesUrls( $fetch = false) + { + return $this->getNumericValue('Referers.' . __FUNCTION__); + } +} diff --git a/oss/piwik/trunk/plugins/Referers/Referers.php b/oss/piwik/trunk/plugins/Referers/Referers.php new file mode 100644 index 00000000..6a0128e4 --- /dev/null +++ b/oss/piwik/trunk/plugins/Referers/Referers.php @@ -0,0 +1,368 @@ + Piwik_Translate('Referers_PluginDescription'), + 'author' => 'Piwik', + 'author_homepage' => 'http://piwik.org/', + 'version' => Piwik_Version::VERSION, + ); + + return $info; + } + + function getListHooksRegistered() + { + $hooks = array( + 'ArchiveProcessing_Day.compute' => 'archiveDay', + 'ArchiveProcessing_Period.compute' => 'archivePeriod', + 'WidgetsList.add' => 'addWidgets', + 'Menu.add' => 'addMenus', + 'Goals.getAvailableGoalSegments' => 'addGoalSegments', + ); + return $hooks; + } + + function __construct() + { + $this->columnToSortByBeforeTruncation = Piwik_Archive::INDEX_NB_VISITS; + $this->maximumRowsInDataTableLevelZero = Zend_Registry::get('config')->General->datatable_archiving_maximum_rows_referers; + $this->maximumRowsInSubDataTable = Zend_Registry::get('config')->General->datatable_archiving_maximum_rows_subtable_referers; + } + + function addWidgets() + { + Piwik_AddWidget( 'Referers_Referers', 'Referers_WidgetKeywords', 'Referers', 'getKeywords'); + Piwik_AddWidget( 'Referers_Referers', 'Referers_WidgetCampaigns', 'Referers', 'getCampaigns'); + Piwik_AddWidget( 'Referers_Referers', 'Referers_WidgetExternalWebsites', 'Referers', 'getWebsites'); + Piwik_AddWidget( 'Referers_Referers', 'Referers_WidgetSearchEngines', 'Referers', 'getSearchEngines'); + Piwik_AddWidget( 'Referers_Referers', 'Referers_WidgetOverview', 'Referers', 'getRefererType'); + } + + function addMenus() + { + Piwik_AddMenu('Referers_Referers', 'Referers_SubmenuEvolution', array('module' => 'Referers', 'action' => 'index')); + Piwik_AddMenu('Referers_Referers', 'Referers_SubmenuSearchEngines', array('module' => 'Referers', 'action' => 'getSearchEnginesAndKeywords')); + Piwik_AddMenu('Referers_Referers', 'Referers_SubmenuWebsites', array('module' => 'Referers', 'action' => 'getWebsites')); + Piwik_AddMenu('Referers_Referers', 'Referers_SubmenuCampaigns', array('module' => 'Referers', 'action' => 'getCampaigns')); + } + + function addGoalSegments( $notification ) + { + $segments =& $notification->getNotificationObject(); + $segments = array_merge($segments, array( + array( + 'group' => Piwik_Translate('Referers_Referers'), + 'name' => Piwik_Translate('Referers_Keywords'), + 'module' => 'Referers', + 'action' => 'getKeywords', + ), + array( + 'group' => Piwik_Translate('Referers_Referers'), + 'name' => Piwik_Translate('Referers_SearchEngines'), + 'module' => 'Referers', + 'action' => 'getSearchEngines', + ), + array( + 'group' => Piwik_Translate('Referers_Referers'), + 'name' => Piwik_Translate('Referers_Websites'), + 'module' => 'Referers', + 'action' => 'getWebsites', + ), + array( + 'group' => Piwik_Translate('Referers_Referers'), + 'name' => Piwik_Translate('Referers_Campaigns'), + 'module' => 'Referers', + 'action' => 'getCampaigns', + ), + array( + 'group' => Piwik_Translate('Referers_Referers'), + 'name' => Piwik_Translate('Referers_Type'), + 'module' => 'Referers', + 'action' => 'getRefererType', + ), + )); + } + + function archivePeriod( $notification ) + { + $archiveProcessing = $notification->getNotificationObject(); + + $dataTableToSum = array( + 'Referers_type', + 'Referers_keywordBySearchEngine', + 'Referers_searchEngineByKeyword', + 'Referers_keywordByCampaign', + 'Referers_urlByWebsite', + ); + $nameToCount = $archiveProcessing->archiveDataTable($dataTableToSum, null, $this->maximumRowsInDataTableLevelZero, $this->maximumRowsInSubDataTable, $this->columnToSortByBeforeTruncation); + + $mappingFromArchiveName = array( + 'Referers_distinctSearchEngines' => + array( 'typeCountToUse' => 'level0', + 'nameTableToUse' => 'Referers_keywordBySearchEngine', + ), + 'Referers_distinctKeywords' => + array( 'typeCountToUse' => 'level0', + 'nameTableToUse' => 'Referers_searchEngineByKeyword', + ), + 'Referers_distinctCampaigns' => + array( 'typeCountToUse' => 'level0', + 'nameTableToUse' => 'Referers_keywordByCampaign', + ), + 'Referers_distinctWebsites' => + array( 'typeCountToUse' => 'level0', + 'nameTableToUse' => 'Referers_urlByWebsite', + ), + 'Referers_distinctWebsitesUrls' => + array( 'typeCountToUse' => 'recursive', + 'nameTableToUse' => 'Referers_urlByWebsite', + ), + ); + + foreach($mappingFromArchiveName as $name => $infoMapping) + { + $typeCountToUse = $infoMapping['typeCountToUse']; + $nameTableToUse = $infoMapping['nameTableToUse']; + + if($typeCountToUse == 'recursive') + { + + $countValue = $nameToCount[$nameTableToUse]['recursive'] + - $nameToCount[$nameTableToUse]['level0']; + } + else + { + $countValue = $nameToCount[$nameTableToUse]['level0']; + } + $archiveProcessing->insertNumericRecord($name, $countValue); + } + } + + public function archiveDay( $notification ) + { + /** + * @var Piwik_ArchiveProcessing_Day + */ + $this->archiveProcessing = $notification->getNotificationObject(); + $this->archiveDayAggregateVisits($this->archiveProcessing); + $this->archiveDayAggregateGoals($this->archiveProcessing); + Piwik_PostEvent('Referers.archiveDay', $this); + $this->archiveDayRecordInDatabase($this->archiveProcessing); + $this->cleanup(); + } + + protected function cleanup() + { + destroy($this->interestBySearchEngine); + destroy($this->interestByKeyword); + destroy($this->interestBySearchEngineAndKeyword); + destroy($this->interestByKeywordAndSearchEngine); + destroy($this->interestByWebsite); + destroy($this->interestByWebsiteAndUrl); + destroy($this->interestByCampaignAndKeyword); + destroy($this->interestByCampaign); + destroy($this->interestByType); + destroy($this->distinctUrls); + } + + protected function archiveDayAggregateVisits(Piwik_ArchiveProcessing $archiveProcessing) + { + $query = "SELECT referer_type, + referer_name, + referer_keyword, + referer_url, + count(distinct visitor_idcookie) as nb_uniq_visitors, + count(*) as nb_visits, + sum(visit_total_actions) as nb_actions, + max(visit_total_actions) as max_actions, + sum(visit_total_time) as sum_visit_length, + sum(case visit_total_actions when 1 then 1 else 0 end) as bounce_count, + sum(case visit_goal_converted when 1 then 1 else 0 end) as nb_visits_converted + FROM ".$archiveProcessing->logTable." + WHERE visit_last_action_time >= ? + AND visit_last_action_time <= ? + AND idsite = ? + GROUP BY referer_type, referer_name, referer_url, referer_keyword + ORDER BY nb_visits DESC"; + $query = $archiveProcessing->db->query($query, array( $archiveProcessing->getStartDatetimeUTC(), $archiveProcessing->getEndDatetimeUTC(), $archiveProcessing->idsite )); + + $this->interestBySearchEngine = + $this->interestByKeyword = + $this->interestBySearchEngineAndKeyword = + $this->interestByKeywordAndSearchEngine = + $this->interestByWebsite = + $this->interestByWebsiteAndUrl = + $this->interestByCampaignAndKeyword = + $this->interestByCampaign = + $this->interestByType = + $this->distinctUrls = array(); + while($row = $query->fetch() ) + { + if(empty($row['referer_type'])) + { + $row['referer_type'] = Piwik_Common::REFERER_TYPE_DIRECT_ENTRY; + } + else + { + switch($row['referer_type']) + { + case Piwik_Common::REFERER_TYPE_SEARCH_ENGINE: + + if(!isset($this->interestBySearchEngine[$row['referer_name']])) $this->interestBySearchEngine[$row['referer_name']]= $archiveProcessing->getNewInterestRow(); + if(!isset($this->interestByKeyword[$row['referer_keyword']])) $this->interestByKeyword[$row['referer_keyword']]= $archiveProcessing->getNewInterestRow(); + if(!isset($this->interestBySearchEngineAndKeyword[$row['referer_name']][$row['referer_keyword']])) $this->interestBySearchEngineAndKeyword[$row['referer_name']][$row['referer_keyword']]= $archiveProcessing->getNewInterestRow(); + if(!isset($this->interestByKeywordAndSearchEngine[$row['referer_keyword']][$row['referer_name']])) $this->interestByKeywordAndSearchEngine[$row['referer_keyword']][$row['referer_name']]= $archiveProcessing->getNewInterestRow(); + + $archiveProcessing->updateInterestStats( $row, $this->interestBySearchEngine[$row['referer_name']]); + $archiveProcessing->updateInterestStats( $row, $this->interestByKeyword[$row['referer_keyword']]); + $archiveProcessing->updateInterestStats( $row, $this->interestBySearchEngineAndKeyword[$row['referer_name']][$row['referer_keyword']]); + $archiveProcessing->updateInterestStats( $row, $this->interestByKeywordAndSearchEngine[$row['referer_keyword']][$row['referer_name']]); + break; + + case Piwik_Common::REFERER_TYPE_WEBSITE: + + if(!isset($this->interestByWebsite[$row['referer_name']])) $this->interestByWebsite[$row['referer_name']]= $archiveProcessing->getNewInterestRow(); + $archiveProcessing->updateInterestStats( $row, $this->interestByWebsite[$row['referer_name']]); + + if(!isset($this->interestByWebsiteAndUrl[$row['referer_name']][$row['referer_url']])) $this->interestByWebsiteAndUrl[$row['referer_name']][$row['referer_url']]= $archiveProcessing->getNewInterestRow(); + $archiveProcessing->updateInterestStats( $row, $this->interestByWebsiteAndUrl[$row['referer_name']][$row['referer_url']]); + + if(!isset($this->distinctUrls[$row['referer_url']])) + { + $this->distinctUrls[$row['referer_url']] = true; + } + + break; + + case Piwik_Common::REFERER_TYPE_CAMPAIGN: + if(!empty($row['referer_keyword'])) + { + if(!isset($this->interestByCampaignAndKeyword[$row['referer_name']][$row['referer_keyword']])) $this->interestByCampaignAndKeyword[$row['referer_name']][$row['referer_keyword']]= $archiveProcessing->getNewInterestRow(); + $archiveProcessing->updateInterestStats( $row, $this->interestByCampaignAndKeyword[$row['referer_name']][$row['referer_keyword']]); + } + if(!isset($this->interestByCampaign[$row['referer_name']])) $this->interestByCampaign[$row['referer_name']]= $archiveProcessing->getNewInterestRow(); + $archiveProcessing->updateInterestStats( $row, $this->interestByCampaign[$row['referer_name']]); + break; + + case Piwik_Common::REFERER_TYPE_DIRECT_ENTRY: + // direct entry are aggregated below in $this->interestByType array + break; + + default: + throw new Exception("Non expected referer_type = " . $row['referer_type']); + break; + } + } + if(!isset($this->interestByType[$row['referer_type']] )) $this->interestByType[$row['referer_type']] = $archiveProcessing->getNewInterestRow(); + $archiveProcessing->updateInterestStats($row, $this->interestByType[$row['referer_type']]); + } + } + + protected function archiveDayAggregateGoals($archiveProcessing) + { + $query = $archiveProcessing->queryConversionsBySegment("referer_type,referer_name,referer_keyword"); + while($row = $query->fetch() ) + { + if(empty($row['referer_type'])) + { + $row['referer_type'] = Piwik_Common::REFERER_TYPE_DIRECT_ENTRY; + } + else + { + switch($row['referer_type']) + { + case Piwik_Common::REFERER_TYPE_SEARCH_ENGINE: + if(!isset($this->interestBySearchEngine[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']])) $this->interestBySearchEngine[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] = $archiveProcessing->getNewGoalRow(); + if(!isset($this->interestByKeyword[$row['referer_keyword']][Piwik_Archive::INDEX_GOALS][$row['idgoal']])) $this->interestByKeyword[$row['referer_keyword']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] = $archiveProcessing->getNewGoalRow(); + + $archiveProcessing->updateGoalStats( $row, $this->interestBySearchEngine[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']]); + $archiveProcessing->updateGoalStats( $row, $this->interestByKeyword[$row['referer_keyword']][Piwik_Archive::INDEX_GOALS][$row['idgoal']]); + break; + + case Piwik_Common::REFERER_TYPE_WEBSITE: + if(!isset($this->interestByWebsite[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']])) $this->interestByWebsite[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] = $archiveProcessing->getNewGoalRow(); + $archiveProcessing->updateGoalStats( $row, $this->interestByWebsite[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']]); + break; + + case Piwik_Common::REFERER_TYPE_CAMPAIGN: + if(!empty($row['referer_keyword'])) + { + if(!isset($this->interestByCampaignAndKeyword[$row['referer_name']][$row['referer_keyword']][Piwik_Archive::INDEX_GOALS][$row['idgoal']])) $this->interestByCampaignAndKeyword[$row['referer_name']][$row['referer_keyword']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] = $archiveProcessing->getNewGoalRow(); + $archiveProcessing->updateGoalStats( $row, $this->interestByCampaignAndKeyword[$row['referer_name']][$row['referer_keyword']][Piwik_Archive::INDEX_GOALS][$row['idgoal']]); + } + if(!isset($this->interestByCampaign[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']])) $this->interestByCampaign[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] = $archiveProcessing->getNewGoalRow(); + $archiveProcessing->updateGoalStats( $row, $this->interestByCampaign[$row['referer_name']][Piwik_Archive::INDEX_GOALS][$row['idgoal']]); + break; + + default: + throw new Exception("Non expected referer_type = " . $row['referer_type']); + break; + } + } + if(!isset($this->interestByType[$row['referer_type']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] )) $this->interestByType[$row['referer_type']][Piwik_Archive::INDEX_GOALS][$row['idgoal']] = $archiveProcessing->getNewGoalRow(); + $archiveProcessing->updateGoalStats($row, $this->interestByType[$row['referer_type']][Piwik_Archive::INDEX_GOALS][$row['idgoal']]); + } + + $archiveProcessing->enrichConversionsByLabelArray($this->interestByType); + $archiveProcessing->enrichConversionsByLabelArray($this->interestBySearchEngine); + $archiveProcessing->enrichConversionsByLabelArray($this->interestByKeyword); + $archiveProcessing->enrichConversionsByLabelArray($this->interestByWebsite); + $archiveProcessing->enrichConversionsByLabelArray($this->interestByCampaign); + $archiveProcessing->enrichConversionsByLabelArrayHasTwoLevels($this->interestByCampaignAndKeyword); + } + + protected function archiveDayRecordInDatabase($archiveProcessing) + { + $numericRecords = array( + 'Referers_distinctSearchEngines' => count($this->interestBySearchEngineAndKeyword), + 'Referers_distinctKeywords' => count($this->interestByKeywordAndSearchEngine), + 'Referers_distinctCampaigns' => count($this->interestByCampaign), + 'Referers_distinctWebsites' => count($this->interestByWebsite), + 'Referers_distinctWebsitesUrls' => count($this->distinctUrls), + ); + + foreach($numericRecords as $name => $value) + { + $archiveProcessing->insertNumericRecord($name, $value); + } + + $dataTable = $archiveProcessing->getDataTableSerialized($this->interestByType); + $archiveProcessing->insertBlobRecord('Referers_type', $dataTable); + destroy($dataTable); + + $blobRecords = array( + 'Referers_keywordBySearchEngine' => $archiveProcessing->getDataTableWithSubtablesFromArraysIndexedByLabel($this->interestBySearchEngineAndKeyword, $this->interestBySearchEngine), + 'Referers_searchEngineByKeyword' => $archiveProcessing->getDataTableWithSubtablesFromArraysIndexedByLabel($this->interestByKeywordAndSearchEngine, $this->interestByKeyword), + 'Referers_keywordByCampaign' => $archiveProcessing->getDataTableWithSubtablesFromArraysIndexedByLabel($this->interestByCampaignAndKeyword, $this->interestByCampaign), + 'Referers_urlByWebsite' => $archiveProcessing->getDataTableWithSubtablesFromArraysIndexedByLabel($this->interestByWebsiteAndUrl, $this->interestByWebsite), + ); + foreach($blobRecords as $recordName => $table ) + { + $blob = $table->getSerialized($this->maximumRowsInDataTableLevelZero, $this->maximumRowsInSubDataTable, $this->columnToSortByBeforeTruncation); + $archiveProcessing->insertBlobRecord($recordName, $blob); + destroy($table); + } + } +} diff --git a/oss/piwik/trunk/plugins/Referers/functions.php b/oss/piwik/trunk/plugins/Referers/functions.php new file mode 100644 index 00000000..98830bfe --- /dev/null +++ b/oss/piwik/trunk/plugins/Referers/functions.php @@ -0,0 +1,144 @@ +