update Piwik to version 2.16 (fixes #91)

This commit is contained in:
oliver 2016-04-10 18:55:57 +02:00
commit 47263617c5
129 changed files with 418860 additions and 226988 deletions

View file

@ -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;
}
}

View file

@ -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 =>

View 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)));
}
}

View 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;
}
}

View 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);
}
}

View 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');
}
}

View 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);
}
}

View 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);
}
}

View 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'];
}
}

View 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');
}
}

View 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');
}
}

View 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;
}
}

View 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');
}
}

View file

@ -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', '&quot;'
. Piwik::translate('Referrers_DetailsByReferrerType') . '&quot;');
$view->config->documentation = $this->translator->translate('Referrers_EvolutionDocumentation') . '<br />'
. $this->translator->translate('General_BrokenDownReportDocumentation') . '<br />'
. $this->translator->translate('Referrers_EvolutionDocumentationMoreInfo', '&quot;'
. $this->translator->translate('Referrers_ReferrerTypes') . '&quot;');
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'),

View file

@ -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');
}
}

View file

@ -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');
}
}

View 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\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');
}
});
}
}
}

View file

@ -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);
}
}
}
}
}

View file

@ -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');
}
}

View file

@ -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