add icons for Character groups

This commit is contained in:
coderkun 2014-04-29 14:18:04 +02:00
commit 2d9a41a5fe
3461 changed files with 594457 additions and 0 deletions

View file

@ -0,0 +1,114 @@
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\VisitorInterest;
use Piwik\Archive;
use Piwik\DataTable;
use Piwik\Metrics;
use Piwik\Piwik;
/**
* VisitorInterest API lets you access two Visitor Engagement reports: number of visits per number of pages,
* and number of visits per visit duration.
*
* @method static \Piwik\Plugins\VisitorInterest\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
protected function getDataTable($name, $idSite, $period, $date, $segment, $column = Metrics::INDEX_NB_VISITS)
{
Piwik::checkUserHasViewAccess($idSite);
$archive = Archive::build($idSite, $period, $date, $segment);
$dataTable = $archive->getDataTable($name);
$dataTable->queueFilter('ReplaceColumnNames');
return $dataTable;
}
public function getNumberOfVisitsPerVisitDuration($idSite, $period, $date, $segment = false)
{
$dataTable = $this->getDataTable(Archiver::TIME_SPENT_RECORD_NAME, $idSite, $period, $date, $segment);
$dataTable->queueFilter('Sort', array('label', 'asc', true));
$dataTable->queueFilter('BeautifyTimeRangeLabels', array(
Piwik::translate('VisitorInterest_BetweenXYSeconds'),
Piwik::translate('VisitorInterest_OneMinute'),
Piwik::translate('VisitorInterest_PlusXMin')));
return $dataTable;
}
public function getNumberOfVisitsPerPage($idSite, $period, $date, $segment = false)
{
$dataTable = $this->getDataTable(Archiver::PAGES_VIEWED_RECORD_NAME, $idSite, $period, $date, $segment);
$dataTable->queueFilter('Sort', array('label', 'asc', true));
$dataTable->queueFilter('BeautifyRangeLabels', array(
Piwik::translate('VisitorInterest_OnePage'),
Piwik::translate('VisitorInterest_NPages')));
return $dataTable;
}
/**
* Returns a DataTable that associates counts of days (N) with the count of visits that
* occurred within N days of the last visit.
*
* @param int $idSite The site to select data from.
* @param string $period The period type.
* @param string $date The date type.
* @param string|bool $segment The segment.
* @return DataTable the archived report data.
*/
public function getNumberOfVisitsByDaysSinceLast($idSite, $period, $date, $segment = false)
{
$dataTable = $this->getDataTable(
Archiver::DAYS_SINCE_LAST_RECORD_NAME, $idSite, $period, $date, $segment, Metrics::INDEX_NB_VISITS);
$dataTable->queueFilter('BeautifyRangeLabels', array(Piwik::translate('General_OneDay'), Piwik::translate('General_NDays')));
return $dataTable;
}
/**
* Returns a DataTable that associates ranges of visit numbers with the count of visits
* whose visit number falls within those ranges.
*
* @param int $idSite The site to select data from.
* @param string $period The period type.
* @param string $date The date type.
* @param string|bool $segment The segment.
* @return DataTable the archived report data.
*/
public function getNumberOfVisitsByVisitCount($idSite, $period, $date, $segment = false)
{
$dataTable = $this->getDataTable(
Archiver::VISITS_COUNT_RECORD_NAME, $idSite, $period, $date, $segment, Metrics::INDEX_NB_VISITS);
$dataTable->queueFilter('BeautifyRangeLabels', array(
Piwik::translate('General_OneVisit'), Piwik::translate('General_NVisits')));
// add visit percent column
self::addVisitsPercentColumn($dataTable);
return $dataTable;
}
/**
* Utility function that adds a visit percent column to a data table,
* regardless of whether the data table is an data table array or just
* a data table.
*
* @param DataTable $dataTable The data table to modify.
*/
private static function addVisitsPercentColumn($dataTable)
{
if ($dataTable instanceof DataTable\Map) {
foreach ($dataTable->getDataTables() as $table) {
self::addVisitsPercentColumn($table);
}
} else {
$totalVisits = array_sum($dataTable->getColumn(Metrics::INDEX_NB_VISITS));
$dataTable->queueFilter('ColumnCallbackAddColumnPercentage', array('nb_visits_percentage', 'nb_visits', $totalVisits));
}
}
}

