update Piwik to version 2.16 (fixes #91)
This commit is contained in:
parent
9abe039dc8
commit
47263617c5
129 changed files with 418860 additions and 226988 deletions
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
|
|
@ -21,11 +21,11 @@ use Piwik\Piwik;
|
|||
/**
|
||||
* The Referrers API lets you access reports about Websites, Search engines, Keywords, Campaigns used to access your website.
|
||||
*
|
||||
* For example, "getKeywords" returns all search engine keywords (with <a href='http://piwik.org/docs/analytics-api/reference/#toc-metric-definitions' target='_blank'>general analytics metrics</a> for each keyword), "getWebsites" returns referrer websites (along with the full Referrer URL if the parameter &expanded=1 is set).
|
||||
* For example, "getKeywords" returns all search engine keywords (with <a href='http://piwik.org/docs/analytics-api/reference/#toc-metric-definitions' rel='noreferrer' target='_blank'>general analytics metrics</a> for each keyword), "getWebsites" returns referrer websites (along with the full Referrer URL if the parameter &expanded=1 is set).
|
||||
* "getReferrerType" returns the Referrer overview report. "getCampaigns" returns the list of all campaigns (and all campaign keywords if the parameter &expanded=1 is set).
|
||||
*
|
||||
* The methods "getKeywordsForPageUrl" and "getKeywordsForPageTitle" are used to output the top keywords used to find a page.
|
||||
* Check out the widget <a href='http://demo.piwik.org/index.php?module=Widgetize&action=iframe&moduleToWidgetize=Referrers&actionToWidgetize=getKeywordsForPage&idSite=7&period=day&date=2011-02-15&disableLink=1' target='_blank'>"Top keywords used to find this page"</a> that you can easily re-use on your website.
|
||||
* Check out the widget <a href='http://demo.piwik.org/index.php?module=Widgetize&action=iframe&moduleToWidgetize=Referrers&actionToWidgetize=getKeywordsForPage&idSite=7&period=day&date=2011-02-15&disableLink=1' rel='noreferrer' target='_blank'>"Top keywords used to find this page"</a> that you can easily re-use on your website.
|
||||
* @method static \Piwik\Plugins\Referrers\API getInstance()
|
||||
*/
|
||||
class API extends \Piwik\Plugin\API
|
||||
|
|
@ -43,7 +43,6 @@ class API extends \Piwik\Plugin\API
|
|||
protected function getDataTable($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null)
|
||||
{
|
||||
$dataTable = Archive::getDataTableFromArchive($name, $idSite, $period, $date, $segment, $expanded, $idSubtable);
|
||||
$dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS, 'desc', $naturalSort = false, $expanded));
|
||||
$dataTable->queueFilter('ReplaceColumnNames');
|
||||
return $dataTable;
|
||||
}
|
||||
|
|
@ -68,8 +67,8 @@ class API extends \Piwik\Plugin\API
|
|||
* @param bool $expanded Whether to get report w/ subtables loaded or not.
|
||||
* @return DataTable
|
||||
*/
|
||||
public function getReferrerType($idSite, $period, $date, $segment = false, $typeReferrer = false,
|
||||
$idSubtable = false, $expanded = false)
|
||||
public function getReferrerType($idSite, $period, $date, $segment = false, $typeReferrer = false,
|
||||
$idSubtable = false, $expanded = false)
|
||||
{
|
||||
// if idSubtable is supplied, interpret idSubtable as referrer type and return correct report
|
||||
if ($idSubtable !== false) {
|
||||
|
|
@ -89,6 +88,9 @@ class API extends \Piwik\Plugin\API
|
|||
}
|
||||
|
||||
if ($result) {
|
||||
$result->filter('ColumnCallbackDeleteMetadata', array('segment'));
|
||||
$result->filter('ColumnCallbackDeleteMetadata', array('segmentValue'));
|
||||
|
||||
return $this->removeSubtableIds($result); // this report won't return subtables of individual reports
|
||||
}
|
||||
}
|
||||
|
|
@ -102,11 +104,17 @@ class API extends \Piwik\Plugin\API
|
|||
}
|
||||
|
||||
// set subtable IDs for each row to the label (which holds the int referrer type)
|
||||
// NOTE: not yet possible to do this w/ DataTable\Map instances
|
||||
if (!($dataTable instanceof DataTable\Map)) {
|
||||
$this->setGetReferrerTypeSubtables($dataTable, $idSite, $period, $date, $segment, $expanded);
|
||||
}
|
||||
$dataTable->filter('Piwik\Plugins\Referrers\DataTable\Filter\SetGetReferrerTypeSubtables', array($idSite, $period, $date, $segment, $expanded));
|
||||
|
||||
$dataTable->filter('AddSegmentByLabelMapping', array(
|
||||
'referrerType',
|
||||
array(
|
||||
Common::REFERRER_TYPE_DIRECT_ENTRY => 'direct',
|
||||
Common::REFERRER_TYPE_CAMPAIGN => 'campaign',
|
||||
Common::REFERRER_TYPE_SEARCH_ENGINE => 'search',
|
||||
Common::REFERRER_TYPE_WEBSITE => 'website',
|
||||
)
|
||||
));
|
||||
// set referrer type column to readable value
|
||||
$dataTable->queueFilter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\getReferrerTypeLabel'));
|
||||
|
||||
|
|
@ -125,24 +133,25 @@ class API extends \Piwik\Plugin\API
|
|||
}
|
||||
|
||||
$dataTable = $dataTable->mergeSubtables($labelColumn = 'referer_type', $useMetadataColumn = true);
|
||||
|
||||
$dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS, 'desc'));
|
||||
$dataTable->queueFilter('ReplaceColumnNames');
|
||||
$dataTable->queueFilter('ReplaceSummaryRowLabel');
|
||||
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
public function getKeywords($idSite, $period, $date, $segment = false, $expanded = false)
|
||||
public function getKeywords($idSite, $period, $date, $segment = false, $expanded = false, $flat = false)
|
||||
{
|
||||
$dataTable = $this->getDataTable(Archiver::KEYWORDS_RECORD_NAME, $idSite, $period, $date, $segment, $expanded);
|
||||
$dataTable = $this->handleKeywordNotDefined($dataTable);
|
||||
return $dataTable;
|
||||
}
|
||||
$dataTable = Archive::createDataTableFromArchive(Archiver::KEYWORDS_RECORD_NAME, $idSite, $period, $date, $segment, $expanded, $flat);
|
||||
|
||||
if ($flat) {
|
||||
$dataTable->filterSubtables('Piwik\Plugins\Referrers\DataTable\Filter\SearchEnginesFromKeywordId', array($dataTable));
|
||||
} else {
|
||||
$dataTable->filter('AddSegmentValue');
|
||||
$dataTable->queueFilter('PrependSegment', array('referrerType==search;'));
|
||||
}
|
||||
|
||||
$dataTable->queueFilter('Piwik\Plugins\Referrers\DataTable\Filter\KeywordNotDefined');
|
||||
|
||||
protected function handleKeywordNotDefined($dataTable)
|
||||
{
|
||||
$dataTable->queueFilter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\API::getCleanKeyword'));
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
|
|
@ -151,7 +160,7 @@ class API extends \Piwik\Plugin\API
|
|||
/**
|
||||
* @ignore
|
||||
*/
|
||||
static public function getKeywordNotDefinedString()
|
||||
public static function getKeywordNotDefinedString()
|
||||
{
|
||||
return Piwik::translate('General_NotDefined', Piwik::translate('General_ColumnKeyword'));
|
||||
}
|
||||
|
|
@ -159,7 +168,7 @@ class API extends \Piwik\Plugin\API
|
|||
/**
|
||||
* @ignore
|
||||
*/
|
||||
static public function getCleanKeyword($label)
|
||||
public static function getCleanKeyword($label)
|
||||
{
|
||||
return $label == self::LABEL_KEYWORD_NOT_DEFINED
|
||||
? self::getKeywordNotDefinedString()
|
||||
|
|
@ -218,24 +227,31 @@ class API extends \Piwik\Plugin\API
|
|||
public function getSearchEnginesFromKeywordId($idSite, $period, $date, $idSubtable, $segment = false)
|
||||
{
|
||||
$dataTable = $this->getDataTable(Archiver::KEYWORDS_RECORD_NAME, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
|
||||
$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', __NAMESPACE__ . '\getSearchEngineUrlFromName'));
|
||||
$dataTable->queueFilter('MetadataCallbackAddMetadata', array('url', 'logo', __NAMESPACE__ . '\getSearchEngineLogoFromUrl'));
|
||||
$keywords = $this->getKeywords($idSite, $period, $date, $segment);
|
||||
$keyword = $keywords->getRowFromIdSubDataTable($idSubtable)->getColumn('label');
|
||||
|
||||
$dataTable->filter('Piwik\Plugins\Referrers\DataTable\Filter\SearchEnginesFromKeywordId', array($keywords, $idSubtable));
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerName'));
|
||||
$dataTable->queueFilter('PrependSegment', array('referrerKeyword=='.$keyword.';referrerType==search;'));
|
||||
|
||||
// get the keyword and create the URL to the search result page
|
||||
$keywords = $this->getKeywords($idSite, $period, $date, $segment);
|
||||
$subTable = $keywords->getRowFromIdSubDataTable($idSubtable);
|
||||
if ($subTable) {
|
||||
$keyword = $subTable->getColumn('label');
|
||||
$dataTable->queueFilter('MetadataCallbackReplace', array('url', __NAMESPACE__ . '\getSearchEngineUrlFromUrlAndKeyword', array($keyword)));
|
||||
}
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
public function getSearchEngines($idSite, $period, $date, $segment = false, $expanded = false)
|
||||
public function getSearchEngines($idSite, $period, $date, $segment = false, $expanded = false, $flat = false)
|
||||
{
|
||||
$dataTable = $this->getDataTable(Archiver::SEARCH_ENGINES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded);
|
||||
$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', __NAMESPACE__ . '\getSearchEngineUrlFromName'));
|
||||
$dataTable->queueFilter('MetadataCallbackAddMetadata', array('url', 'logo', __NAMESPACE__ . '\getSearchEngineLogoFromUrl'));
|
||||
$dataTable = Archive::createDataTableFromArchive(Archiver::SEARCH_ENGINES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded, $flat);
|
||||
|
||||
if ($flat) {
|
||||
$dataTable->filter('ColumnCallbackAddMetadata', array('label', 'url', function ($url) { return SearchEngine::getInstance()->getUrlFromName($url); }));
|
||||
$dataTable->filter('MetadataCallbackAddMetadata', array('url', 'logo', function ($url) { return SearchEngine::getInstance()->getLogoFromUrl($url); }));
|
||||
$dataTable->filterSubtables('Piwik\Plugins\Referrers\DataTable\Filter\KeywordsFromSearchEngineId', array($dataTable));
|
||||
} else {
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerName'));
|
||||
$dataTable->queueFilter('PrependSegment', array('referrerType==search;'));
|
||||
$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', function ($url) { return SearchEngine::getInstance()->getUrlFromName($url); }));
|
||||
$dataTable->queueFilter('MetadataCallbackAddMetadata', array('url', 'logo', function ($url) { return SearchEngine::getInstance()->getLogoFromUrl($url); }));
|
||||
}
|
||||
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
|
|
@ -246,57 +262,56 @@ class API extends \Piwik\Plugin\API
|
|||
// get the search engine and create the URL to the search result page
|
||||
$searchEngines = $this->getSearchEngines($idSite, $period, $date, $segment);
|
||||
$searchEngines->applyQueuedFilters();
|
||||
$searchEngine = $searchEngines->getRowFromIdSubDataTable($idSubtable)->getColumn('label');
|
||||
|
||||
if ($searchEngines instanceof DataTable\Map) {
|
||||
$dataTables = $searchEngines->getDataTables();
|
||||
$dataTable->filter('Piwik\Plugins\Referrers\DataTable\Filter\KeywordsFromSearchEngineId', array($searchEngines, $idSubtable));
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerKeyword'));
|
||||
$dataTable->queueFilter('PrependSegment', array('referrerName=='.$searchEngine.';referrerType==search;'));
|
||||
|
||||
// find first datatable containing data
|
||||
foreach ($dataTables AS $subTable) {
|
||||
|
||||
$subTableRow = $subTable->getRowFromIdSubDataTable($idSubtable);
|
||||
if (!empty($subTableRow)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$subTableRow = $searchEngines->getRowFromIdSubDataTable($idSubtable);
|
||||
}
|
||||
|
||||
if (!empty($subTableRow)) {
|
||||
$searchEngineUrl = $subTableRow->getMetadata('url');
|
||||
$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', __NAMESPACE__ . '\getSearchEngineUrlFromKeywordAndUrl', array($searchEngineUrl)));
|
||||
}
|
||||
$dataTable = $this->handleKeywordNotDefined($dataTable);
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
public function getCampaigns($idSite, $period, $date, $segment = false, $expanded = false)
|
||||
{
|
||||
$dataTable = $this->getDataTable(Archiver::CAMPAIGNS_RECORD_NAME, $idSite, $period, $date, $segment, $expanded);
|
||||
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerName'));
|
||||
$dataTable->queueFilter('PrependSegment', array('referrerType==campaign;'));
|
||||
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
public function getKeywordsFromCampaignId($idSite, $period, $date, $idSubtable, $segment = false)
|
||||
{
|
||||
$campaigns = $this->getCampaigns($idSite, $period, $date, $segment);
|
||||
$campaigns->applyQueuedFilters();
|
||||
$campaign = $campaigns->getRowFromIdSubDataTable($idSubtable)->getColumn('label');
|
||||
|
||||
$dataTable = $this->getDataTable(Archiver::CAMPAIGNS_RECORD_NAME, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerKeyword'));
|
||||
$dataTable->queueFilter('PrependSegment', array('referrerName=='.$campaign.';referrerType==campaign;'));
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
public function getWebsites($idSite, $period, $date, $segment = false, $expanded = false)
|
||||
public function getWebsites($idSite, $period, $date, $segment = false, $expanded = false, $flat = false)
|
||||
{
|
||||
$dataTable = $this->getDataTable(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded);
|
||||
$dataTable = Archive::createDataTableFromArchive(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded, $flat, $idSubtable = null);
|
||||
|
||||
if ($flat) {
|
||||
$dataTable->filterSubtables('Piwik\Plugins\Referrers\DataTable\Filter\UrlsFromWebsiteId');
|
||||
} else {
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerName'));
|
||||
}
|
||||
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
public function getUrlsFromWebsiteId($idSite, $period, $date, $idSubtable, $segment = false)
|
||||
{
|
||||
$dataTable = $this->getDataTable(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
|
||||
// the htmlspecialchars_decode call is for BC for before 1.1
|
||||
// as the Referrer URL was previously encoded in the log tables, but is now recorded raw
|
||||
$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', function ($label) {
|
||||
return htmlspecialchars_decode($label);
|
||||
}));
|
||||
$dataTable->queueFilter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\getPathFromUrl'));
|
||||
$dataTable->filter('Piwik\Plugins\Referrers\DataTable\Filter\UrlsFromWebsiteId');
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerUrl'));
|
||||
|
||||
return $dataTable;
|
||||
}
|
||||
|
||||
|
|
@ -309,21 +324,25 @@ class API extends \Piwik\Plugin\API
|
|||
* @param string $date
|
||||
* @param string|bool $segment
|
||||
* @param bool $expanded
|
||||
* @param bool $flat
|
||||
* @return DataTable
|
||||
*/
|
||||
public function getSocials($idSite, $period, $date, $segment = false, $expanded = false)
|
||||
public function getSocials($idSite, $period, $date, $segment = false, $expanded = false, $flat = false)
|
||||
{
|
||||
$dataTable = $this->getDataTable(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded);
|
||||
$dataTable = Archive::createDataTableFromArchive(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded, false);
|
||||
|
||||
$dataTable->filter('ColumnCallbackDeleteRow', array('label', function ($url) { return !isSocialUrl($url); }));
|
||||
|
||||
$dataTable->filter('ColumnCallbackAddMetadata', array('label', 'url', __NAMESPACE__ . '\getSocialMainUrl'));
|
||||
$dataTable->filter('GroupBy', array('label', __NAMESPACE__ . '\getSocialNetworkFromDomain'));
|
||||
$dataTable->filter('ColumnCallbackDeleteRow', array('label', function ($url) { return !Social::getInstance()->isSocialUrl($url); }));
|
||||
$dataTable->filter('ColumnCallbackAddMetadata', array('label', 'url', function ($url) { return Social::getInstance()->getMainUrl($url); }));
|
||||
$dataTable->filter('GroupBy', array('label', function ($url) { return Social::getInstance()->getSocialNetworkFromDomain($url); }));
|
||||
|
||||
$this->setSocialIdSubtables($dataTable);
|
||||
$this->removeSubtableMetadata($dataTable);
|
||||
|
||||
$dataTable->queueFilter('MetadataCallbackAddMetadata', array('url', 'logo', __NAMESPACE__ . '\getSocialsLogoFromUrl'));
|
||||
if ($flat) {
|
||||
$this->buildExpandedTableForFlattenGetSocials($idSite, $period, $date, $segment, $expanded, $dataTable);
|
||||
}
|
||||
|
||||
$dataTable->queueFilter('MetadataCallbackAddMetadata', array('url', 'logo', function ($url) { return Social::getInstance()->getLogoFromUrl($url); }));
|
||||
|
||||
return $dataTable;
|
||||
}
|
||||
|
|
@ -337,7 +356,7 @@ class API extends \Piwik\Plugin\API
|
|||
* @param string $date
|
||||
* @param bool|string $segment
|
||||
* @param bool|int $idSubtable This ID does not reference a real DataTable record. Instead, it
|
||||
* is the array index of an item in the /core/DataFiles/Socials.php file.
|
||||
* is the array index of an item in the Socials list file.
|
||||
* The urls are filtered by the social network at this index.
|
||||
* If false, no filtering is done and every social URL is returned.
|
||||
* @return DataTable
|
||||
|
|
@ -347,7 +366,7 @@ class API extends \Piwik\Plugin\API
|
|||
$dataTable = $this->getDataTable(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded = true);
|
||||
|
||||
// get the social network domain referred to by $idSubtable
|
||||
$socialNetworks = Common::getSocialUrls();
|
||||
$socialNetworks = Social::getInstance()->getDefinitions();
|
||||
|
||||
$social = false;
|
||||
if ($idSubtable !== false) {
|
||||
|
|
@ -365,20 +384,15 @@ class API extends \Piwik\Plugin\API
|
|||
$dataTable->filter(
|
||||
'ColumnCallbackDeleteRow',
|
||||
array('label',
|
||||
function ($url) use ($social) { return !isSocialUrl($url, $social); }
|
||||
function ($url) use ($social) { return !Social::getInstance()->isSocialUrl($url, $social); }
|
||||
)
|
||||
);
|
||||
|
||||
// merge the datatable's subtables which contain the individual URLs
|
||||
$dataTable = $dataTable->mergeSubtables();
|
||||
|
||||
// make url labels clickable
|
||||
$dataTable->filter('ColumnCallbackAddMetadata', array('label', 'url'));
|
||||
|
||||
// prettify the DataTable
|
||||
$dataTable->filter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\removeUrlProtocol'));
|
||||
$dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS, 'desc', $naturalSort = false, $expanded));
|
||||
$dataTable->queueFilter('ReplaceColumnNames');
|
||||
$dataTable->filter('AddSegmentByLabel', array('referrerUrl'));
|
||||
$dataTable->filter('Piwik\Plugins\Referrers\DataTable\Filter\UrlsForSocial', array($expanded));
|
||||
|
||||
return $dataTable;
|
||||
}
|
||||
|
|
@ -437,7 +451,7 @@ class API extends \Piwik\Plugin\API
|
|||
/**
|
||||
* Sets the subtable IDs for the DataTable returned by getSocial.
|
||||
*
|
||||
* The IDs are int indexes into the array in /core/DataFiles/Socials.php.
|
||||
* The IDs are int indexes into the array in of defined socials.
|
||||
*
|
||||
* @param DataTable $dataTable
|
||||
*/
|
||||
|
|
@ -452,9 +466,9 @@ class API extends \Piwik\Plugin\API
|
|||
$socialName = $row->getColumn('label');
|
||||
|
||||
$i = 1; // start at one because idSubtable=0 is equivalent to idSubtable=false
|
||||
foreach (Common::getSocialUrls() as $domain => $name) {
|
||||
foreach (Social::getInstance()->getDefinitions() as $name) {
|
||||
if ($name == $socialName) {
|
||||
$row->c[Row::DATATABLE_ASSOCIATED] = $i;
|
||||
$row->setNonLoadedSubtableId($i);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -489,42 +503,44 @@ class API extends \Piwik\Plugin\API
|
|||
}
|
||||
|
||||
/**
|
||||
* Utility function that sets the subtables for the getReferrerType report.
|
||||
*
|
||||
* If we're not getting an expanded datatable, the subtable ID is set to each parent
|
||||
* row's referrer type (stored in the label for the getReferrerType report).
|
||||
*
|
||||
* If we are getting an expanded datatable, the datatable for the row's referrer
|
||||
* type is loaded and attached to the appropriate row in the getReferrerType report.
|
||||
*
|
||||
* @param DataTable $dataTable
|
||||
* @param string $idSite
|
||||
* @param int $idSite
|
||||
* @param string $period
|
||||
* @param string $date
|
||||
* @param string $segment
|
||||
* @param string|false $segment
|
||||
* @param bool $expanded
|
||||
* @param DataTable $dataTable
|
||||
*/
|
||||
private function setGetReferrerTypeSubtables($dataTable, $idSite, $period, $date, $segment, $expanded)
|
||||
private function buildExpandedTableForFlattenGetSocials($idSite, $period, $date, $segment, $expanded, $dataTable)
|
||||
{
|
||||
$urlsTable = Archive::createDataTableFromArchive(Archiver::WEBSITES_RECORD_NAME, $idSite, $period, $date, $segment, $expanded, $flat = true);
|
||||
$urlsTable->filter('ColumnCallbackDeleteRow', array('label', function ($url) {
|
||||
return !Social::getInstance()->isSocialUrl($url);
|
||||
}));
|
||||
$urlsTable = $urlsTable->mergeSubtables();
|
||||
|
||||
foreach ($dataTable->getRows() as $row) {
|
||||
$typeReferrer = $row->getColumn('label');
|
||||
if ($typeReferrer != Common::REFERRER_TYPE_DIRECT_ENTRY) {
|
||||
if (!$expanded) // if we don't want the expanded datatable, then don't do any extra queries
|
||||
{
|
||||
$row->c[Row::DATATABLE_ASSOCIATED] = $typeReferrer;
|
||||
} else // otherwise, we have to get the othe datatables
|
||||
{
|
||||
$subtable = $this->getReferrerType($idSite, $period, $date, $segment, $type = false,
|
||||
$idSubtable = $typeReferrer);
|
||||
$row->removeSubtable();
|
||||
|
||||
if ($expanded) {
|
||||
$subtable->applyQueuedFilters();
|
||||
}
|
||||
$social = $row->getColumn('label');
|
||||
$newTable = $urlsTable->getEmptyClone();
|
||||
|
||||
$row->setSubtable($subtable);
|
||||
$rows = $urlsTable->getRows();
|
||||
foreach ($rows as $id => $urlsTableRow) {
|
||||
$url = $urlsTableRow->getColumn('label');
|
||||
if (Social::getInstance()->isSocialUrl($url, $social)) {
|
||||
$newTable->addRow($urlsTableRow);
|
||||
$urlsTable->deleteRow($id);
|
||||
}
|
||||
}
|
||||
|
||||
if ($newTable->getRowsCount()) {
|
||||
$newTable->filter('Piwik\Plugins\Referrers\DataTable\Filter\UrlsForSocial', array($expanded));
|
||||
$row->setSubtable($newTable);
|
||||
}
|
||||
}
|
||||
|
||||
Common::destroy($urlsTable);
|
||||
$urlsTable = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
|
|
@ -71,7 +71,6 @@ class Archiver extends \Piwik\Plugin\Archiver
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
protected function makeReferrerTypeNonEmpty(&$row)
|
||||
{
|
||||
if (empty($row['referer_type'])) {
|
||||
|
|
@ -205,10 +204,10 @@ class Archiver extends \Piwik\Plugin\Archiver
|
|||
protected function insertDayNumericMetrics()
|
||||
{
|
||||
$numericRecords = array(
|
||||
self::METRIC_DISTINCT_SEARCH_ENGINE_RECORD_NAME => count($this->getDataArray(self::SEARCH_ENGINES_RECORD_NAME)),
|
||||
self::METRIC_DISTINCT_KEYWORD_RECORD_NAME => count($this->getDataArray(self::KEYWORDS_RECORD_NAME)),
|
||||
self::METRIC_DISTINCT_CAMPAIGN_RECORD_NAME => count($this->getDataArray(self::CAMPAIGNS_RECORD_NAME)),
|
||||
self::METRIC_DISTINCT_WEBSITE_RECORD_NAME => count($this->getDataArray(self::WEBSITES_RECORD_NAME)),
|
||||
self::METRIC_DISTINCT_SEARCH_ENGINE_RECORD_NAME => count($this->getDataArray(self::SEARCH_ENGINES_RECORD_NAME)->getDataArray()),
|
||||
self::METRIC_DISTINCT_KEYWORD_RECORD_NAME => count($this->getDataArray(self::KEYWORDS_RECORD_NAME)->getDataArray()),
|
||||
self::METRIC_DISTINCT_CAMPAIGN_RECORD_NAME => count($this->getDataArray(self::CAMPAIGNS_RECORD_NAME)->getDataArray()),
|
||||
self::METRIC_DISTINCT_WEBSITE_RECORD_NAME => count($this->getDataArray(self::WEBSITES_RECORD_NAME)->getDataArray()),
|
||||
self::METRIC_DISTINCT_URLS_RECORD_NAME => count($this->distinctUrls),
|
||||
);
|
||||
|
||||
|
|
@ -218,7 +217,16 @@ class Archiver extends \Piwik\Plugin\Archiver
|
|||
public function aggregateMultipleReports()
|
||||
{
|
||||
$dataTableToSum = $this->getRecordNames();
|
||||
$nameToCount = $this->getProcessor()->aggregateDataTableRecords($dataTableToSum, $this->maximumRowsInDataTableLevelZero, $this->maximumRowsInSubDataTable, $this->columnToSortByBeforeTruncation);
|
||||
$columnsAggregationOperation = null;
|
||||
$nameToCount = $this->getProcessor()->aggregateDataTableRecords(
|
||||
$dataTableToSum,
|
||||
$this->maximumRowsInDataTableLevelZero,
|
||||
$this->maximumRowsInSubDataTable,
|
||||
$this->columnToSortByBeforeTruncation,
|
||||
$columnsAggregationOperation,
|
||||
$columnsToRenameAfterAggregation = null,
|
||||
$countRowsRecursive = array(self::WEBSITES_RECORD_NAME)
|
||||
);
|
||||
|
||||
$mappingFromArchiveName = array(
|
||||
self::METRIC_DISTINCT_SEARCH_ENGINE_RECORD_NAME =>
|
||||
|
|
|
|||
514
www/analytics/plugins/Referrers/Columns/Base.php
Normal file
514
www/analytics/plugins/Referrers/Columns/Base.php
Normal file
|
|
@ -0,0 +1,514 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\Piwik;
|
||||
use Piwik\Plugin\Dimension\VisitDimension;
|
||||
use Piwik\Plugins\Referrers\SearchEngine AS SearchEngineDetection;
|
||||
use Piwik\Plugins\SitesManager\SiteUrls;
|
||||
use Piwik\Tracker\Cache;
|
||||
use Piwik\Tracker\PageUrl;
|
||||
use Piwik\Tracker\Request;
|
||||
use Piwik\Tracker\Visit;
|
||||
use Piwik\Tracker\Visitor;
|
||||
use Piwik\Tracker\Action;
|
||||
use Piwik\UrlHelper;
|
||||
|
||||
abstract class Base extends VisitDimension
|
||||
{
|
||||
|
||||
// @see detect*() referrer methods
|
||||
protected $typeReferrerAnalyzed;
|
||||
protected $nameReferrerAnalyzed;
|
||||
protected $keywordReferrerAnalyzed;
|
||||
protected $referrerHost;
|
||||
protected $referrerUrl;
|
||||
protected $referrerUrlParse;
|
||||
protected $currentUrlParse;
|
||||
protected $idsite;
|
||||
|
||||
private static $cachedReferrerSearchEngine = array();
|
||||
|
||||
// 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
|
||||
*/
|
||||
protected function getReferrerInformation($referrerUrl, $currentUrl, $idSite, Request $request, Visitor $visitor)
|
||||
{
|
||||
$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($request, $visitor);
|
||||
|
||||
if (!$referrerDetected) {
|
||||
if ($this->detectReferrerDirectEntry()
|
||||
|| $this->detectReferrerSearchEngine()
|
||||
) {
|
||||
$referrerDetected = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$referrerDetected && !empty($this->referrerHost)) {
|
||||
$this->typeReferrerAnalyzed = Common::REFERRER_TYPE_WEBSITE;
|
||||
$this->nameReferrerAnalyzed = Common::mb_strtolower($this->referrerHost);
|
||||
|
||||
$urlsByHost = $this->getCachedUrlsByHostAndIdSite();
|
||||
|
||||
$directEntry = new SiteUrls();
|
||||
$path = $directEntry->getPathMatchingUrl($this->referrerUrlParse, $urlsByHost);
|
||||
if (!empty($path) && $path !== '/') {
|
||||
$this->nameReferrerAnalyzed .= rtrim($path, '/');
|
||||
}
|
||||
}
|
||||
|
||||
$referrerInformation = array(
|
||||
'referer_type' => $this->typeReferrerAnalyzed,
|
||||
'referer_name' => $this->nameReferrerAnalyzed,
|
||||
'referer_keyword' => $this->keywordReferrerAnalyzed,
|
||||
'referer_url' => $this->referrerUrl,
|
||||
);
|
||||
|
||||
return $referrerInformation;
|
||||
}
|
||||
|
||||
protected function getReferrerInformationFromRequest(Request $request, Visitor $visitor)
|
||||
{
|
||||
$referrerUrl = $request->getParam('urlref');
|
||||
$currentUrl = $request->getParam('url');
|
||||
|
||||
return $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite(), $request, $visitor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search engine detection
|
||||
* @return bool
|
||||
*/
|
||||
protected function detectReferrerSearchEngine()
|
||||
{
|
||||
if (isset(self::$cachedReferrerSearchEngine[$this->referrerUrl])) {
|
||||
$searchEngineInformation = self::$cachedReferrerSearchEngine[$this->referrerUrl];
|
||||
} else {
|
||||
$searchEngineInformation = SearchEngineDetection::getInstance()->extractInformationFromUrl($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));
|
||||
|
||||
self::$cachedReferrerSearchEngine[$this->referrerUrl] = $searchEngineInformation;
|
||||
}
|
||||
|
||||
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']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected function detectReferrerCampaignFromTrackerParams(Request $request)
|
||||
{
|
||||
$campaignName = $this->getReferrerCampaignQueryParam($request, '_rcn');
|
||||
if (empty($campaignName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->typeReferrerAnalyzed = Common::REFERRER_TYPE_CAMPAIGN;
|
||||
$this->nameReferrerAnalyzed = $campaignName;
|
||||
|
||||
$keyword = $this->getReferrerCampaignQueryParam($request, '_rck');
|
||||
if (!empty($keyword)) {
|
||||
$this->keywordReferrerAnalyzed = $keyword;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function getCachedUrlsByHostAndIdSite()
|
||||
{
|
||||
$cache = Cache::getCacheGeneral();
|
||||
|
||||
if (!empty($cache['allUrlsByHostAndIdSite'])) {
|
||||
return $cache['allUrlsByHostAndIdSite'];
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$urlsByHost = $this->getCachedUrlsByHostAndIdSite();
|
||||
|
||||
$directEntry = new SiteUrls();
|
||||
$matchingSites = $directEntry->getIdSitesMatchingUrl($this->referrerUrlParse, $urlsByHost);
|
||||
|
||||
if (isset($matchingSites) && is_array($matchingSites) && in_array($this->idsite, $matchingSites)) {
|
||||
$this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY;
|
||||
return true;
|
||||
} elseif (isset($matchingSites)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// fallback logic if the referrer domain is not known to any site to not break BC
|
||||
if (isset($this->currentUrlParse['host'])) {
|
||||
// this might be actually buggy if first thing tracked is eg an outlink and referrer is from that site
|
||||
$currentHost = Common::mb_strtolower($this->currentUrlParse['host']);
|
||||
if ($currentHost == Common::mb_strtolower($this->referrerHost)) {
|
||||
$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 = SearchEngineDetection::getInstance()->extractInformationFromUrl($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(Request $request, Visitor $visitor)
|
||||
{
|
||||
$isCampaign = $this->detectReferrerCampaignFromTrackerParams($request);
|
||||
if (!$isCampaign) {
|
||||
$this->detectReferrerCampaignFromLandingUrl();
|
||||
}
|
||||
|
||||
$this->detectCampaignKeywordFromReferrerUrl();
|
||||
|
||||
$isCurrentVisitACampaignWithSameName = $visitor->getVisitorColumn('referer_name') == $this->nameReferrerAnalyzed;
|
||||
$isCurrentVisitACampaignWithSameName = $isCurrentVisitACampaignWithSameName && $visitor->getVisitorColumn('referer_type') == Common::REFERRER_TYPE_CAMPAIGN;
|
||||
|
||||
// if we detected a campaign but there is still no keyword set, we set the keyword to the Referrer host
|
||||
if (empty($this->keywordReferrerAnalyzed)) {
|
||||
if ($isCurrentVisitACampaignWithSameName) {
|
||||
$this->keywordReferrerAnalyzed = $visitor->getVisitorColumn('referer_keyword');
|
||||
// it is an existing visit and no referrer keyword was used initially (or a different host),
|
||||
// we do not use the default referrer host in this case as it would create a new visit. It would create
|
||||
// a new visit because initially the referrer keyword was not set (or from a different host) and now
|
||||
// we would set it suddenly. The changed keyword would be recognized as a campaign change and a new
|
||||
// visit would be forced. Why would it suddenly set a keyword but not do it initially?
|
||||
// This happens when on the first visit when the URL was opened directly (no referrer or different host)
|
||||
// and then the user navigates to another page where the referrer host becomes the own host
|
||||
// (referrer = own website) see https://github.com/piwik/piwik/issues/9299
|
||||
} else {
|
||||
$this->keywordReferrerAnalyzed = $this->referrerHost;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->typeReferrerAnalyzed != Common::REFERRER_TYPE_CAMPAIGN) {
|
||||
$this->keywordReferrerAnalyzed = null;
|
||||
$this->nameReferrerAnalyzed = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->keywordReferrerAnalyzed = Common::mb_strtolower($this->keywordReferrerAnalyzed);
|
||||
$this->nameReferrerAnalyzed = Common::mb_strtolower($this->nameReferrerAnalyzed);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function getValueForRecordGoal(Request $request, Visitor $visitor)
|
||||
{
|
||||
$referrerUrl = $request->getParam('_ref');
|
||||
$referrerCampaignName = $this->getReferrerCampaignQueryParam($request, '_rcn');
|
||||
$referrerCampaignKeyword = $this->getReferrerCampaignQueryParam($request, '_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
|
||||
|
||||
|
||||
Common::printDebug("Attributing a referrer to this Goal...");
|
||||
|
||||
// 3) Default values: current referrer
|
||||
$type = $visitor->getVisitorColumn('referer_type');
|
||||
$name = $visitor->getVisitorColumn('referer_name');
|
||||
$keyword = $visitor->getVisitorColumn('referer_keyword');
|
||||
|
||||
// 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
|
||||
Common::printDebug("Invalid Referrer information found: current visitor seems to have used a campaign, but campaign name was not found in the request.");
|
||||
} // 1) Campaigns from 1st party cookie
|
||||
elseif (!empty($referrerCampaignName)) {
|
||||
$type = Common::REFERRER_TYPE_CAMPAIGN;
|
||||
$name = $referrerCampaignName;
|
||||
$keyword = $referrerCampaignKeyword;
|
||||
Common::printDebug("Campaign information from 1st party cookie is used.");
|
||||
} // 2) Referrer URL parsing
|
||||
elseif (!empty($referrerUrl)) {
|
||||
|
||||
$idSite = $request->getIdSite();
|
||||
$referrer = $this->getReferrerInformation($referrerUrl, $currentUrl = '', $idSite, $request, $visitor);
|
||||
|
||||
// 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'];
|
||||
|
||||
Common::printDebug("Referrer URL (search engine or website) is used.");
|
||||
} else {
|
||||
Common::printDebug("No referrer attribution found for this user. Current user's visit referrer is used.");
|
||||
}
|
||||
} else {
|
||||
Common::printDebug("No referrer attribution found for this user. Current user's visit referrer is used.");
|
||||
}
|
||||
|
||||
$this->setCampaignValuesToLowercase($type, $name, $keyword);
|
||||
|
||||
$fields = array(
|
||||
'referer_type' => $type,
|
||||
'referer_name' => $name,
|
||||
'referer_keyword' => $keyword,
|
||||
);
|
||||
|
||||
if (array_key_exists($this->columnName, $fields)) {
|
||||
return $fields[$this->columnName];
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function isReferrerInformationNew(Visitor $visitor, $information)
|
||||
{
|
||||
foreach (array('referer_keyword', 'referer_name', 'referer_type') as $infoName) {
|
||||
if ($this->hasReferrerColumnChanged($visitor, $information, $infoName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function hasReferrerColumnChanged(Visitor $visitor, $information, $infoName)
|
||||
{
|
||||
return Common::mb_strtolower($visitor->getVisitorColumn($infoName)) != Common::mb_strtolower($information[$infoName]);
|
||||
}
|
||||
|
||||
protected function doesLastActionHaveSameReferrer(Visitor $visitor, $referrerType)
|
||||
{
|
||||
return $visitor->getVisitorColumn('referer_type') == $referrerType;
|
||||
}
|
||||
|
||||
protected function getReferrerCampaignQueryParam(Request $request, $paramName)
|
||||
{
|
||||
return trim(urldecode($request->getParam($paramName)));
|
||||
}
|
||||
}
|
||||
65
www/analytics/plugins/Referrers/Columns/Campaign.php
Normal file
65
www/analytics/plugins/Referrers/Columns/Campaign.php
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\Piwik;
|
||||
use Piwik\Tracker\Action;
|
||||
use Piwik\Tracker\Request;
|
||||
use Piwik\Tracker\TrackerConfig;
|
||||
use Piwik\Tracker\Visitor;
|
||||
|
||||
class Campaign extends Base
|
||||
{
|
||||
/**
|
||||
* Obtained from the `[Tracker] create_new_visit_when_campaign_changes` INI config option.
|
||||
* If true, will create new visits when campaign name changes.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $createNewVisitWhenCampaignChanges;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->createNewVisitWhenCampaignChanges = TrackerConfig::getConfigValue('create_new_visit_when_campaign_changes') == 1;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('Referrers_ColumnCampaign');
|
||||
}
|
||||
|
||||
/**
|
||||
* If we should create a new visit when the campaign changes, check if the campaign info changed and if so
|
||||
* force the tracker to create a new visit.i
|
||||
*
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return bool
|
||||
*/
|
||||
public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
|
||||
{
|
||||
if (!$this->createNewVisitWhenCampaignChanges) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$information = $this->getReferrerInformationFromRequest($request, $visitor);
|
||||
|
||||
if ($information['referer_type'] == Common::REFERRER_TYPE_CAMPAIGN
|
||||
&& $this->isReferrerInformationNew($visitor, $information)
|
||||
) {
|
||||
Common::printDebug("Existing visit detected, but creating new visit because campaign information is different than last action.");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
64
www/analytics/plugins/Referrers/Columns/Keyword.php
Normal file
64
www/analytics/plugins/Referrers/Columns/Keyword.php
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\Piwik;
|
||||
use Piwik\Plugins\Referrers\Segment;
|
||||
use Piwik\Tracker\Request;
|
||||
use Piwik\Tracker\Visitor;
|
||||
use Piwik\Tracker\Action;
|
||||
|
||||
class Keyword extends Base
|
||||
{
|
||||
protected $columnName = 'referer_keyword';
|
||||
protected $columnType = 'VARCHAR(255) NULL';
|
||||
|
||||
protected function configureSegments()
|
||||
{
|
||||
$segment = new Segment();
|
||||
$segment->setSegment('referrerKeyword');
|
||||
$segment->setName('General_ColumnKeyword');
|
||||
$segment->setAcceptedValues('Encoded%20Keyword, keyword');
|
||||
$this->addSegment($segment);
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('General_ColumnKeyword');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function onNewVisit(Request $request, Visitor $visitor, $action)
|
||||
{
|
||||
$information = $this->getReferrerInformationFromRequest($request, $visitor);
|
||||
|
||||
if (!empty($information['referer_keyword'])) {
|
||||
return Common::mb_substr($information['referer_keyword'], 0, 255);
|
||||
}
|
||||
|
||||
return $information['referer_keyword'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
|
||||
{
|
||||
return $this->getValueForRecordGoal($request, $visitor);
|
||||
}
|
||||
}
|
||||
20
www/analytics/plugins/Referrers/Columns/Referrer.php
Normal file
20
www/analytics/plugins/Referrers/Columns/Referrer.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Columns\Dimension;
|
||||
use Piwik\Piwik;
|
||||
|
||||
class Referrer extends Dimension
|
||||
{
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('Referrers_Referrer');
|
||||
}
|
||||
}
|
||||
57
www/analytics/plugins/Referrers/Columns/ReferrerName.php
Normal file
57
www/analytics/plugins/Referrers/Columns/ReferrerName.php
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\Plugins\Referrers\Segment;
|
||||
use Piwik\Tracker\Request;
|
||||
use Piwik\Tracker\Visitor;
|
||||
use Piwik\Tracker\Action;
|
||||
|
||||
class ReferrerName extends Base
|
||||
{
|
||||
protected $columnName = 'referer_name';
|
||||
protected $columnType = 'VARCHAR(70) NULL';
|
||||
|
||||
protected function configureSegments()
|
||||
{
|
||||
$segment = new Segment();
|
||||
$segment->setSegment('referrerName');
|
||||
$segment->setName('Referrers_ReferrerName');
|
||||
$segment->setAcceptedValues('twitter.com, www.facebook.com, Bing, Google, Yahoo, CampaignName');
|
||||
$this->addSegment($segment);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function onNewVisit(Request $request, Visitor $visitor, $action)
|
||||
{
|
||||
$information = $this->getReferrerInformationFromRequest($request, $visitor);
|
||||
|
||||
if (!empty($information['referer_name'])) {
|
||||
return Common::mb_substr($information['referer_name'], 0, 70);
|
||||
}
|
||||
return $information['referer_name'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
|
||||
{
|
||||
return $this->getValueForRecordGoal($request, $visitor);
|
||||
}
|
||||
}
|
||||
60
www/analytics/plugins/Referrers/Columns/ReferrerType.php
Normal file
60
www/analytics/plugins/Referrers/Columns/ReferrerType.php
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Piwik;
|
||||
use Piwik\Plugins\Referrers\Segment;
|
||||
use Piwik\Tracker\Request;
|
||||
use Piwik\Tracker\Visitor;
|
||||
use Piwik\Tracker\Action;
|
||||
|
||||
class ReferrerType extends Base
|
||||
{
|
||||
protected $columnName = 'referer_type';
|
||||
protected $columnType = 'TINYINT(1) UNSIGNED NULL';
|
||||
|
||||
protected function configureSegments()
|
||||
{
|
||||
$segment = new Segment();
|
||||
$segment->setSegment('referrerType');
|
||||
$segment->setName('Referrers_Type');
|
||||
$segment->setSqlFilterValue('Piwik\Plugins\Referrers\getReferrerTypeFromShortName');
|
||||
$segment->setAcceptedValues('direct, search, website, campaign');
|
||||
$this->addSegment($segment);
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('Referrers_Type');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function onNewVisit(Request $request, Visitor $visitor, $action)
|
||||
{
|
||||
$information = $this->getReferrerInformationFromRequest($request, $visitor);
|
||||
|
||||
return $information['referer_type'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
|
||||
{
|
||||
return $this->getValueForRecordGoal($request, $visitor);
|
||||
}
|
||||
}
|
||||
42
www/analytics/plugins/Referrers/Columns/ReferrerUrl.php
Normal file
42
www/analytics/plugins/Referrers/Columns/ReferrerUrl.php
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Plugins\Referrers\Segment;
|
||||
use Piwik\Tracker\Request;
|
||||
use Piwik\Tracker\Visitor;
|
||||
use Piwik\Tracker\Action;
|
||||
|
||||
class ReferrerUrl extends Base
|
||||
{
|
||||
protected $columnName = 'referer_url';
|
||||
protected $columnType = 'TEXT NOT NULL';
|
||||
|
||||
protected function configureSegments()
|
||||
{
|
||||
$segment = new Segment();
|
||||
$segment->setSegment('referrerUrl');
|
||||
$segment->setName('Live_Referrer_URL');
|
||||
$segment->setAcceptedValues('http%3A%2F%2Fwww.example.org%2Freferer-page.htm');
|
||||
$this->addSegment($segment);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param Visitor $visitor
|
||||
* @param Action|null $action
|
||||
* @return mixed
|
||||
*/
|
||||
public function onNewVisit(Request $request, Visitor $visitor, $action)
|
||||
{
|
||||
$information = $this->getReferrerInformationFromRequest($request, $visitor);
|
||||
|
||||
return $information['referer_url'];
|
||||
}
|
||||
}
|
||||
20
www/analytics/plugins/Referrers/Columns/SearchEngine.php
Normal file
20
www/analytics/plugins/Referrers/Columns/SearchEngine.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Columns\Dimension;
|
||||
use Piwik\Piwik;
|
||||
|
||||
class SearchEngine extends Dimension
|
||||
{
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('Referrers_ColumnSearchEngine');
|
||||
}
|
||||
}
|
||||
20
www/analytics/plugins/Referrers/Columns/SocialNetwork.php
Normal file
20
www/analytics/plugins/Referrers/Columns/SocialNetwork.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Columns\Dimension;
|
||||
use Piwik\Piwik;
|
||||
|
||||
class SocialNetwork extends Dimension
|
||||
{
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('Referrers_ColumnSocial');
|
||||
}
|
||||
}
|
||||
57
www/analytics/plugins/Referrers/Columns/Website.php
Normal file
57
www/analytics/plugins/Referrers/Columns/Website.php
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\Piwik;
|
||||
use Piwik\Tracker\Action;
|
||||
use Piwik\Tracker\Request;
|
||||
use Piwik\Tracker\TrackerConfig;
|
||||
use Piwik\Tracker\Visitor;
|
||||
|
||||
class Website extends Base
|
||||
{
|
||||
/**
|
||||
* Set using the `[Tracker] create_new_visit_when_website_referrer_changes` INI config option.
|
||||
* If true, will force new visits if the referrer website changes.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $createNewVisitWhenWebsiteReferrerChanges;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->createNewVisitWhenWebsiteReferrerChanges = TrackerConfig::getConfigValue('create_new_visit_when_website_referrer_changes') == 1;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('General_Website');
|
||||
}
|
||||
|
||||
public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
|
||||
{
|
||||
if (!$this->createNewVisitWhenWebsiteReferrerChanges) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$information = $this->getReferrerInformationFromRequest($request, $visitor);
|
||||
|
||||
if ($information['referer_type'] == Common::REFERRER_TYPE_WEBSITE
|
||||
&& $this->isReferrerInformationNew($visitor, $information)
|
||||
) {
|
||||
Common::printDebug("Existing visit detected, but creating new visit because website referrer information is different than last action.");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
20
www/analytics/plugins/Referrers/Columns/WebsitePage.php
Normal file
20
www/analytics/plugins/Referrers/Columns/WebsitePage.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\Columns;
|
||||
|
||||
use Piwik\Columns\Dimension;
|
||||
use Piwik\Piwik;
|
||||
|
||||
class WebsitePage extends Dimension
|
||||
{
|
||||
public function getName()
|
||||
{
|
||||
return Piwik::translate('Referrers_ColumnWebsitePage');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - Open source web analytics
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
|
|
@ -15,25 +15,33 @@ use Piwik\Metrics;
|
|||
use Piwik\Period\Range;
|
||||
use Piwik\Piwik;
|
||||
use Piwik\SettingsPiwik;
|
||||
use Piwik\Url;
|
||||
use Piwik\Translation\Translator;
|
||||
use Piwik\View;
|
||||
use Piwik\ViewDataTable\Factory;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Controller extends \Piwik\Plugin\Controller
|
||||
{
|
||||
/**
|
||||
* @var Translator
|
||||
*/
|
||||
private $translator;
|
||||
|
||||
public function __construct(Translator $translator)
|
||||
{
|
||||
$this->translator = $translator;
|
||||
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$view = new View('@Referrers/index');
|
||||
|
||||
$view->graphEvolutionReferrers = $this->getEvolutionGraph(Common::REFERRER_TYPE_DIRECT_ENTRY, array('nb_visits'));
|
||||
$view->graphEvolutionReferrers = $this->getEvolutionGraph(Common::REFERRER_TYPE_DIRECT_ENTRY, array(), array('nb_visits'));
|
||||
$view->nameGraphEvolutionReferrers = 'Referrers.getEvolutionGraph';
|
||||
|
||||
// building the referrers summary report
|
||||
$view->dataTableReferrerType = $this->getReferrerType(true);
|
||||
|
||||
$nameValues = $this->getReferrersVisitorsByType();
|
||||
|
||||
$totalVisits = array_sum($nameValues);
|
||||
|
|
@ -85,138 +93,54 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
$view->urlSparklineDistinctWebsites = $this->getUrlSparkline('getLastDistinctWebsitesGraph');
|
||||
$view->urlSparklineDistinctCampaigns = $this->getUrlSparkline('getLastDistinctCampaignsGraph');
|
||||
|
||||
$view->totalVisits = $totalVisits;
|
||||
$view->referrersReportsByDimension = $this->getReferrersReportsByDimensionView($totalVisits);
|
||||
|
||||
return $view->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML for the Referrers Overview page that categorizes Referrer reports
|
||||
* & allows the user to switch between them.
|
||||
*
|
||||
* @param int $visits The number of visits for this period & site. If <= 0, the
|
||||
* reports are not shown, since they will have no data.getReferrersReportsByDimensionView
|
||||
* @return string The report viewer HTML.
|
||||
*/
|
||||
private function getReferrersReportsByDimensionView($visits)
|
||||
public function allReferrers()
|
||||
{
|
||||
$result = '';
|
||||
$view = new View('@Referrers/allReferrers');
|
||||
|
||||
// only display the reports by dimension view if there are visits
|
||||
if ($visits > 0) {
|
||||
$referrersReportsByDimension = new View\ReportsByDimension('Referrers');
|
||||
// building the referrers summary report
|
||||
$view->dataTableReferrerType = $this->renderReport('getReferrerType');
|
||||
|
||||
$referrersReportsByDimension->addReport(
|
||||
'Referrers_ViewAllReferrers', 'Referrers_WidgetGetAll', 'Referrers.getAll');
|
||||
$nameValues = $this->getReferrersVisitorsByType();
|
||||
|
||||
$byTypeCategory = Piwik::translate('Referrers_ViewReferrersBy', Piwik::translate('Live_GoalType'));
|
||||
$referrersReportsByDimension->addReport(
|
||||
$byTypeCategory, 'Referrers_WidgetKeywords', 'Referrers.getKeywords');
|
||||
$referrersReportsByDimension->addReport($byTypeCategory, 'SitesManager_Sites', 'Referrers.getWebsites');
|
||||
$referrersReportsByDimension->addReport($byTypeCategory, 'Referrers_Campaigns', 'Referrers.getCampaigns');
|
||||
$totalVisits = array_sum($nameValues);
|
||||
foreach ($nameValues as $name => $value) {
|
||||
$view->$name = $value;
|
||||
|
||||
$bySourceCategory = Piwik::translate('Referrers_ViewReferrersBy', Piwik::translate('General_Source'));
|
||||
$referrersReportsByDimension->addReport($bySourceCategory, 'Referrers_Socials', 'Referrers.getSocials');
|
||||
$referrersReportsByDimension->addReport(
|
||||
$bySourceCategory, 'Referrers_SearchEngines', 'Referrers.getSearchEngines');
|
||||
|
||||
$result = $referrersReportsByDimension->render();
|
||||
// calculate percent of total, if there were any visits
|
||||
if ($value != 0
|
||||
&& $totalVisits != 0
|
||||
) {
|
||||
$percentName = $name . 'Percent';
|
||||
$view->$percentName = round(($value / $totalVisits) * 100, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
$view->totalVisits = $totalVisits;
|
||||
$view->referrersReportsByDimension = $this->renderReport('getAll');
|
||||
|
||||
return $view->render();
|
||||
}
|
||||
|
||||
public function getSearchEnginesAndKeywords()
|
||||
{
|
||||
$view = new View('@Referrers/getSearchEnginesAndKeywords');
|
||||
$view->searchEngines = $this->getSearchEngines(true);
|
||||
$view->keywords = $this->getKeywords(true);
|
||||
$view->searchEngines = $this->renderReport('getSearchEngines');
|
||||
$view->keywords = $this->renderReport('getKeywords');
|
||||
return $view->render();
|
||||
}
|
||||
|
||||
public function getReferrerType()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns or echo's a report that shows all search keyword, website and campaign
|
||||
* referrer information in one report.
|
||||
*
|
||||
* @return string The report HTML or nothing if $fetch is set to false.
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getKeywords()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getSearchEnginesFromKeywordId()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getSearchEngines()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getKeywordsFromSearchEngineId()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function indexWebsites()
|
||||
{
|
||||
$view = new View('@Referrers/indexWebsites');
|
||||
$view->websites = $this->getWebsites(true);
|
||||
$view->socials = $this->getSocials(true);
|
||||
$view->websites = $this->renderReport('getWebsites');
|
||||
$view->socials = $this->renderReport('getSocials');
|
||||
|
||||
return $view->render();
|
||||
}
|
||||
|
||||
public function getWebsites()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getSocials()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getUrlsForSocial()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function indexCampaigns()
|
||||
{
|
||||
return View::singleReport(
|
||||
Piwik::translate('Referrers_Campaigns'),
|
||||
$this->getCampaigns(true));
|
||||
}
|
||||
|
||||
public function getCampaigns()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getKeywordsFromCampaignId()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
public function getUrlsFromWebsiteId()
|
||||
{
|
||||
return $this->renderReport(__FUNCTION__);
|
||||
}
|
||||
|
||||
protected function getReferrersVisitorsByType($date = false)
|
||||
{
|
||||
if ($date === false) {
|
||||
|
|
@ -254,7 +178,7 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
Common::REFERRER_TYPE_CAMPAIGN => 'Referrers_Campaigns',
|
||||
);
|
||||
|
||||
public function getEvolutionGraph($typeReferrer = false, array $columns = array())
|
||||
public function getEvolutionGraph($typeReferrer = false, array $columns = array(), array $defaultColumns = array())
|
||||
{
|
||||
$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, 'Referrers.getReferrerType');
|
||||
|
||||
|
|
@ -262,15 +186,25 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
|
||||
// configure displayed columns
|
||||
if (empty($columns)) {
|
||||
$columns = Common::getRequestVar('columns');
|
||||
$columns = Piwik::getArrayFromApiParameter($columns);
|
||||
$columns = Common::getRequestVar('columns', false);
|
||||
if (false !== $columns) {
|
||||
$columns = Piwik::getArrayFromApiParameter($columns);
|
||||
}
|
||||
}
|
||||
if (false !== $columns) {
|
||||
$columns = !is_array($columns) ? array($columns) : $columns;
|
||||
}
|
||||
|
||||
if (!empty($columns)) {
|
||||
$view->config->columns_to_display = $columns;
|
||||
} elseif (empty($view->config->columns_to_display) && !empty($defaultColumns)) {
|
||||
$view->config->columns_to_display = $defaultColumns;
|
||||
}
|
||||
$columns = !is_array($columns) ? array($columns) : $columns;
|
||||
$view->config->columns_to_display = $columns;
|
||||
|
||||
// configure selectable columns
|
||||
// todo: should use SettingsPiwik::isUniqueVisitorsEnabled
|
||||
if (Common::getRequestVar('period', false) == 'day') {
|
||||
$selectable = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
|
||||
$selectable = array('nb_visits', 'nb_uniq_visitors', 'nb_users', 'nb_actions');
|
||||
} else {
|
||||
$selectable = array('nb_visits', 'nb_actions');
|
||||
}
|
||||
|
|
@ -290,17 +224,23 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
$typeReferrer = Common::getRequestVar('typeReferrer', false);
|
||||
}
|
||||
$label = self::getTranslatedReferrerTypeLabel($typeReferrer);
|
||||
$total = Piwik::translate('General_Total');
|
||||
$visibleRows = array($label, $total);
|
||||
$total = $this->translator->translate('General_Total');
|
||||
|
||||
if (!empty($view->config->rows_to_display)) {
|
||||
$visibleRows = $view->config->rows_to_display;
|
||||
} else {
|
||||
$visibleRows = array($label, $total);
|
||||
}
|
||||
|
||||
$view->requestConfig->request_parameters_to_modify['rows'] = $label . ',' . $total;
|
||||
}
|
||||
$view->config->row_picker_match_rows_by = 'label';
|
||||
$view->config->rows_to_display = $visibleRows;
|
||||
|
||||
$view->config->documentation = Piwik::translate('Referrers_EvolutionDocumentation') . '<br />'
|
||||
. Piwik::translate('General_BrokenDownReportDocumentation') . '<br />'
|
||||
. Piwik::translate('Referrers_EvolutionDocumentationMoreInfo', '"'
|
||||
. Piwik::translate('Referrers_DetailsByReferrerType') . '"');
|
||||
$view->config->documentation = $this->translator->translate('Referrers_EvolutionDocumentation') . '<br />'
|
||||
. $this->translator->translate('General_BrokenDownReportDocumentation') . '<br />'
|
||||
. $this->translator->translate('Referrers_EvolutionDocumentationMoreInfo', '"'
|
||||
. $this->translator->translate('Referrers_ReferrerTypes') . '"');
|
||||
|
||||
return $this->renderView($view);
|
||||
}
|
||||
|
|
@ -308,7 +248,7 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
public function getLastDistinctSearchEnginesGraph()
|
||||
{
|
||||
$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, "Referrers.getNumberOfDistinctSearchEngines");
|
||||
$view->config->translations['Referrers_distinctSearchEngines'] = ucfirst(Piwik::translate('Referrers_DistinctSearchEngines'));
|
||||
$view->config->translations['Referrers_distinctSearchEngines'] = ucfirst($this->translator->translate('Referrers_DistinctSearchEngines'));
|
||||
$view->config->columns_to_display = array('Referrers_distinctSearchEngines');
|
||||
return $this->renderView($view);
|
||||
}
|
||||
|
|
@ -316,7 +256,7 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
public function getLastDistinctKeywordsGraph()
|
||||
{
|
||||
$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, "Referrers.getNumberOfDistinctKeywords");
|
||||
$view->config->translations['Referrers_distinctKeywords'] = ucfirst(Piwik::translate('Referrers_DistinctKeywords'));
|
||||
$view->config->translations['Referrers_distinctKeywords'] = ucfirst($this->translator->translate('Referrers_DistinctKeywords'));
|
||||
$view->config->columns_to_display = array('Referrers_distinctKeywords');
|
||||
return $this->renderView($view);
|
||||
}
|
||||
|
|
@ -324,7 +264,7 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
public function getLastDistinctWebsitesGraph()
|
||||
{
|
||||
$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, "Referrers.getNumberOfDistinctWebsites");
|
||||
$view->config->translations['Referrers_distinctWebsites'] = ucfirst(Piwik::translate('Referrers_DistinctWebsites'));
|
||||
$view->config->translations['Referrers_distinctWebsites'] = ucfirst($this->translator->translate('Referrers_DistinctWebsites'));
|
||||
$view->config->columns_to_display = array('Referrers_distinctWebsites');
|
||||
return $this->renderView($view);
|
||||
}
|
||||
|
|
@ -332,7 +272,7 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
public function getLastDistinctCampaignsGraph()
|
||||
{
|
||||
$view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, "Referrers.getNumberOfDistinctCampaigns");
|
||||
$view->config->translations['Referrers_distinctCampaigns'] = ucfirst(Piwik::translate('Referrers_DistinctCampaigns'));
|
||||
$view->config->translations['Referrers_distinctCampaigns'] = ucfirst($this->translator->translate('Referrers_DistinctCampaigns'));
|
||||
$view->config->columns_to_display = array('Referrers_distinctCampaigns');
|
||||
return $this->renderView($view);
|
||||
}
|
||||
|
|
@ -370,7 +310,7 @@ class Controller extends \Piwik\Plugin\Controller
|
|||
// HTML
|
||||
$api = SettingsPiwik::getPiwikUrl()
|
||||
. '?module=API&method=Referrers.getKeywordsForPageUrl'
|
||||
. '&format=php'
|
||||
. '&format=json'
|
||||
. '&filter_limit=10'
|
||||
. '&token_auth=' . Piwik::getCurrentUserTokenAuth();
|
||||
|
||||
|
|
@ -385,8 +325,9 @@ function DisplayTopKeywords($url = "")
|
|||
// Get the Keywords data
|
||||
$url = empty($url) ? "http://". $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] : $url;
|
||||
$api = "' . $api . '&url=" . urlencode($url);
|
||||
$keywords = @unserialize(file_get_contents($api));
|
||||
if($keywords === false || isset($keywords["result"])) {
|
||||
$keywords = @json_decode(file_get_contents($api), $assoc = true);
|
||||
Common::sendHeader(\'Content-Type: text/html; charset=utf-8\', true);
|
||||
if ($keywords === false || isset($keywords["result"])) {
|
||||
// DEBUG ONLY: uncomment for troubleshooting an empty output (the URL output reveals the token_auth)
|
||||
// echo "Error while fetching the <a href=\'$api\'>Top Keywords from Piwik</a>";
|
||||
return;
|
||||
|
|
@ -398,7 +339,7 @@ function DisplayTopKeywords($url = "")
|
|||
foreach($keywords as $keyword) {
|
||||
$output .= "<li>". $keyword . "</li>";
|
||||
}
|
||||
if(empty($keywords)) { $output .= "Nothing yet..."; }
|
||||
if (empty($keywords)) { $output .= "Nothing yet..."; }
|
||||
$output .= "</ul>";
|
||||
echo $output;
|
||||
}
|
||||
|
|
@ -408,8 +349,8 @@ function DisplayTopKeywords($url = "")
|
|||
echo "<p>This widget is designed to work in your website directly.
|
||||
This widget makes it easy to use Piwik to <i>automatically display the list of Top Keywords</i>, for each of your website Page URLs.</p>
|
||||
<p>
|
||||
<b>Example API URL</b> - For example if you would like to get the top 10 keywords, used last week, to land on the page <a target='_blank' href='$topPageUrl'>$topPageUrl</a>,
|
||||
in format JSON: you would dynamically fetch the data using <a target='_blank' href='$jsonRequest&url=" . urlencode($topPageUrl) . "'>this API request URL</a>. Make sure you encode the 'url' parameter in the URL.</p>
|
||||
<b>Example API URL</b> - For example if you would like to get the top 10 keywords, used last week, to land on the page <a rel='noreferrer' target='_blank' href='$topPageUrl'>$topPageUrl</a>,
|
||||
in format JSON: you would dynamically fetch the data using <a rel='noreferrer' target='_blank' href='$jsonRequest&url=" . urlencode($topPageUrl) . "'>this API request URL</a>. Make sure you encode the 'url' parameter in the URL.</p>
|
||||
|
||||
<p><b>PHP Function ready to use!</b> - If you use PHP on your website, we have prepared a small code snippet that you can copy paste in your Website PHP files. You can then simply call the function <code>DisplayTopKeywords();</code> anywhere in your template, at the bottom of the content or in your blog sidebar.
|
||||
If you run this code in your page $topPageUrl, it would output the following:";
|
||||
|
|
@ -422,7 +363,8 @@ function DisplayTopKeywords($url = "")
|
|||
// Get the Keywords data
|
||||
$url = empty($url) ? "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] : $url;
|
||||
$api = $api . "&url=" . urlencode($url);
|
||||
$keywords = @unserialize(file_get_contents($api));
|
||||
$keywords = @json_decode(file_get_contents($api), $assoc = true);
|
||||
Common::sendHeader('Content-Type: text/html; charset=utf-8', true);
|
||||
if ($keywords === false || isset($keywords["result"])) {
|
||||
// DEBUG ONLY: uncomment for troubleshooting an empty output (the URL output reveals the token_auth)
|
||||
//echo "Error while fetching the <a href=\'".$api."\'>Top Keywords from Piwik</a>";
|
||||
|
|
@ -476,7 +418,7 @@ function DisplayTopKeywords($url = "")
|
|||
*/
|
||||
private function getReferrerUrlSparkline($referrerType)
|
||||
{
|
||||
$totalRow = Piwik::translate('General_Total');
|
||||
$totalRow = $this->translator->translate('General_Total');
|
||||
return $this->getUrlSparkline(
|
||||
'getEvolutionGraph',
|
||||
array('columns' => array('nb_visits'),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\DataTable\Filter;
|
||||
|
||||
use Piwik\DataTable\Row;
|
||||
use Piwik\DataTable;
|
||||
|
||||
class KeywordNotDefined extends DataTable\Filter\ColumnCallbackReplace
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param DataTable $table The table to eventually filter.
|
||||
*/
|
||||
public function __construct($table)
|
||||
{
|
||||
parent::__construct($table, 'label', 'Piwik\Plugins\Referrers\API::getCleanKeyword');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\DataTable\Filter;
|
||||
|
||||
use Piwik\DataTable\BaseFilter;
|
||||
use Piwik\DataTable\Row;
|
||||
use Piwik\DataTable;
|
||||
use Piwik\Plugins\Referrers\SearchEngine;
|
||||
|
||||
class KeywordsFromSearchEngineId extends BaseFilter
|
||||
{
|
||||
/**
|
||||
* @var DataTable
|
||||
*/
|
||||
private $firstLevelSearchEnginesTable;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $idSubtable;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param DataTable $table The table to eventually filter.
|
||||
*/
|
||||
public function __construct($table, $firstLevelSearchEnginesTable, $idSubtable = null)
|
||||
{
|
||||
parent::__construct($table);
|
||||
|
||||
$this->firstLevelSearchEnginesTable = $firstLevelSearchEnginesTable;
|
||||
$this->idSubtable = $idSubtable;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DataTable $table
|
||||
*/
|
||||
public function filter($table)
|
||||
{
|
||||
$idSubtable = $this->idSubtable ? : $table->getId();
|
||||
$subTableRow = $this->firstLevelSearchEnginesTable->getRowFromIdSubDataTable($idSubtable);
|
||||
|
||||
if (!empty($subTableRow)) {
|
||||
$searchEngineUrl = $subTableRow->getMetadata('url');
|
||||
$table->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', function ($keyword, $url) { return SearchEngine::getInstance()->getBackLinkFromUrlAndKeyword($url, $keyword); }, array($searchEngineUrl)));
|
||||
$table->queueFilter(function (DataTable $table) {
|
||||
$row = $table->getRowFromId(DataTable::ID_SUMMARY_ROW);
|
||||
if ($row) {
|
||||
$row->deleteMetadata('url');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$table->queueFilter('Piwik\Plugins\Referrers\DataTable\Filter\KeywordNotDefined');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\DataTable\Filter;
|
||||
|
||||
use Piwik\DataTable\BaseFilter;
|
||||
use Piwik\DataTable\Row;
|
||||
use Piwik\DataTable;
|
||||
use Piwik\Plugins\Referrers\SearchEngine;
|
||||
|
||||
class SearchEnginesFromKeywordId extends BaseFilter
|
||||
{
|
||||
/**
|
||||
* @var DataTable
|
||||
*/
|
||||
private $firstLevelKeywordTable;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $idSubtable;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param DataTable $table The table to eventually filter.
|
||||
*/
|
||||
public function __construct($table, $firstLevelKeywordTable, $idSubtable = null)
|
||||
{
|
||||
parent::__construct($table);
|
||||
|
||||
$this->firstLevelKeywordTable = $firstLevelKeywordTable;
|
||||
$this->idSubtable = $idSubtable;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DataTable $table
|
||||
*/
|
||||
public function filter($table)
|
||||
{
|
||||
$idSubtable = $this->idSubtable ? : $table->getId();
|
||||
|
||||
$table->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', function ($url) { return SearchEngine::getInstance()->getUrlFromName($url); }));
|
||||
$table->queueFilter('MetadataCallbackAddMetadata', array('url', 'logo', function ($url) { return SearchEngine::getInstance()->getLogoFromUrl($url); }));
|
||||
|
||||
// get the keyword and create the URL to the search result page
|
||||
$rootRow = $this->firstLevelKeywordTable->getRowFromIdSubDataTable($idSubtable);
|
||||
if ($rootRow) {
|
||||
$keyword = $rootRow->getColumn('label');
|
||||
$table->queueFilter('MetadataCallbackReplace', array('url', function ($url, $keyword) { return SearchEngine::getInstance()->getBackLinkFromUrlAndKeyword($url, $keyword); }, array($keyword)));
|
||||
$table->queueFilter(function (DataTable $table) {
|
||||
$row = $table->getRowFromId(DataTable::ID_SUMMARY_ROW);
|
||||
if ($row) {
|
||||
$row->deleteMetadata('url');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\DataTable\Filter;
|
||||
|
||||
use Piwik\Common;
|
||||
use Piwik\DataTable\Row;
|
||||
use Piwik\DataTable;
|
||||
use Piwik\Period\Range;
|
||||
use Piwik\Plugins\Referrers\API;
|
||||
|
||||
/**
|
||||
* Utility function that sets the subtables for the getReferrerType report.
|
||||
*
|
||||
* If we're not getting an expanded datatable, the subtable ID is set to each parent
|
||||
* row's referrer type (stored in the label for the getReferrerType report).
|
||||
*
|
||||
* If we are getting an expanded datatable, the datatable for the row's referrer
|
||||
* type is loaded and attached to the appropriate row in the getReferrerType report.
|
||||
*/
|
||||
class SetGetReferrerTypeSubtables extends DataTable\BaseFilter
|
||||
{
|
||||
/** @var int */
|
||||
private $idSite;
|
||||
|
||||
/** @var string */
|
||||
private $period;
|
||||
|
||||
/** @var string */
|
||||
private $date;
|
||||
|
||||
/** @var string */
|
||||
private $segment;
|
||||
|
||||
/** @var bool */
|
||||
private $expanded;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param DataTable $table The table to eventually filter.
|
||||
* @param int $idSite
|
||||
* @param string $period
|
||||
* @param string $date
|
||||
* @param string $segment
|
||||
* @param bool $expanded
|
||||
*/
|
||||
public function __construct($table, $idSite, $period, $date, $segment, $expanded)
|
||||
{
|
||||
parent::__construct($table);
|
||||
$this->idSite = $idSite;
|
||||
$this->period = $period;
|
||||
$this->date = $date;
|
||||
$this->segment = $segment;
|
||||
$this->expanded = $expanded;
|
||||
}
|
||||
|
||||
public function filter($table)
|
||||
{
|
||||
foreach ($table->getRows() as $row) {
|
||||
$typeReferrer = $row->getColumn('label');
|
||||
|
||||
if ($typeReferrer != Common::REFERRER_TYPE_DIRECT_ENTRY) {
|
||||
if (!$this->expanded) // if we don't want the expanded datatable, then don't do any extra queries
|
||||
{
|
||||
$row->setNonLoadedSubtableId($typeReferrer);
|
||||
} else if (!Range::isMultiplePeriod($this->date, $this->period))
|
||||
{
|
||||
// otherwise, we have to get the other datatables
|
||||
// NOTE: not yet possible to do this w/ DataTable\Map instances
|
||||
// (actually it would be maybe possible by using $map->mergeChildren() or so build it would be slow)
|
||||
$subtable = API::getInstance()->getReferrerType(
|
||||
$this->idSite, $this->period, $this->date, $this->segment, $type = false, $idSubtable = $typeReferrer
|
||||
);
|
||||
|
||||
if ($this->expanded) {
|
||||
$subtable->applyQueuedFilters();
|
||||
}
|
||||
|
||||
$row->setSubtable($subtable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\DataTable\Filter;
|
||||
|
||||
use Piwik\DataTable\BaseFilter;
|
||||
use Piwik\DataTable\Row;
|
||||
use Piwik\DataTable;
|
||||
use Piwik\Metrics;
|
||||
|
||||
class UrlsForSocial extends BaseFilter
|
||||
{
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $sortRecursive;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param DataTable $table The table to eventually filter.
|
||||
* @param bool $sortRecursive Whether to sort recursive or not
|
||||
*/
|
||||
public function __construct($table, $sortRecursive)
|
||||
{
|
||||
parent::__construct($table);
|
||||
|
||||
$this->sortRecursive = $sortRecursive;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DataTable $table
|
||||
*/
|
||||
public function filter($table)
|
||||
{
|
||||
// make url labels clickable
|
||||
$table->filter('ColumnCallbackAddMetadata', array('label', 'url'));
|
||||
|
||||
// prettify the DataTable
|
||||
$table->filter('ColumnCallbackReplace', array('label', 'Piwik\Plugins\Referrers\removeUrlProtocol'));
|
||||
$table->queueFilter('ReplaceColumnNames');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
/**
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*
|
||||
*/
|
||||
namespace Piwik\Plugins\Referrers\DataTable\Filter;
|
||||
|
||||
use Piwik\DataTable\BaseFilter;
|
||||
use Piwik\DataTable\Row;
|
||||
use Piwik\DataTable;
|
||||
|
||||
class UrlsFromWebsiteId extends BaseFilter
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param DataTable $table The table to eventually filter.
|
||||
*/
|
||||
public function __construct($table)
|
||||
{
|
||||
parent::__construct($table);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DataTable $table
|
||||
*/
|
||||
public function filter($table)
|
||||
{
|
||||
// the htmlspecialchars_decode call is for BC for before 1.1
|
||||
// as the Referrer URL was previously encoded in the log tables, but is now recorded raw
|
||||
$table->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', function ($label) {
|
||||
return htmlspecialchars_decode($label);
|
||||
}));
|
||||
$table->queueFilter('ColumnCallbackReplace', array('label', 'Piwik\Plugins\Referrers\getPathFromUrl'));
|
||||
|
||||
foreach ($table->getRowsWithoutSummaryRow() as $row) {
|
||||
$subtable = $row->getSubtable();
|
||||
if ($subtable) {
|
||||
$this->filter($subtable);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue