columnTranslations = array(
'nb_hits' => Piwik_Translate('General_ColumnPageviews'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviews'),
'avg_time_on_page' => Piwik_Translate('General_ColumnAverageTimeOnPage'),
'bounce_rate' => Piwik_Translate('General_ColumnBounceRate'),
'exit_rate' => Piwik_Translate('General_ColumnExitRate'),
'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTime'),
);
}
/**
* @see Piwik_Plugin::getListHooksRegistered
*/
public function getListHooksRegistered()
{
$hooks = array(
'ArchiveProcessing_Day.compute' => 'archiveDay',
'ArchiveProcessing_Period.compute' => 'archivePeriod',
'WidgetsList.add' => 'addWidgets',
'Menu.add' => 'addMenus',
'API.getReportMetadata' => 'getReportMetadata',
'API.getSegmentsMetadata' => 'getSegmentsMetadata',
'ViewDataTable.getReportDisplayProperties' => 'getReportDisplayProperties',
);
return $hooks;
}
public function getSegmentsMetadata(&$segments)
{
$sqlFilter = array($this, 'getIdActionFromSegment');
// entry and exit pages of visit
$segments[] = array(
'type' => 'dimension',
'category' => 'Actions_Actions',
'name' => 'Actions_ColumnEntryPageURL',
'segment' => 'entryPageUrl',
'sqlSegment' => 'log_visit.visit_entry_idaction_url',
'sqlFilter' => $sqlFilter,
);
$segments[] = array(
'type' => 'dimension',
'category' => 'Actions_Actions',
'name' => 'Actions_ColumnEntryPageTitle',
'segment' => 'entryPageTitle',
'sqlSegment' => 'log_visit.visit_entry_idaction_name',
'sqlFilter' => $sqlFilter,
);
$segments[] = array(
'type' => 'dimension',
'category' => 'Actions_Actions',
'name' => 'Actions_ColumnExitPageURL',
'segment' => 'exitPageUrl',
'sqlSegment' => 'log_visit.visit_exit_idaction_url',
'sqlFilter' => $sqlFilter,
);
$segments[] = array(
'type' => 'dimension',
'category' => 'Actions_Actions',
'name' => 'Actions_ColumnExitPageTitle',
'segment' => 'exitPageTitle',
'sqlSegment' => 'log_visit.visit_exit_idaction_name',
'sqlFilter' => $sqlFilter,
);
// single pages
$segments[] = array(
'type' => 'dimension',
'category' => 'Actions_Actions',
'name' => 'Actions_ColumnPageURL',
'segment' => 'pageUrl',
'sqlSegment' => 'log_link_visit_action.idaction_url',
'sqlFilter' => $sqlFilter,
'acceptedValues' => "All these segments must be URL encoded, for example: " . urlencode('http://example.com/path/page?query'),
);
$segments[] = array(
'type' => 'dimension',
'category' => 'Actions_Actions',
'name' => 'Actions_ColumnPageName',
'segment' => 'pageTitle',
'sqlSegment' => 'log_link_visit_action.idaction_name',
'sqlFilter' => $sqlFilter,
);
$segments[] = array(
'type' => 'dimension',
'category' => 'Actions_Actions',
'name' => 'Actions_SiteSearchKeyword',
'segment' => 'siteSearchKeyword',
'sqlSegment' => 'log_link_visit_action.idaction_name',
'sqlFilter' => $sqlFilter,
);
}
/**
* Convert segment expression to an action ID or an SQL expression.
*
* This method is used as a sqlFilter-callback for the segments of this plugin.
* Usually, these callbacks only return a value that should be compared to the
* column in the database. In this case, that doesn't work since multiple IDs
* can match an expression (e.g. "pageUrl=@foo").
* @param string $valueToMatch
* @param string $sqlField
* @param string $matchType
* @param string $segmentName
* @throws Exception
* @return array|int|string
*/
public function getIdActionFromSegment($valueToMatch, $sqlField, $matchType, $segmentName)
{
$actionType = $this->guessActionTypeFromSegment($segmentName);
if ($actionType == Piwik_Tracker_Action::TYPE_ACTION_URL) {
// for urls trim protocol and www because it is not recorded in the db
$valueToMatch = preg_replace('@^http[s]?://(www\.)?@i', '', $valueToMatch);
}
$valueToMatch = Common::sanitizeInputValue(Common::unsanitizeInputValue($valueToMatch));
// exact matches work by returning the id directly
if ($matchType == SegmentExpression::MATCH_EQUAL
|| $matchType == SegmentExpression::MATCH_NOT_EQUAL
) {
$sql = Piwik_Tracker_Action::getSqlSelectActionId();
$bind = array($valueToMatch, $valueToMatch, $actionType);
$idAction = Piwik_FetchOne($sql, $bind);
// if the action is not found, we hack -100 to ensure it tries to match against an integer
// otherwise binding idaction_name to "false" returns some rows for some reasons (in case &segment=pageTitle==Větrnásssssss)
if (empty($idAction)) {
$idAction = -100;
}
return $idAction;
}
// now, we handle the cases =@ (contains) and !@ (does not contain)
// build the expression based on the match type
$sql = 'SELECT idaction FROM ' . Common::prefixTable('log_action') . ' WHERE ';
$sqlMatchType = 'AND type = ' . $actionType;
switch ($matchType) {
case '=@':
// use concat to make sure, no %s occurs because some plugins use %s in their sql
$sql .= '( name LIKE CONCAT(\'%\', ?, \'%\') ' . $sqlMatchType . ' )';
break;
case '!@':
$sql .= '( name NOT LIKE CONCAT(\'%\', ?, \'%\') ' . $sqlMatchType . ' )';
break;
default:
throw new Exception("This match type $matchType is not available for action-segments.");
break;
}
return array(
// mark that the returned value is an sql-expression instead of a literal value
'SQL' => $sql,
'bind' => $valueToMatch,
);
}
public function getReportMetadata(&$reports)
{
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_Actions') . ' - ' . Piwik_Translate('General_MainMetrics'),
'module' => 'Actions',
'action' => 'get',
'metrics' => array(
'nb_pageviews' => Piwik_Translate('General_ColumnPageviews'),
'nb_uniq_pageviews' => Piwik_Translate('General_ColumnUniquePageviews'),
'nb_downloads' => Piwik_Translate('Actions_ColumnDownloads'),
'nb_uniq_downloads' => Piwik_Translate('Actions_ColumnUniqueDownloads'),
'nb_outlinks' => Piwik_Translate('Actions_ColumnOutlinks'),
'nb_uniq_outlinks' => Piwik_Translate('Actions_ColumnUniqueOutlinks'),
'nb_searches' => Piwik_Translate('Actions_ColumnSearches'),
'nb_keywords' => Piwik_Translate('Actions_ColumnSiteSearchKeywords'),
'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTime'),
),
'metricsDocumentation' => array(
'nb_pageviews' => Piwik_Translate('General_ColumnPageviewsDocumentation'),
'nb_uniq_pageviews' => Piwik_Translate('General_ColumnUniquePageviewsDocumentation'),
'nb_downloads' => Piwik_Translate('Actions_ColumnClicksDocumentation'),
'nb_uniq_downloads' => Piwik_Translate('Actions_ColumnUniqueClicksDocumentation'),
'nb_outlinks' => Piwik_Translate('Actions_ColumnClicksDocumentation'),
'nb_uniq_outlinks' => Piwik_Translate('Actions_ColumnUniqueClicksDocumentation'),
'nb_searches' => Piwik_Translate('Actions_ColumnSearchesDocumentation'),
'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTimeDocumentation'),
// 'nb_keywords' => Piwik_Translate('Actions_ColumnSiteSearchKeywords'),
),
'processedMetrics' => false,
'order' => 1
);
$metrics = array(
'nb_hits' => Piwik_Translate('General_ColumnPageviews'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviews'),
'bounce_rate' => Piwik_Translate('General_ColumnBounceRate'),
'avg_time_on_page' => Piwik_Translate('General_ColumnAverageTimeOnPage'),
'exit_rate' => Piwik_Translate('General_ColumnExitRate'),
'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTime')
);
$documentation = array(
'nb_hits' => Piwik_Translate('General_ColumnPageviewsDocumentation'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviewsDocumentation'),
'bounce_rate' => Piwik_Translate('General_ColumnPageBounceRateDocumentation'),
'avg_time_on_page' => Piwik_Translate('General_ColumnAverageTimeOnPageDocumentation'),
'exit_rate' => Piwik_Translate('General_ColumnExitRateDocumentation'),
'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTimeDocumentation'),
);
// pages report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_PageUrls'),
'module' => 'Actions',
'action' => 'getPageUrls',
'dimension' => Piwik_Translate('Actions_ColumnPageURL'),
'metrics' => $metrics,
'metricsDocumentation' => $documentation,
'documentation' => Piwik_Translate('Actions_PagesReportDocumentation', '
')
. '
' . Piwik_Translate('General_UsePlusMinusIconsDocumentation'),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getPageUrls',
'order' => 2
);
// entry pages report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_SubmenuPagesEntry'),
'module' => 'Actions',
'action' => 'getEntryPageUrls',
'dimension' => Piwik_Translate('Actions_ColumnPageURL'),
'metrics' => array(
'entry_nb_visits' => Piwik_Translate('General_ColumnEntrances'),
'entry_bounce_count' => Piwik_Translate('General_ColumnBounces'),
'bounce_rate' => Piwik_Translate('General_ColumnBounceRate'),
),
'metricsDocumentation' => array(
'entry_nb_visits' => Piwik_Translate('General_ColumnEntrancesDocumentation'),
'entry_bounce_count' => Piwik_Translate('General_ColumnBouncesDocumentation'),
'bounce_rate' => Piwik_Translate('General_ColumnBounceRateForPageDocumentation')
),
'documentation' => Piwik_Translate('Actions_EntryPagesReportDocumentation', '
')
. ' ' . Piwik_Translate('General_UsePlusMinusIconsDocumentation'),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getEntryPageUrls',
'order' => 3
);
// exit pages report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_SubmenuPagesExit'),
'module' => 'Actions',
'action' => 'getExitPageUrls',
'dimension' => Piwik_Translate('Actions_ColumnPageURL'),
'metrics' => array(
'exit_nb_visits' => Piwik_Translate('General_ColumnExits'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviews'),
'exit_rate' => Piwik_Translate('General_ColumnExitRate')
),
'metricsDocumentation' => array(
'exit_nb_visits' => Piwik_Translate('General_ColumnExitsDocumentation'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviewsDocumentation'),
'exit_rate' => Piwik_Translate('General_ColumnExitRateDocumentation')
),
'documentation' => Piwik_Translate('Actions_ExitPagesReportDocumentation', '
')
. ' ' . Piwik_Translate('General_UsePlusMinusIconsDocumentation'),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getExitPageUrls',
'order' => 4
);
// page titles report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_SubmenuPageTitles'),
'module' => 'Actions',
'action' => 'getPageTitles',
'dimension' => Piwik_Translate('Actions_ColumnPageName'),
'metrics' => $metrics,
'metricsDocumentation' => $documentation,
'documentation' => Piwik_Translate('Actions_PageTitlesReportDocumentation', array('
', htmlentities('
'))),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getPageTitles',
'order' => 5,
);
// entry page titles report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_EntryPageTitles'),
'module' => 'Actions',
'action' => 'getEntryPageTitles',
'dimension' => Piwik_Translate('Actions_ColumnPageName'),
'metrics' => array(
'entry_nb_visits' => Piwik_Translate('General_ColumnEntrances'),
'entry_bounce_count' => Piwik_Translate('General_ColumnBounces'),
'bounce_rate' => Piwik_Translate('General_ColumnBounceRate'),
),
'metricsDocumentation' => array(
'entry_nb_visits' => Piwik_Translate('General_ColumnEntrancesDocumentation'),
'entry_bounce_count' => Piwik_Translate('General_ColumnBouncesDocumentation'),
'bounce_rate' => Piwik_Translate('General_ColumnBounceRateForPageDocumentation')
),
'documentation' => Piwik_Translate('Actions_ExitPageTitlesReportDocumentation', '
')
. ' ' . Piwik_Translate('General_UsePlusMinusIconsDocumentation'),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getEntryPageTitles',
'order' => 6
);
// exit page titles report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_ExitPageTitles'),
'module' => 'Actions',
'action' => 'getExitPageTitles',
'dimension' => Piwik_Translate('Actions_ColumnPageName'),
'metrics' => array(
'exit_nb_visits' => Piwik_Translate('General_ColumnExits'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviews'),
'exit_rate' => Piwik_Translate('General_ColumnExitRate')
),
'metricsDocumentation' => array(
'exit_nb_visits' => Piwik_Translate('General_ColumnExitsDocumentation'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviewsDocumentation'),
'exit_rate' => Piwik_Translate('General_ColumnExitRateDocumentation')
),
'documentation' => Piwik_Translate('Actions_EntryPageTitlesReportDocumentation', '
')
. ' ' . Piwik_Translate('General_UsePlusMinusIconsDocumentation'),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getExitPageTitles',
'order' => 7
);
$documentation = array(
'nb_visits' => Piwik_Translate('Actions_ColumnUniqueClicksDocumentation'),
'nb_hits' => Piwik_Translate('Actions_ColumnClicksDocumentation')
);
// outlinks report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_SubmenuOutlinks'),
'module' => 'Actions',
'action' => 'getOutlinks',
'dimension' => Piwik_Translate('Actions_ColumnClickedURL'),
'metrics' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnUniqueClicks'),
'nb_hits' => Piwik_Translate('Actions_ColumnClicks')
),
'metricsDocumentation' => $documentation,
'documentation' => Piwik_Translate('Actions_OutlinksReportDocumentation') . ' '
. Piwik_Translate('Actions_OutlinkDocumentation') . '
'
. Piwik_Translate('General_UsePlusMinusIconsDocumentation'),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getOutlinks',
'order' => 8,
);
// downloads report
$reports[] = array(
'category' => Piwik_Translate('Actions_Actions'),
'name' => Piwik_Translate('Actions_SubmenuDownloads'),
'module' => 'Actions',
'action' => 'getDownloads',
'dimension' => Piwik_Translate('Actions_ColumnDownloadURL'),
'metrics' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnUniqueDownloads'),
'nb_hits' => Piwik_Translate('Actions_ColumnDownloads')
),
'metricsDocumentation' => $documentation,
'documentation' => Piwik_Translate('Actions_DownloadsReportDocumentation', '
'),
'processedMetrics' => false,
'actionToLoadSubTables' => 'getDownloads',
'order' => 9,
);
if ($this->isSiteSearchEnabled()) {
// Search Keywords
$reports[] = array(
'category' => Piwik_Translate('Actions_SubmenuSitesearch'),
'name' => Piwik_Translate('Actions_WidgetSearchKeywords'),
'module' => 'Actions',
'action' => 'getSiteSearchKeywords',
'dimension' => Piwik_Translate('Actions_ColumnSearchKeyword'),
'metrics' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnSearches'),
'nb_pages_per_search' => Piwik_Translate('Actions_ColumnPagesPerSearch'),
'exit_rate' => Piwik_Translate('Actions_ColumnSearchExits'),
),
'metricsDocumentation' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnSearchesDocumentation'),
'nb_pages_per_search' => Piwik_Translate('Actions_ColumnPagesPerSearchDocumentation'),
'exit_rate' => Piwik_Translate('Actions_ColumnSearchExitsDocumentation'),
),
'documentation' => Piwik_Translate('Actions_SiteSearchKeywordsDocumentation') . '
' . Piwik_Translate('Actions_SiteSearchIntro') . '
'
. '' . Piwik_Translate('Actions_LearnMoreAboutSiteSearchLink') . '',
'processedMetrics' => false,
'order' => 15
);
// No Result Search Keywords
$reports[] = array(
'category' => Piwik_Translate('Actions_SubmenuSitesearch'),
'name' => Piwik_Translate('Actions_WidgetSearchNoResultKeywords'),
'module' => 'Actions',
'action' => 'getSiteSearchNoResultKeywords',
'dimension' => Piwik_Translate('Actions_ColumnNoResultKeyword'),
'metrics' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnSearches'),
'exit_rate' => Piwik_Translate('Actions_ColumnSearchExits'),
),
'metricsDocumentation' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnSearchesDocumentation'),
'exit_rate' => Piwik_Translate('Actions_ColumnSearchExitsDocumentation'),
),
'documentation' => Piwik_Translate('Actions_SiteSearchIntro') . '
' . Piwik_Translate('Actions_SiteSearchKeywordsNoResultDocumentation'),
'processedMetrics' => false,
'order' => 16
);
if (self::isCustomVariablesPluginsEnabled()) {
// Search Categories
$reports[] = array(
'category' => Piwik_Translate('Actions_SubmenuSitesearch'),
'name' => Piwik_Translate('Actions_WidgetSearchCategories'),
'module' => 'Actions',
'action' => 'getSiteSearchCategories',
'dimension' => Piwik_Translate('Actions_ColumnSearchCategory'),
'metrics' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnSearches'),
'nb_pages_per_search' => Piwik_Translate('Actions_ColumnPagesPerSearch'),
'exit_rate' => Piwik_Translate('Actions_ColumnSearchExits'),
),
'metricsDocumentation' => array(
'nb_visits' => Piwik_Translate('Actions_ColumnSearchesDocumentation'),
'nb_pages_per_search' => Piwik_Translate('Actions_ColumnPagesPerSearchDocumentation'),
'exit_rate' => Piwik_Translate('Actions_ColumnSearchExitsDocumentation'),
),
'documentation' => Piwik_Translate('Actions_SiteSearchCategories1') . '
' . Piwik_Translate('Actions_SiteSearchCategories2'),
'processedMetrics' => false,
'order' => 17
);
}
$documentation = Piwik_Translate('Actions_SiteSearchFollowingPagesDoc') . '
' . Piwik_Translate('General_UsePlusMinusIconsDocumentation');
// Pages URLs following Search
$reports[] = array(
'category' => Piwik_Translate('Actions_SubmenuSitesearch'),
'name' => Piwik_Translate('Actions_WidgetPageUrlsFollowingSearch'),
'module' => 'Actions',
'action' => 'getPageUrlsFollowingSiteSearch',
'dimension' => Piwik_Translate('General_ColumnDestinationPage'),
'metrics' => array(
'nb_hits_following_search' => Piwik_Translate('General_ColumnViewedAfterSearch'),
'nb_hits' => Piwik_Translate('General_ColumnTotalPageviews'),
),
'metricsDocumentation' => array(
'nb_hits_following_search' => Piwik_Translate('General_ColumnViewedAfterSearchDocumentation'),
'nb_hits' => Piwik_Translate('General_ColumnPageviewsDocumentation'),
),
'documentation' => $documentation,
'processedMetrics' => false,
'order' => 18
);
// Pages Titles following Search
$reports[] = array(
'category' => Piwik_Translate('Actions_SubmenuSitesearch'),
'name' => Piwik_Translate('Actions_WidgetPageTitlesFollowingSearch'),
'module' => 'Actions',
'action' => 'getPageTitlesFollowingSiteSearch',
'dimension' => Piwik_Translate('General_ColumnDestinationPage'),
'metrics' => array(
'nb_hits_following_search' => Piwik_Translate('General_ColumnViewedAfterSearch'),
'nb_hits' => Piwik_Translate('General_ColumnTotalPageviews'),
),
'metricsDocumentation' => array(
'nb_hits_following_search' => Piwik_Translate('General_ColumnViewedAfterSearchDocumentation'),
'nb_hits' => Piwik_Translate('General_ColumnPageviewsDocumentation'),
),
'documentation' => $documentation,
'processedMetrics' => false,
'order' => 19
);
}
}
function addWidgets()
{
Piwik_AddWidget('Actions_Actions', 'Actions_SubmenuPages', 'Actions', 'getPageUrls');
Piwik_AddWidget('Actions_Actions', 'Actions_WidgetPageTitles', 'Actions', 'getPageTitles');
Piwik_AddWidget('Actions_Actions', 'Actions_SubmenuOutlinks', 'Actions', 'getOutlinks');
Piwik_AddWidget('Actions_Actions', 'Actions_SubmenuDownloads', 'Actions', 'getDownloads');
Piwik_AddWidget('Actions_Actions', 'Actions_WidgetPagesEntry', 'Actions', 'getEntryPageUrls');
Piwik_AddWidget('Actions_Actions', 'Actions_WidgetPagesExit', 'Actions', 'getExitPageUrls');
Piwik_AddWidget('Actions_Actions', 'Actions_WidgetEntryPageTitles', 'Actions', 'getEntryPageTitles');
Piwik_AddWidget('Actions_Actions', 'Actions_WidgetExitPageTitles', 'Actions', 'getExitPageTitles');
if ($this->isSiteSearchEnabled()) {
Piwik_AddWidget('Actions_SubmenuSitesearch', 'Actions_WidgetSearchKeywords', 'Actions', 'getSiteSearchKeywords');
if (self::isCustomVariablesPluginsEnabled()) {
Piwik_AddWidget('Actions_SubmenuSitesearch', 'Actions_WidgetSearchCategories', 'Actions', 'getSiteSearchCategories');
}
Piwik_AddWidget('Actions_SubmenuSitesearch', 'Actions_WidgetSearchNoResultKeywords', 'Actions', 'getSiteSearchNoResultKeywords');
Piwik_AddWidget('Actions_SubmenuSitesearch', 'Actions_WidgetPageUrlsFollowingSearch', 'Actions', 'getPageUrlsFollowingSiteSearch');
Piwik_AddWidget('Actions_SubmenuSitesearch', 'Actions_WidgetPageTitlesFollowingSearch', 'Actions', 'getPageTitlesFollowingSiteSearch');
}
}
function addMenus()
{
Piwik_AddMenu('Actions_Actions', '', array('module' => 'Actions', 'action' => 'indexPageUrls'), true, 15);
Piwik_AddMenu('Actions_Actions', 'Actions_SubmenuPages', array('module' => 'Actions', 'action' => 'indexPageUrls'), true, 1);
Piwik_AddMenu('Actions_Actions', 'Actions_SubmenuPagesEntry', array('module' => 'Actions', 'action' => 'indexEntryPageUrls'), true, 2);
Piwik_AddMenu('Actions_Actions', 'Actions_SubmenuPagesExit', array('module' => 'Actions', 'action' => 'indexExitPageUrls'), true, 3);
Piwik_AddMenu('Actions_Actions', 'Actions_SubmenuPageTitles', array('module' => 'Actions', 'action' => 'indexPageTitles'), true, 4);
Piwik_AddMenu('Actions_Actions', 'Actions_SubmenuOutlinks', array('module' => 'Actions', 'action' => 'indexOutlinks'), true, 6);
Piwik_AddMenu('Actions_Actions', 'Actions_SubmenuDownloads', array('module' => 'Actions', 'action' => 'indexDownloads'), true, 7);
if ($this->isSiteSearchEnabled()) {
Piwik_AddMenu('Actions_Actions', 'Actions_SubmenuSitesearch', array('module' => 'Actions', 'action' => 'indexSiteSearch'), true, 5);
}
}
protected function isSiteSearchEnabled()
{
$idSite = Common::getRequestVar('idSite', 0, 'int');
if ($idSite == 0) {
return false;
}
return Site::isSiteSearchEnabledFor($idSite);
}
/**
* Compute all the actions along with their hierarchies.
*
* For each action we process the "interest statistics" :
* visits, unique visitors, bounce count, sum visit length.
*/
public function archiveDay(Piwik_ArchiveProcessor_Day $archiveProcessor)
{
$archiving = new Piwik_Actions_Archiver($archiveProcessor);
if($archiving->shouldArchive()) {
$archiving->archiveDay();
}
}
function archivePeriod(Piwik_ArchiveProcessor_Period $archiveProcessor)
{
$archiving = new Piwik_Actions_Archiver($archiveProcessor);
if($archiving->shouldArchive()) {
$archiving->archivePeriod();
}
}
static public function checkCustomVariablesPluginEnabled()
{
if (!self::isCustomVariablesPluginsEnabled()) {
throw new Exception("To Track Site Search Categories, please ask the Piwik Administrator to enable the 'Custom Variables' plugin in Settings > Plugins.");
}
}
static protected function isCustomVariablesPluginsEnabled()
{
return PluginsManager::getInstance()->isPluginActivated('CustomVariables');
}
/**
* @param $segmentName
* @return int
* @throws Exception
*/
protected function guessActionTypeFromSegment($segmentName)
{
if (stripos($segmentName, 'pageurl') !== false) {
$actionType = Piwik_Tracker_Action::TYPE_ACTION_URL;
return $actionType;
} elseif (stripos($segmentName, 'pagetitle') !== false) {
$actionType = Piwik_Tracker_Action::TYPE_ACTION_NAME;
return $actionType;
} elseif (stripos($segmentName, 'sitesearch') !== false) {
$actionType = Piwik_Tracker_Action::TYPE_SITE_SEARCH;
return $actionType;
} else {
throw new Exception(" The segment $segmentName has an unexpected value.");
}
}
public function getReportDisplayProperties(&$properties, $apiAction)
{
$reportViewProperties = array(
'Actions.getPageUrls' => $this->getDisplayPropertiesForPageUrls(),
'Actions.getEntryPageUrls' => $this->getDisplayPropertiesForEntryPageUrls(),
'Actions.getExitPageUrls' => $this->getDisplayPropertiesForExitPageUrls(),
'Actions.getSiteSearchKeywords' => $this->getDisplayPropertiesForSiteSearchKeywords(),
'Actions.getSiteSearchNoResultKeywords' => $this->getDisplayPropertiesForSiteSearchNoResultKeywords(),
'Actions.getSiteSearchCategories' => $this->getDisplayPropertiesForSiteSearchCategories(),
'Actions.getPageUrlsFollowingSiteSearch' => $this->getDisplayPropertiesForGetPageUrlsOrTitlesFollowingSiteSearch(false),
'Actions.getPageTitlesFollowingSiteSearch' => $this->getDisplayPropertiesForGetPageUrlsOrTitlesFollowingSiteSearch(true),
'Actions.getPageTitles' => $this->getDisplayPropertiesForGetPageTitles(),
'Actions.getEntryPageTitles' => $this->getDisplayPropertiesForGetEntryPageTitles(),
'Actions.getExitPageTitles' => $this->getDisplayPropertiesForGetExitPageTitles(),
'Actions.getDownloads' => $this->getDisplayPropertiesForGetDownloads(),
'Actions.getOutlinks' => $this->getDisplayPropertiesForGetOutlinks(),
);
if (isset($reportViewProperties[$apiAction])) {
$properties = $reportViewProperties[$apiAction];
}
}
private function addBaseDisplayProperties(&$result)
{
$result['datatable_css_class'] = 'dataTableActions';
$result['datatable_js_type'] = 'actionDataTable';
$result['subtable_template'] = '@CoreHome/_dataTableActions_subDataTable.twig';
$result['search_recursive'] = true;
$result['show_all_views_icons'] = false;
$result['show_table_all_columns'] = false;
$result['filter_limit'] = self::ACTIONS_REPORT_ROWS_DISPLAY;
// if the flat parameter is not provided, make sure it is set to 0 in the URL,
// so users can see that they can set it to 1 (see #3365)
$result['custom_parameters'] = array('flat' => 0);
if (Piwik_ViewDataTable::shouldLoadExpanded()) {
$result['show_expanded'] = true;
$result['filters'][] = function ($dataTable) {
Piwik_Actions::setDataTableRowLevels($dataTable);
};
}
return $result;
}
public static function setDataTableRowLevels($dataTable, $level = 0)
{
foreach ($dataTable->getRows() as $row) {
$row->setMetadata('css_class', 'level'.$level);
$subtable = $row->getSubtable();
if ($subtable) {
self::setDataTableRowLevels($subtable, $level + 1);
}
}
}
private function addExcludeLowPopDisplayProperties(&$result)
{
if (Common::getRequestVar('enable_filter_excludelowpop', '0', 'string') != '0') {
$result['filter_excludelowpop'] = 'nb_hits';
$result['filter_excludelowpop_value'] = function () {
// computing minimum value to exclude (2 percent of the total number of actions)
$visitsInfo = Piwik_VisitsSummary_Controller::getVisitsSummary()->getFirstRow();
$nbActions = $visitsInfo->getColumn('nb_actions');
$nbActionsLowPopulationThreshold = floor(0.02 * $nbActions);
// we remove 1 to make sure some actions/downloads are displayed in the case we have a very few of them
// and each of them has 1 or 2 hits...
return min($visitsInfo->getColumn('max_actions') - 1, $nbActionsLowPopulationThreshold - 1);
};
}
}
private function addPageDisplayProperties(&$result)
{
// add common translations
$result['translations'] += array(
'nb_hits' => Piwik_Translate('General_ColumnPageviews'),
'nb_visits' => Piwik_Translate('General_ColumnUniquePageviews'),
'avg_time_on_page' => Piwik_Translate('General_ColumnAverageTimeOnPage'),
'bounce_rate' => Piwik_Translate('General_ColumnBounceRate'),
'exit_rate' => Piwik_Translate('General_ColumnExitRate'),
'avg_time_generation' => Piwik_Translate('General_ColumnAverageGenerationTime'),
);
// prettify avg_time_on_page column
$getPrettyTimeFromSeconds = array('Piwik', 'getPrettyTimeFromSeconds');
$result['filters'][] = array('ColumnCallbackReplace', array('avg_time_on_page', $getPrettyTimeFromSeconds));
// prettify avg_time_generation column
$avgTimeCallback = function ($time) {
return $time ? Piwik::getPrettyTimeFromSeconds($time, true, true, false) : "-";
};
$result['filters'][] = array('ColumnCallbackReplace', array('avg_time_generation', $avgTimeCallback));
// add avg_generation_time tooltip
$tooltipCallback = function ($hits, $min, $max) {
if (!$hits) {
return false;
}
return Piwik_Translate("Actions_AvgGenerationTimeTooltip", array(
$hits,
"
",
Piwik::getPrettyTimeFromSeconds($min),
Piwik::getPrettyTimeFromSeconds($max)
));
};
$result['filters'][] = array('ColumnCallbackAddMetadata',
array(
array('nb_hits_with_time_generation', 'min_time_generation', 'max_time_generation'),
'avg_time_generation_tooltip',
$tooltipCallback
)
);
$this->addExcludeLowPopDisplayProperties($result);
}
public function getDisplayPropertiesForPageUrls()
{
$result = array(
'translations' => array('label' => Piwik_Translate('Actions_ColumnPageURL')),
'columns_to_display' => array('label', 'nb_hits', 'nb_visits', 'bounce_rate',
'avg_time_on_page', 'exit_rate', 'avg_time_generation'),
);
$this->addPageDisplayProperties($result);
$this->addBaseDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForEntryPageUrls()
{
// link to the page, not just the report, but only if not a widget
$widget = Common::getRequestVar('widget', false);
$reportUrl = Piwik_API_Request::getCurrentUrlWithoutGenericFilters(array(
'module' => 'Actions',
'action' => $widget === false ? 'indexEntryPageUrls' : 'getEntryPageUrls'
));
$result = array(
'translations' => array('label' => Piwik_Translate('Actions_ColumnEntryPageURL'),
'entry_bounce_count' => Piwik_Translate('General_ColumnBounces'),
'entry_nb_visits' => Piwik_Translate('General_ColumnEntrances')),
'columns_to_display' => array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate'),
'filter_sort_column' => 'entry_nb_visits',
'filter_sort_order' => 'desc',
'title' => Piwik_Translate('Actions_SubmenuPagesEntry'),
'relatedReports' => array(
'Actions.getEntryPageTitles' => Piwik_Translate('Actions_EntryPageTitles')
),
'self_url' => $reportUrl
);
$this->addPageDisplayProperties($result);
$this->addBaseDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForExitPageUrls()
{
// link to the page, not just the report, but only if not a widget
$widget = Common::getRequestVar('widget', false);
$reportUrl = Piwik_API_Request::getCurrentUrlWithoutGenericFilters(array(
'module' => 'Actions',
'action' => $widget === false ? 'indexExitPageUrls' : 'getExitPageUrls'
));
$result = array(
'translations' => array('label' => Piwik_Translate('Actions_ColumnExitPageURL'),
'exit_nb_visits' => Piwik_Translate('General_ColumnExits')),
'columns_to_display' => array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate'),
'filter_sort_column' => 'exit_nb_visits',
'filter_sort_order' => 'desc',
'title' => Piwik_Translate('Actions_SubmenuPagesExit'),
'relatedReports' => array(
'Actions.getExitPageTitles' => Piwik_Translate('Actions_ExitPageTitles')
),
'self_url' => $reportUrl,
);
$this->addPageDisplayProperties($result);
$this->addBaseDisplayProperties($result);
return $result;
}
private function addSiteSearchDisplayProperties(&$result)
{
$result['translations'] += array(
'nb_visits' => Piwik_Translate('Actions_ColumnSearches'),
'exit_rate' => str_replace("% ", "% ", Piwik_Translate('Actions_ColumnSearchExits')),
'nb_pages_per_search' => Piwik_Translate('Actions_ColumnPagesPerSearch')
);
$result['show_bar_chart'] = false;
$result['show_table_all_columns'] = false;
}
public function getDisplayPropertiesForSiteSearchKeywords()
{
$result = array(
'translations' => array('label' => Piwik_Translate('Actions_ColumnSearchKeyword')),
'columns_to_display' => array('label', 'nb_visits', 'nb_pages_per_search', 'exit_rate'),
);
$this->addSiteSearchDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForSiteSearchNoResultKeywords()
{
$result = array(
'translations' => array('label', Piwik_Translate('Actions_ColumnNoResultKeyword')),
'columns_to_display' => array('label', 'nb_visits', 'exit_rate')
);
$this->addSiteSearchDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForSiteSearchCategories()
{
return array(
'translations' => array(
'label' => Piwik_Translate('Actions_ColumnSearchCategory'),
'nb_visits' => Piwik_Translate('Actions_ColumnSearches'),
'nb_pages_per_search' => Piwik_Translate('Actions_ColumnPagesPerSearch')
),
'columns_to_display' => array('label', 'nb_visits', 'nb_pages_per_search'),
'show_table_all_columns' => false,
'show_bar_chart' => false,
'disable_row_evolution' => false,
);
}
public function getDisplayPropertiesForGetPageUrlsOrTitlesFollowingSiteSearch($isTitle)
{
$title = $isTitle ? Piwik_Translate('Actions_WidgetPageTitlesFollowingSearch')
: Piwik_Translate('Actions_WidgetPageUrlsFollowingSearch');
$relatedReports = array(
'Actions.getPageTitlesFollowingSiteSearch' => Piwik_Translate('Actions_WidgetPageTitlesFollowingSearch'),
'Actions.getPageUrlsFollowingSiteSearch' => Piwik_Translate('Actions_WidgetPageUrlsFollowingSearch'),
);
$result = array(
'translations' => array(
'label' => Piwik_Translate('General_ColumnDestinationPage'),
'nb_hits_following_search' => Piwik_Translate('General_ColumnViewedAfterSearch'),
'nb_hits' => Piwik_Translate('General_ColumnTotalPageviews')
),
'columns_to_display' => array('label', 'nb_hits_following_search', 'nb_hits'),
'filter_sort_column' => 'nb_hits_following_search',
'filter_sort_order' => 'desc',
'show_exclude_low_population' => false,
'title' => $title,
'relatedReports' => $relatedReports
);
$this->addExcludeLowPopDisplayProperties($result);
$this->addBaseDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForGetPageTitles()
{
// link to the page, not just the report, but only if not a widget
$widget = Common::getRequestVar('widget', false);
$reportUrl = Piwik_API_Request::getCurrentUrlWithoutGenericFilters(array(
'module' => 'Actions',
'action' => $widget === false ? 'indexPageTitles' : 'getPageTitles'
));
$result = array(
'translations' => array('label' => Piwik_Translate('Actions_ColumnPageName')),
'columns_to_display' => array('label', 'nb_hits', 'nb_visits', 'bounce_rate',
'avg_time_on_page', 'exit_rate', 'avg_time_generation'),
'title' => Piwik_Translate('Actions_SubmenuPageTitles'),
'relatedReports' => array(
'Actions.getEntryPageTitles' => Piwik_Translate('Actions_EntryPageTitles'),
'Actions.getExitPageTitles' => Piwik_Translate('Actions_ExitPageTitles'),
),
'self_url' => $reportUrl
);
$this->addPageDisplayProperties($result);
$this->addBaseDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForGetEntryPageTitles()
{
$entryPageUrlAction =
Common::getRequestVar('widget', false) === false ? 'indexEntryPageUrls' : 'getEntryPageUrls';
$result = array(
'translations' => array(
'label' => Piwik_Translate('Actions_ColumnEntryPageTitle'),
'entry_bounce_count' => Piwik_Translate('General_ColumnBounces'),
'entry_nb_visits' => Piwik_Translate('General_ColumnEntrances'),
),
'columns_to_display' => array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate'),
'title' => Piwik_Translate('Actions_EntryPageTitles'),
'relatedReports' => array(
'Actions.getPageTitles' => Piwik_Translate('Actions_SubmenuPageTitles'),
"Actions.$entryPageUrlAction" => Piwik_Translate('Actions_SubmenuPagesEntry')
),
);
$this->addPageDisplayProperties($result);
$this->addBaseDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForGetExitPageTitles()
{
$exitPageUrlAction =
Common::getRequestVar('widget', false) === false ? 'indexExitPageUrls' : 'getExitPageUrls';
$result = array(
'translations' => array(
'label' => Piwik_Translate('Actions_ColumnExitPageTitle'),
'exit_nb_visits' => Piwik_Translate('General_ColumnExits'),
),
'columns_to_display' => array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate'),
'title' => Piwik_Translate('Actions_ExitPageTitles'),
'relatedReports' => array(
'Actions.getPageTitles' => Piwik_Translate('Actions_SubmenuPageTitles'),
"Actions.$exitPageUrlAction" => Piwik_Translate('Actions_SubmenuPagesExit'),
),
);
$this->addPageDisplayProperties($result);
$this->addBaseDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForGetDownloads()
{
$result = array(
'translations' => array(
'label' => Piwik_Translate('Actions_ColumnDownloadURL'),
'nb_visits' => Piwik_Translate('Actions_ColumnUniqueDownloads'),
'nb_hits' => Piwik_Translate('Actions_ColumnDownloads'),
),
'columns_to_display' => array('label', 'nb_visits', 'nb_hits'),
'show_exclude_low_population' => false
);
$this->addBaseDisplayProperties($result);
return $result;
}
public function getDisplayPropertiesForGetOutlinks()
{
$result = array(
'translations' => array(
'label' => Piwik_Translate('Actions_ColumnClickedURL'),
'nb_visits' => Piwik_Translate('Actions_ColumnUniqueClicks'),
'nb_hits' => Piwik_Translate('Actions_ColumnClicks'),
),
'columns_to_display' => array('label', 'nb_visits', 'nb_hits'),
'show_exclude_low_population' => false
);
$this->addBaseDisplayProperties($result);
return $result;
}
}