View file

@ -0,0 +1,154 @@
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\VisitorInterest;
use Piwik\DataAccess\LogAggregator;
use Piwik\DataTable;
use Piwik\Metrics;
class Archiver extends \Piwik\Plugin\Archiver
{
// third element is unit (s for seconds, default is munutes)
const TIME_SPENT_RECORD_NAME = 'VisitorInterest_timeGap';
const PAGES_VIEWED_RECORD_NAME = 'VisitorInterest_pageGap';
const VISITS_COUNT_RECORD_NAME = 'VisitorInterest_visitsByVisitCount';
const DAYS_SINCE_LAST_RECORD_NAME = 'VisitorInterest_daysSinceLastVisit';
protected static $timeGap = array(
array(0, 10, 's'),
array(11, 30, 's'),
array(31, 60, 's'),
array(1, 2),
array(2, 4),
array(4, 7),
array(7, 10),
array(10, 15),
array(15, 30),
array(30)
);
protected static $pageGap = array(
array(1, 1),
array(2, 2),
array(3, 3),
array(4, 4),
array(5, 5),
array(6, 7),
array(8, 10),
array(11, 14),
array(15, 20),
array(20)
);
/**
* The set of ranges used when calculating the 'visitors who visited at least N times' report.
*/
protected static $visitNumberGap = array(
array(1, 1),
array(2, 2),
array(3, 3),
array(4, 4),
array(5, 5),
array(6, 6),
array(7, 7),
array(8, 8),
array(9, 14),
array(15, 25),
array(26, 50),
array(51, 100),
array(101, 200),
array(200)
);
/**
* The set of ranges used when calculating the 'days since last visit' report.
*/
protected static $daysSinceLastVisitGap = array(
array(0, 0),
array(1, 1),
array(2, 2),
array(3, 3),
array(4, 4),
array(5, 5),
array(6, 6),
array(7, 7),
array(8, 14),
array(15, 30),
array(31, 60),
array(61, 120),
array(121, 364),
array(364)
);
public function aggregateDayReport()
{
// these prefixes are prepended to the 'SELECT as' parts of each SELECT expression. detecting
// these prefixes allows us to get all the data in one query.
$prefixes = array(
self::TIME_SPENT_RECORD_NAME => 'tg',
self::PAGES_VIEWED_RECORD_NAME => 'pg',
self::VISITS_COUNT_RECORD_NAME => 'vbvn',
self::DAYS_SINCE_LAST_RECORD_NAME => 'dslv',
);
// collect our extra aggregate select fields
$selects = array();
$selects = array_merge($selects, LogAggregator::getSelectsFromRangedColumn(
'visit_total_time', self::getSecondsGap(), 'log_visit', $prefixes[self::TIME_SPENT_RECORD_NAME]
));
$selects = array_merge($selects, LogAggregator::getSelectsFromRangedColumn(
'visit_total_actions', self::$pageGap, 'log_visit', $prefixes[self::PAGES_VIEWED_RECORD_NAME]
));
$selects = array_merge($selects, LogAggregator::getSelectsFromRangedColumn(
'visitor_count_visits', self::$visitNumberGap, 'log_visit', $prefixes[self::VISITS_COUNT_RECORD_NAME]
));
$selects = array_merge($selects, LogAggregator::getSelectsFromRangedColumn(
'visitor_days_since_last', self::$daysSinceLastVisitGap, 'log_visit', $prefixes[self::DAYS_SINCE_LAST_RECORD_NAME],
$restrictToReturningVisitors = true
));
$query = $this->getLogAggregator()->queryVisitsByDimension(array(), $where = false, $selects, array());
$row = $query->fetch();
foreach ($prefixes as $recordName => $selectAsPrefix) {
$cleanRow = LogAggregator::makeArrayOneColumn($row, Metrics::INDEX_NB_VISITS, $selectAsPrefix);
$dataTable = DataTable::makeFromIndexedArray($cleanRow);
$this->getProcessor()->insertBlobRecord($recordName, $dataTable->getSerialized());
}
}
public function aggregateMultipleReports()
{
$dataTableRecords = array(
self::TIME_SPENT_RECORD_NAME,
self::PAGES_VIEWED_RECORD_NAME,
self::VISITS_COUNT_RECORD_NAME,
self::DAYS_SINCE_LAST_RECORD_NAME
);
$this->getProcessor()->aggregateDataTableRecords($dataTableRecords);
}
/**
* Transforms and returns the set of ranges used to calculate the 'visits by total time'
* report from ranges in minutes to equivalent ranges in seconds.
*/
protected static function getSecondsGap()
{
$secondsGap = array();
foreach (self::$timeGap as $gap) {
if (count($gap) == 3 && $gap[2] == 's') // if the units are already in seconds, just assign them
{
$secondsGap[] = array($gap[0], $gap[1]);
} else if (count($gap) == 2) {
$secondsGap[] = array($gap[0] * 60, $gap[1] * 60);
} else {
$secondsGap[] = array($gap[0] * 60);
}
}
return $secondsGap;
}
}

View file

@ -0,0 +1,59 @@
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\VisitorInterest;
use Piwik\View;
use Piwik\ViewDataTable\Factory;
/**
*/
class Controller extends \Piwik\Plugin\Controller
{
public function index()
{
$view = new View('@VisitorInterest/index');
$view->dataTableNumberOfVisitsPerVisitDuration = $this->getNumberOfVisitsPerVisitDuration(true);
$view->dataTableNumberOfVisitsPerPage = $this->getNumberOfVisitsPerPage(true);
$view->dataTableNumberOfVisitsByVisitNum = $this->getNumberOfVisitsByVisitCount(true);
$view->dataTableNumberOfVisitsByDaysSinceLast = $this->getNumberOfVisitsByDaysSinceLast(true);
return $view->render();
}
public function getNumberOfVisitsPerVisitDuration()
{
return $this->renderReport(__FUNCTION__);
}
public function getNumberOfVisitsPerPage()
{
return $this->renderReport(__FUNCTION__);
}
/**
* Returns a report that lists the count of visits for different ranges of
* a visitor's visit number.
*
* @return string The rendered report or nothing if $fetch is set to false.
*/
public function getNumberOfVisitsByVisitCount()
{
return $this->renderReport(__FUNCTION__);
}
/**
* Returns a rendered report that lists the count of visits for different ranges
* of days since a visitor's last visit.
*
* @return string The rendered report or nothing if $fetch is set to false.
*/
public function getNumberOfVisitsByDaysSinceLast()
{
return $this->renderReport(__FUNCTION__);
}
}

View file

@ -0,0 +1,243 @@
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\VisitorInterest;
use Piwik\ArchiveProcessor;
use Piwik\FrontController;
use Piwik\Menu\MenuMain;
use Piwik\Metrics;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\CoreVisualizations\Visualizations\Cloud;
use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
use Piwik\WidgetsList;
/**
*
*/
class VisitorInterest extends \Piwik\Plugin
{
/**
* @see Piwik\Plugin::getListHooksRegistered
*/
public function getListHooksRegistered()
{
$hooks = array(
'WidgetsList.addWidgets' => 'addWidgets',
'Menu.Reporting.addItems' => 'addMenu',
'API.getReportMetadata' => 'getReportMetadata',
'ViewDataTable.configure' => 'configureViewDataTable',
'ViewDataTable.getDefaultType' => 'getDefaultTypeViewDataTable'
);
return $hooks;
}
public function getReportMetadata(&$reports)
{
$reports[] = array(
'category' => Piwik::translate('General_Visitors'),
'name' => Piwik::translate('VisitorInterest_WidgetLengths'),
'module' => 'VisitorInterest',
'action' => 'getNumberOfVisitsPerVisitDuration',
'dimension' => Piwik::translate('VisitorInterest_ColumnVisitDuration'),
'metrics' => array('nb_visits'),
'processedMetrics' => false,
'constantRowsCount' => true,
'documentation' => Piwik::translate('VisitorInterest_WidgetLengthsDocumentation')
. '<br />' . Piwik::translate('General_ChangeTagCloudView'),
'order' => 15
);
$reports[] = array(
'category' => Piwik::translate('General_Visitors'),
'name' => Piwik::translate('VisitorInterest_WidgetPages'),
'module' => 'VisitorInterest',
'action' => 'getNumberOfVisitsPerPage',
'dimension' => Piwik::translate('VisitorInterest_ColumnPagesPerVisit'),
'metrics' => array('nb_visits'),
'processedMetrics' => false,
'constantRowsCount' => true,
'documentation' => Piwik::translate('VisitorInterest_WidgetPagesDocumentation')
. '<br />' . Piwik::translate('General_ChangeTagCloudView'),
'order' => 20
);
$reports[] = array(
'category' => Piwik::translate('General_Visitors'),
'name' => Piwik::translate('VisitorInterest_visitsByVisitCount'),
'module' => 'VisitorInterest',
'action' => 'getNumberOfVisitsByVisitCount',
'dimension' => Piwik::translate('VisitorInterest_visitsByVisitCount'),
'metrics' => array(
'nb_visits',
'nb_visits_percentage' => Piwik::translate('General_ColumnPercentageVisits'),
),
'processedMetrics' => false,
'constantRowsCount' => true,
'documentation' => Piwik::translate('VisitorInterest_WidgetVisitsByNumDocumentation')
. '<br />' . Piwik::translate('General_ChangeTagCloudView'),
'order' => 25
);
$reports[] = array(
'category' => Piwik::translate('General_Visitors'),
'name' => Piwik::translate('VisitorInterest_VisitsByDaysSinceLast'),
'module' => 'VisitorInterest',
'action' => 'getNumberOfVisitsByDaysSinceLast',
'dimension' => Piwik::translate('VisitorInterest_VisitsByDaysSinceLast'),
'metrics' => array('nb_visits'),
'processedMetrics' => false,
'constantRowsCount' => true,
'documentation' => Piwik::translate('VisitorInterest_WidgetVisitsByDaysSinceLastDocumentation'),
'order' => 30
);
}
public function addWidgets()
{
WidgetsList::add('General_Visitors', 'VisitorInterest_WidgetLengths', 'VisitorInterest', 'getNumberOfVisitsPerVisitDuration');
WidgetsList::add('General_Visitors', 'VisitorInterest_WidgetPages', 'VisitorInterest', 'getNumberOfVisitsPerPage');
WidgetsList::add('General_Visitors', 'VisitorInterest_visitsByVisitCount', 'VisitorInterest', 'getNumberOfVisitsByVisitCount');
WidgetsList::add('General_Visitors', 'VisitorInterest_WidgetVisitsByDaysSinceLast', 'VisitorInterest', 'getNumberOfVisitsByDaysSinceLast');
}
public function addMenu()
{
MenuMain::getInstance()->rename('General_Visitors', 'VisitFrequency_SubmenuFrequency',
'General_Visitors', 'VisitorInterest_Engagement');
}
function postLoad()
{
Piwik::addAction('Template.headerVisitsFrequency', array('Piwik\Plugins\VisitorInterest\VisitorInterest', 'headerVisitsFrequency'));
Piwik::addAction('Template.footerVisitsFrequency', array('Piwik\Plugins\VisitorInterest\VisitorInterest', 'footerVisitsFrequency'));
}
static public function headerVisitsFrequency(&$out)
{
$out = '<div id="leftcolumn">';
}
static public function footerVisitsFrequency(&$out)
{
$out = '</div>
<div id="rightcolumn">
';
$out .= FrontController::getInstance()->fetchDispatch('VisitorInterest', 'index');
$out .= '</div>';
}
public function getDefaultTypeViewDataTable(&$defaultViewTypes)
{
$defaultViewTypes['VisitorInterest.getNumberOfVisitsPerVisitDuration'] = Cloud::ID;
$defaultViewTypes['VisitorInterest.getNumberOfVisitsPerPage'] = Cloud::ID;
}
public function configureViewDataTable(ViewDataTable $view)
{
switch ($view->requestConfig->apiMethodToRequestDataTable) {
case 'VisitorInterest.getNumberOfVisitsPerVisitDuration':
$this->configureViewForGetNumberOfVisitsPerVisitDuration($view);
break;
case 'VisitorInterest.getNumberOfVisitsPerPage':
$this->configureViewForGetNumberOfVisitsPerPage($view);
break;
case 'VisitorInterest.getNumberOfVisitsByVisitCount':
$this->configureViewForGetNumberOfVisitsByVisitCount($view);
break;
case 'VisitorInterest.getNumberOfVisitsByDaysSinceLast':
$this->configureViewForGetNumberOfVisitsByDaysSinceLast($view);
break;
}
}
private function configureViewForGetNumberOfVisitsPerVisitDuration(ViewDataTable $view)
{
$view->requestConfig->filter_sort_column = 'label';
$view->requestConfig->filter_sort_order = 'asc';
$view->config->addTranslation('label', Piwik::translate('VisitorInterest_ColumnVisitDuration'));
$view->config->enable_sort = false;
$view->config->show_exclude_low_population = false;
$view->config->show_offset_information = false;
$view->config->show_pagination_control = false;
$view->config->show_limit_control = false;
$view->config->show_search = false;
$view->config->show_table_all_columns = false;
$view->config->columns_to_display = array('label', 'nb_visits');
if ($view->isViewDataTableId(Graph::ID)) {
$view->config->show_series_picker = false;
$view->config->selectable_columns = array();
$view->config->max_graph_elements = 10;
}
}
private function configureViewForGetNumberOfVisitsPerPage(ViewDataTable $view)
{
$view->requestConfig->filter_sort_column = 'label';
$view->requestConfig->filter_sort_order = 'asc';
$view->config->addTranslation('label', Piwik::translate('VisitorInterest_ColumnVisitDuration'));
$view->config->enable_sort = false;
$view->config->show_exclude_low_population = false;
$view->config->show_offset_information = false;
$view->config->show_pagination_control = false;
$view->config->show_limit_control = false;
$view->config->show_search = false;
$view->config->show_table_all_columns = false;
$view->config->columns_to_display = array('label', 'nb_visits');
if ($view->isViewDataTableId(Graph::ID)) {
$view->config->show_series_picker = false;
$view->config->selectable_columns = array();
$view->config->max_graph_elements = 10;
}
}
private function configureViewForGetNumberOfVisitsByVisitCount(ViewDataTable $view)
{
$view->requestConfig->filter_sort_column = 'label';
$view->requestConfig->filter_sort_order = 'asc';
$view->requestConfig->filter_limit = 15;
$view->config->addTranslations(array(
'label' => Piwik::translate('VisitorInterest_VisitNum'),
'nb_visits_percentage' => Metrics::getPercentVisitColumn())
);
$view->config->columns_to_display = array('label', 'nb_visits', 'nb_visits_percentage');
$view->config->show_exclude_low_population = false;
$view->config->enable_sort = false;
$view->config->show_offset_information = false;
$view->config->show_pagination_control = false;
$view->config->show_limit_control = false;
$view->config->show_search = false;
$view->config->show_table_all_columns = false;
$view->config->show_all_views_icons = false;
}
private function configureViewForGetNumberOfVisitsByDaysSinceLast(ViewDataTable $view)
{
$view->requestConfig->filter_sort_column = 'label';
$view->requestConfig->filter_sort_order = 'asc';
$view->requestConfig->filter_limit = 15;
$view->config->show_search = false;
$view->config->enable_sort = false;
$view->config->show_offset_information = false;
$view->config->show_pagination_control = false;
$view->config->show_limit_control = false;
$view->config->show_all_views_icons = false;
$view->config->show_table_all_columns = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate('General_DaysSinceLastVisit'));
}
}

View file

@ -0,0 +1,11 @@
<h2 piwik-enriched-headline>{{ 'VisitorInterest_VisitsPerDuration'|translate }}</h2>
{{ dataTableNumberOfVisitsPerVisitDuration|raw }}
<h2 piwik-enriched-headline>{{ 'VisitorInterest_VisitsPerNbOfPages'|translate }}</h2>
{{ dataTableNumberOfVisitsPerPage|raw }}
<h2 piwik-enriched-headline>{{ 'VisitorInterest_visitsByVisitCount'|translate }}</h2>
{{ dataTableNumberOfVisitsByVisitNum|raw }}
<h2 piwik-enriched-headline>{{ 'VisitorInterest_VisitsByDaysSinceLast'|translate }}</h2>
{{ dataTableNumberOfVisitsByDaysSinceLast|raw }}