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,204 @@
<?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\Events;
use Piwik\Archive;
use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Metrics;
use Piwik\Piwik;
/**
* Custom Events API
*
* @package Events
* @method static \Piwik\Plugins\Events\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
protected $defaultMappingApiToSecondaryDimension = array(
'getCategory' => 'eventAction',
'getAction' => 'eventName',
'getName' => 'eventAction',
);
protected $mappingApiToRecord = array(
'getCategory' =>
array(
'eventAction' => Archiver::EVENTS_CATEGORY_ACTION_RECORD_NAME,
'eventName' => Archiver::EVENTS_CATEGORY_NAME_RECORD_NAME,
),
'getAction' =>
array(
'eventName' => Archiver::EVENTS_ACTION_NAME_RECORD_NAME,
'eventCategory' => Archiver::EVENTS_ACTION_CATEGORY_RECORD_NAME,
),
'getName' =>
array(
'eventAction' => Archiver::EVENTS_NAME_ACTION_RECORD_NAME,
'eventCategory' => Archiver::EVENTS_NAME_CATEGORY_RECORD_NAME,
),
'getActionFromCategoryId' => Archiver::EVENTS_CATEGORY_ACTION_RECORD_NAME,
'getNameFromCategoryId' => Archiver::EVENTS_CATEGORY_NAME_RECORD_NAME,
'getCategoryFromActionId' => Archiver::EVENTS_ACTION_CATEGORY_RECORD_NAME,
'getNameFromActionId' => Archiver::EVENTS_ACTION_NAME_RECORD_NAME,
'getActionFromNameId' => Archiver::EVENTS_NAME_ACTION_RECORD_NAME,
'getCategoryFromNameId' => Archiver::EVENTS_NAME_CATEGORY_RECORD_NAME,
);
/**
* @ignore
*/
public function getActionToLoadSubtables($apiMethod, $secondaryDimension = false)
{
$recordName = $this->getRecordNameForAction($apiMethod, $secondaryDimension);
$apiMethod = array_search( $recordName, $this->mappingApiToRecord );
return $apiMethod;
}
/**
* @ignore
*/
public function getDefaultSecondaryDimension($apiMethod)
{
if(isset($this->defaultMappingApiToSecondaryDimension[$apiMethod])) {
return $this->defaultMappingApiToSecondaryDimension[$apiMethod];
}
return false;
}
protected function getRecordNameForAction($apiMethod, $secondaryDimension = false)
{
if (empty($secondaryDimension)) {
$secondaryDimension = $this->getDefaultSecondaryDimension($apiMethod);
}
$record = $this->mappingApiToRecord[$apiMethod];
if(!is_array($record)) {
return $record;
}
// when secondaryDimension is incorrectly set
if(empty($record[$secondaryDimension])) {
return key($record);
}
return $record[$secondaryDimension];
}
/**
* @ignore
* @param $apiMethod
* @return array
*/
public function getSecondaryDimensions($apiMethod)
{
$records = $this->mappingApiToRecord[$apiMethod];
if(!is_array($records)) {
return false;
}
return array_keys($records);
}
protected function checkSecondaryDimension($apiMethod, $secondaryDimension)
{
if (empty($secondaryDimension)) {
return;
}
$isSecondaryDimensionValid =
isset($this->mappingApiToRecord[$apiMethod])
&& isset($this->mappingApiToRecord[$apiMethod][$secondaryDimension]);
if (!$isSecondaryDimensionValid) {
throw new \Exception(
"Secondary dimension '$secondaryDimension' is not valid for the API $apiMethod. ".
"Use one of: " . implode(", ", $this->getSecondaryDimensions($apiMethod))
);
}
}
protected function getDataTable($name, $idSite, $period, $date, $segment, $expanded = false, $idSubtable = null, $secondaryDimension = false)
{
Piwik::checkUserHasViewAccess($idSite);
$this->checkSecondaryDimension($name, $secondaryDimension);
$recordName = $this->getRecordNameForAction($name, $secondaryDimension);
$dataTable = Archive::getDataTableFromArchive($recordName, $idSite, $period, $date, $segment, $expanded, $idSubtable);
$this->filterDataTable($dataTable);
return $dataTable;
}
public function getCategory($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
}
public function getAction($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
}
public function getName($idSite, $period, $date, $segment = false, $expanded = false, $secondaryDimension = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded, $idSubtable = false, $secondaryDimension);
}
public function getActionFromCategoryId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getNameFromCategoryId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getCategoryFromActionId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getNameFromActionId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getActionFromNameId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
public function getCategoryFromNameId($idSite, $period, $date, $idSubtable, $segment = false)
{
return $this->getDataTable(__FUNCTION__, $idSite, $period, $date, $segment, $expanded = false, $idSubtable);
}
/**
* @param DataTable $dataTable
*/
protected function filterDataTable($dataTable)
{
$dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS));
$dataTable->queueFilter('ReplaceColumnNames');
$dataTable->queueFilter('ReplaceSummaryRowLabel');
$dataTable->filter(function (DataTable $table) {
$row = $table->getRowFromLabel(Archiver::EVENT_NAME_NOT_SET);
if ($row) {
$row->setColumn('label', Piwik::translate('General_NotDefined', Piwik::translate('Events_EventName')));
}
});
// add processed metric avg_event_value
$dataTable->queueFilter('ColumnCallbackAddColumnQuotient',
array('avg_event_value',
'sum_event_value',
'nb_events_with_value',
$precision = 2,
$shouldSkipRows = true)
);
}
}

View file

@ -0,0 +1,260 @@
<?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\Events;
use Piwik\Config;
use Piwik\DataArray;
use Piwik\DataTable;
use Piwik\Metrics;
use Piwik\Plugins\Actions\ArchivingHelper;
use Piwik\RankingQuery;
use Piwik\Tracker\Action;
/**
* Processing reports for Events
EVENT
- Category
- Action
- Name
- Value
METRICS (Events Overview report)
- Total number of events
- Unique events
- Visits with events
- Events/visit
- Event value
- Average event value AVG(custom_float)
MAIN REPORTS:
- Top Event Category (total events, unique events, event value, avg+min+max value)
- Top Event Action (total events, unique events, event value, avg+min+max value)
- Top Event Name (total events, unique events, event value, avg+min+max value)
COMPOSED REPORTS
- Top Category > Actions X
- Top Category > Names X
- Top Actions > Categories X
- Top Actions > Names X
- Top Names > Actions X
- Top Names > Categories X
UI
- Overview at the top (graph + Sparklines)
- Below show the left menu, defaults to Top Event Category
Not MVP:
- On hover on any row: Show % of total events
- Add min value metric, max value metric in tooltip
- List event scope Custom Variables Names > Custom variables values > Event Names > Event Actions
- List event scope Custom Variables Value > Event Category > Event Names > Event Actions
NOTES:
- For a given Name, Category is often constant
*/
class Archiver extends \Piwik\Plugin\Archiver
{
const EVENTS_CATEGORY_ACTION_RECORD_NAME = 'Events_category_action';
const EVENTS_CATEGORY_NAME_RECORD_NAME = 'Events_category_name';
const EVENTS_ACTION_CATEGORY_RECORD_NAME = 'Events_action_category';
const EVENTS_ACTION_NAME_RECORD_NAME = 'Events_action_name';
const EVENTS_NAME_ACTION_RECORD_NAME = 'Events_name_action';
const EVENTS_NAME_CATEGORY_RECORD_NAME = 'Events_name_category';
const EVENT_NAME_NOT_SET = 'Piwik_EventNameNotSet';
/**
* @var DataArray[]
*/
protected $arrays = array();
function __construct($processor)
{
parent::__construct($processor);
$this->columnToSortByBeforeTruncation = Metrics::INDEX_NB_VISITS;
$this->maximumRowsInDataTable = Config::getInstance()->General['datatable_archiving_maximum_rows_events'];
$this->maximumRowsInSubDataTable = Config::getInstance()->General['datatable_archiving_maximum_rows_subtable_events'];
}
protected function getRecordToDimensions()
{
return array(
self::EVENTS_CATEGORY_ACTION_RECORD_NAME => array("eventCategory", "eventAction"),
self::EVENTS_CATEGORY_NAME_RECORD_NAME => array("eventCategory", "eventName"),
self::EVENTS_ACTION_NAME_RECORD_NAME => array("eventAction", "eventName"),
self::EVENTS_ACTION_CATEGORY_RECORD_NAME => array("eventAction", "eventCategory"),
self::EVENTS_NAME_ACTION_RECORD_NAME => array("eventName", "eventAction"),
self::EVENTS_NAME_CATEGORY_RECORD_NAME => array("eventName", "eventCategory"),
);
}
public function aggregateMultipleReports()
{
$dataTableToSum = $this->getRecordNames();
$this->getProcessor()->aggregateDataTableRecords($dataTableToSum, $this->maximumRowsInDataTable, $this->maximumRowsInSubDataTable, $this->columnToSortByBeforeTruncation);
}
protected function getRecordNames()
{
$mapping = $this->getRecordToDimensions();
return array_keys($mapping);
}
public function aggregateDayReport()
{
$this->aggregateDayEvents();
$this->insertDayReports();
}
protected function aggregateDayEvents()
{
$select = "
log_action_event_category.name as eventCategory,
log_action_event_action.name as eventAction,
log_action_event_name.name as eventName,
count(distinct log_link_visit_action.idvisit) as `" . Metrics::INDEX_NB_VISITS . "`,
count(distinct log_link_visit_action.idvisitor) as `" . Metrics::INDEX_NB_UNIQ_VISITORS . "`,
count(*) as `" . Metrics::INDEX_EVENT_NB_HITS . "`,
sum(
case when " . Action::DB_COLUMN_CUSTOM_FLOAT . " is null
then 0
else " . Action::DB_COLUMN_CUSTOM_FLOAT . "
end
) as `" . Metrics::INDEX_EVENT_SUM_EVENT_VALUE . "`,
sum( case when " . Action::DB_COLUMN_CUSTOM_FLOAT . " is null then 0 else 1 end )
as `" . Metrics::INDEX_EVENT_NB_HITS_WITH_VALUE . "`,
min(" . Action::DB_COLUMN_CUSTOM_FLOAT . ") as `" . Metrics::INDEX_EVENT_MIN_EVENT_VALUE . "`,
max(" . Action::DB_COLUMN_CUSTOM_FLOAT . ") as `" . Metrics::INDEX_EVENT_MAX_EVENT_VALUE . "`
";
$from = array(
"log_link_visit_action",
array(
"table" => "log_action",
"tableAlias" => "log_action_event_category",
"joinOn" => "log_link_visit_action.idaction_event_category = log_action_event_category.idaction"
),
array(
"table" => "log_action",
"tableAlias" => "log_action_event_action",
"joinOn" => "log_link_visit_action.idaction_event_action = log_action_event_action.idaction"
),
array(
"table" => "log_action",
"tableAlias" => "log_action_event_name",
"joinOn" => "log_link_visit_action.idaction_name = log_action_event_name.idaction"
)
);
$where = "log_link_visit_action.server_time >= ?
AND log_link_visit_action.server_time <= ?
AND log_link_visit_action.idsite = ?
AND log_link_visit_action.idaction_event_category IS NOT NULL";
$groupBy = "log_action_event_category.idaction,
log_action_event_action.idaction,
log_action_event_name.idaction";
$orderBy = "`" . Metrics::INDEX_NB_VISITS . "` DESC";
$rankingQueryLimit = ArchivingHelper::getRankingQueryLimit();
$rankingQuery = null;
if ($rankingQueryLimit > 0) {
$rankingQuery = new RankingQuery($rankingQueryLimit);
$rankingQuery->setOthersLabel(DataTable::LABEL_SUMMARY_ROW);
$rankingQuery->addLabelColumn(array('eventCategory', 'eventAction', 'eventName'));
$rankingQuery->addColumn(array(Metrics::INDEX_NB_UNIQ_VISITORS));
$rankingQuery->addColumn(array(Metrics::INDEX_EVENT_NB_HITS, Metrics::INDEX_NB_VISITS, Metrics::INDEX_EVENT_NB_HITS_WITH_VALUE), 'sum');
$rankingQuery->addColumn(Metrics::INDEX_EVENT_SUM_EVENT_VALUE, 'sum');
$rankingQuery->addColumn(Metrics::INDEX_EVENT_MIN_EVENT_VALUE, 'min');
$rankingQuery->addColumn(Metrics::INDEX_EVENT_MAX_EVENT_VALUE, 'max');
}
$this->archiveDayQueryProcess($select, $from, $where, $orderBy, $groupBy, $rankingQuery);
}
protected function archiveDayQueryProcess($select, $from, $where, $orderBy, $groupBy, RankingQuery $rankingQuery)
{
// get query with segmentation
$query = $this->getLogAggregator()->generateQuery($select, $from, $where, $groupBy, $orderBy);
// apply ranking query
if ($rankingQuery) {
$query['sql'] = $rankingQuery->generateQuery($query['sql']);
}
// get result
$resultSet = $this->getLogAggregator()->getDb()->query($query['sql'], $query['bind']);
if ($resultSet === false) {
return;
}
while ($row = $resultSet->fetch()) {
$this->aggregateEventRow($row);
}
}
/**
* Records the daily datatables
*/
protected function insertDayReports()
{
foreach ($this->arrays as $recordName => $dataArray) {
$dataTable = $dataArray->asDataTable();
$blob = $dataTable->getSerialized(
$this->maximumRowsInDataTable,
$this->maximumRowsInSubDataTable,
$this->columnToSortByBeforeTruncation);
$this->getProcessor()->insertBlobRecord($recordName, $blob);
}
}
/**
* @param string $name
* @return DataArray
*/
protected function getDataArray($name)
{
if(empty($this->arrays[$name])) {
$this->arrays[$name] = new DataArray();
}
return $this->arrays[$name];
}
protected function aggregateEventRow($row)
{
foreach ($this->getRecordToDimensions() as $record => $dimensions) {
$dataArray = $this->getDataArray($record);
$mainDimension = $dimensions[0];
$mainLabel = $row[$mainDimension];
// Event name is optional
if ($mainDimension == 'eventName'
&& empty($mainLabel)) {
$mainLabel = self::EVENT_NAME_NOT_SET;
}
$dataArray->sumMetricsEvents($mainLabel, $row);
$subDimension = $dimensions[1];
$subLabel = $row[$subDimension];
if (empty($subLabel)) {
continue;
}
$dataArray->sumMetricsEventsPivot($mainLabel, $subLabel, $row);
}
}
}

View file

@ -0,0 +1,115 @@
<?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\Events;
use Piwik\Piwik;
use Piwik\Plugins\Events\Events;
use Piwik\View;
use Piwik\ViewDataTable\Factory;
/**
* Events controller
*
*/
class Controller extends \Piwik\Plugin\Controller
{
public function index()
{
$view = new View('@Events/index');
$view->leftMenuReports = $this->getLeftMenuReports();
return $view->render();
}
private function getLeftMenuReports()
{
$reports = new View\ReportsByDimension('Events');
foreach(Events::getLabelTranslations() as $apiAction => $translations) {
// 'getCategory' is the API method, but we are loading 'indexCategory' which displays <h2>
$count = 1;
$controllerAction = str_replace("get", "index", $apiAction, $count);
$params = array(
'secondaryDimension' => API::getInstance()->getDefaultSecondaryDimension($apiAction)
);
$reports->addReport('Events_TopEvents', $translations[0], 'Events.' . $controllerAction, $params);
}
return $reports->render();
}
public function indexCategory()
{
return $this->indexEvent(__FUNCTION__);
}
public function indexAction()
{
return $this->indexEvent(__FUNCTION__);
}
public function indexName()
{
return $this->indexEvent(__FUNCTION__);
}
public function getCategory()
{
return $this->renderReport(__FUNCTION__);
}
public function getAction()
{
return $this->renderReport(__FUNCTION__);
}
public function getName()
{
return $this->renderReport(__FUNCTION__);
}
public function getActionFromCategoryId()
{
return $this->renderReport(__FUNCTION__);
}
public function getNameFromCategoryId()
{
return $this->renderReport(__FUNCTION__);
}
public function getCategoryFromActionId()
{
return $this->renderReport(__FUNCTION__);
}
public function getNameFromActionId()
{
return $this->renderReport(__FUNCTION__);
}
public function getActionFromNameId()
{
return $this->renderReport(__FUNCTION__);
}
public function getCategoryFromNameId()
{
return $this->renderReport(__FUNCTION__);
}
protected function indexEvent($controllerMethod)
{
$count = 1;
$apiMethod = str_replace('index', 'get', $controllerMethod, $count);
$events = new Events;
$title = $events->getReportTitleTranslation($apiMethod);
return View::singleReport(
$title,
$this->$apiMethod()
);
}
}

View file

@ -0,0 +1,306 @@
<?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\Events;
use Piwik\Common;
use Piwik\Menu\MenuMain;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
use Piwik\WidgetsList;
/**
*/
class Events extends \Piwik\Plugin
{
/**
* @see Piwik\Plugin::getListHooksRegistered
*/
public function getListHooksRegistered()
{
return array(
'API.getSegmentDimensionMetadata' => 'getSegmentsMetadata',
'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
'API.getReportMetadata' => 'getReportMetadata',
'Menu.Reporting.addItems' => 'addMenus',
'WidgetsList.addWidgets' => 'addWidgets',
'ViewDataTable.configure' => 'configureViewDataTable',
);
}
public function addWidgets()
{
foreach(self::getLabelTranslations() as $apiMethod => $labels) {
$params = array(
'secondaryDimension' => API::getInstance()->getDefaultSecondaryDimension($apiMethod)
);
WidgetsList::add('Events_Events', $labels[0], 'Events', $apiMethod, $params);
}
}
public function addMenus()
{
MenuMain::getInstance()->add('General_Actions', 'Events_Events', array('module' => 'Events', 'action' => 'index'), true, 30);
}
public function addMetricTranslations(&$translations)
{
$translations = array_merge($translations, $this->getMetricTranslations());
}
public function getMetricDocumentation()
{
$documentation = array(
'nb_events' => 'Events_TotalEventsDocumentation',
'sum_event_value' => 'Events_TotalValueDocumentation',
'min_event_value' => 'Events_MinValueDocumentation',
'max_event_value' => 'Events_MaxValueDocumentation',
'avg_event_value' => 'Events_AvgValueDocumentation',
'nb_events_with_value' => 'Events_EventsWithValueDocumentation',
);
$documentation = array_map(array('\\Piwik\\Piwik', 'translate'), $documentation);
return $documentation;
}
public function getMetricTranslations()
{
$metrics = array(
'nb_events' => 'Events_TotalEvents',
'sum_event_value' => 'Events_TotalValue',
'min_event_value' => 'Events_MinValue',
'max_event_value' => 'Events_MaxValue',
'avg_event_value' => 'Events_AvgValue',
'nb_events_with_value' => 'Events_EventsWithValue',
);
$metrics = array_map(array('\\Piwik\\Piwik', 'translate'), $metrics);
return $metrics;
}
public $metadataDimensions = array(
'eventCategory' => array('Events_EventCategory', 'log_link_visit_action.idaction_event_category'),
'eventAction' => array('Events_EventAction', 'log_link_visit_action.idaction_event_action'),
'eventName' => array('Events_EventName', 'log_link_visit_action.idaction_name'),
);
public function getDimensionLabel($dimension)
{
return Piwik::translate($this->metadataDimensions[$dimension][0]);
}
/**
* @return array
*/
static public function getLabelTranslations()
{
return array(
'getCategory' => array('Events_EventCategories', 'Events_EventCategory'),
'getAction' => array('Events_EventActions', 'Events_EventAction'),
'getName' => array('Events_EventNames', 'Events_EventName'),
);
}
public function getSegmentsMetadata(&$segments)
{
$sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
foreach($this->metadataDimensions as $dimension => $metadata) {
$segments[] = array(
'type' => 'dimension',
'category' => 'Events_Events',
'name' => $metadata[0],
'segment' => $dimension,
'sqlSegment' => $metadata[1],
'sqlFilter' => $sqlFilter,
);
}
$segments[] = array(
'type' => 'metric',
'category' => Piwik::translate('General_Visit'),
'name' => 'Events_TotalEvents',
'segment' => 'events',
'sqlSegment' => 'log_visit.visit_total_events',
'acceptedValues' => 'To select all visits who triggered an Event, use: &segment=events>0',
);
// $segments[] = array(
// 'type' => 'metric',
// 'category' => 'Events_Events',
// 'name' => 'Events_EventValue',
// 'segment' => 'eventValue',
// 'sqlSegment' => 'log_link_visit_action.custom_float',
// 'sqlFilter' => '\\Piwik\\Plugins\\Events\\Events::getSegmentEventValue'
// );
}
//
// public static function getSegmentEventValue($valueToMatch, $sqlField, $matchType, $segmentName)
// {
// $andActionisNotEvent = \Piwik\Plugins\Actions\Archiver::getWhereClauseActionIsNotEvent();
// $andActionisEvent = str_replace("IS NULL", "IS NOT NULL", $andActionisNotEvent);
//
// return array(
// 'extraWhere' => $andActionisEvent,
// 'bind' => $valueToMatch
// );
// }
public function getReportMetadata(&$reports)
{
$metrics = $this->getMetricTranslations();
$documentation = $this->getMetricDocumentation();
$labelTranslations = $this->getLabelTranslations();
$order = 0;
foreach($labelTranslations as $action => $translations) {
$secondaryDimension = $this->getSecondaryDimensionFromRequest();
$actionToLoadSubtables = API::getInstance()->getActionToLoadSubtables($action, $secondaryDimension);
$reports[] = array(
'category' => Piwik::translate('Events_Events'),
'name' => Piwik::translate($translations[0]),
'module' => 'Events',
'action' => $action,
'dimension' => Piwik::translate($translations[1]),
'metrics' => $metrics,
'metricsDocumentation' => $documentation,
'processedMetrics' => false,
'actionToLoadSubTables' => $actionToLoadSubtables,
'order' => $order++
);
}
}
/**
* Given getCategory, returns "Event Categories"
*
* @param $apiMethod
* @return string
*/
public function getReportTitleTranslation($apiMethod)
{
return $this->getTranslation($apiMethod, $index = 0);
}
/**
* Given getCategory, returns "Event Category"
*
* @param $apiMethod
* @return string
*/
public function getColumnTranslation($apiMethod)
{
return $this->getTranslation($apiMethod, $index = 1);
}
protected function getTranslation($apiMethod, $index)
{
$labels = $this->getLabelTranslations();
foreach ($labels as $action => $translations) {
// Events.getActionFromCategoryId returns translation for Events.getAction
if (strpos($apiMethod, $action) === 0) {
$columnLabel = $translations[$index];
return Piwik::translate($columnLabel);
}
}
throw new \Exception("Translation not found for report $apiMethod");
}
public function configureViewDataTable(ViewDataTable $view)
{
if($view->requestConfig->getApiModuleToRequest() != 'Events') {
return;
}
// eg. 'Events.getCategory'
$apiMethod = $view->requestConfig->getApiMethodToRequest();
$secondaryDimension = $this->getSecondaryDimensionFromRequest();
$view->config->subtable_controller_action = API::getInstance()->getActionToLoadSubtables($apiMethod, $secondaryDimension);
$view->config->columns_to_display = array('label', 'nb_events', 'sum_event_value');
$view->config->show_flatten_table = true;
$view->config->show_table_all_columns = false;
$view->requestConfig->filter_sort_column = 'nb_events';
$labelTranslation = $this->getColumnTranslation($apiMethod);
$view->config->addTranslation('label', $labelTranslation);
$view->config->addTranslations($this->getMetricTranslations());
$this->addRelatedReports($view, $secondaryDimension);
$this->addTooltipEventValue($view);
}
protected function addRelatedReports($view, $secondaryDimension)
{
if(empty($secondaryDimension)) {
// eg. Row Evolution
return;
}
$view->config->show_related_reports = true;
$apiMethod = $view->requestConfig->getApiMethodToRequest();
$secondaryDimensions = API::getInstance()->getSecondaryDimensions($apiMethod);
if(empty($secondaryDimensions)) {
return;
}
$secondaryDimensionTranslation = $this->getDimensionLabel($secondaryDimension);
$view->config->related_reports_title =
Piwik::translate('Events_SecondaryDimension', $secondaryDimensionTranslation)
. "<br/>"
. Piwik::translate('Events_SwitchToSecondaryDimension', '');
foreach($secondaryDimensions as $dimension) {
if($dimension == $secondaryDimension) {
// don't show as related report the currently selected dimension
continue;
}
$dimensionTranslation = $this->getDimensionLabel($dimension);
$view->config->addRelatedReport(
$view->requestConfig->apiMethodToRequestDataTable,
$dimensionTranslation,
array('secondaryDimension' => $dimension)
);
}
}
protected function addTooltipEventValue($view)
{
// Creates the tooltip message for Event Value column
$tooltipCallback = function ($hits, $min, $max, $avg) {
if (!$hits) {
return false;
}
$msgEventMinMax = Piwik::translate("Events_EventValueTooltip", array($hits, "<br />", $min, $max));
$msgEventAvg = Piwik::translate("Events_AvgEventValue", $avg);
return $msgEventMinMax . "<br/>" . $msgEventAvg;
};
// Add tooltip metadata column to the DataTable
$view->config->filters[] = array('ColumnCallbackAddMetadata',
array(
array(
'nb_events',
'min_event_value',
'max_event_value',
'avg_event_value'
),
'sum_event_value_tooltip',
$tooltipCallback
)
);
}
/**
* @return mixed
*/
protected function getSecondaryDimensionFromRequest()
{
return Common::getRequestVar('secondaryDimension', false, 'string');
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Събитие",
"EventAction": "Действие на събитието",
"EventCategory": "Категория на събитие",
"EventName": "Име на събитие",
"Events": "Събития",
"EventValue": "Стойност за събитие"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Hændelse",
"EventAction": "Hændelsesaktion",
"EventCategory": "Hændelseskategori",
"EventName": "Hændelsesnavn",
"Events": "Hændelser",
"EventValue": "Hændelsesværdi"
}
}

View file

@ -0,0 +1,21 @@
{
"Events": {
"Event": "Ereignis",
"EventAction": "Ereignisaktion",
"EventActions": "Ereignisaktionen",
"EventCategories": "Ereigniskategorien",
"EventCategory": "Ereigniskategorie",
"EventName": "Ereignisname",
"EventNames": "Ereignisnamen",
"Events": "Ereignisse",
"EventValue": "Ereigniswert",
"MaxValue": "Maximaler Wert",
"MaxValueDocumentation": "Maximaler Wert für dieses Ereignis",
"MinValue": "Minimaler Wert",
"MinValueDocumentation": "Minimaler Wert für dieses Ereignis",
"TotalEvents": "Gesamtzahl an Ereignissen",
"TotalEventsDocumentation": "Gesamtanzahl der Ereignisse",
"TotalValue": "Gesamtwert",
"TotalValueDocumentation": "Gesamtanzahl der Ereignisse (Summe der Ereigniswerte)"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Γεγονός",
"EventAction": "Ενέργεια Συμβάντος",
"EventCategory": "Κατηγορία Συμβάντος",
"EventName": "Όνομα Συμβάντος",
"Events": "Συμβάντα",
"EventValue": "Τιμή Συμβάντος"
}
}

View file

@ -0,0 +1,31 @@
{
"Events": {
"Events": "Events",
"Event": "Event",
"EventCategory": "Event Category",
"EventCategories": "Event Categories",
"EventAction": "Event Action",
"EventActions": "Event Actions",
"EventName": "Event Name",
"EventNames": "Event Names",
"EventValue": "Event Value",
"TotalEvents": "Total events",
"TotalValue": "Total value",
"MinValue": "Minimum value",
"MaxValue": "Maximum value",
"AvgValue": "Average value",
"EventsWithValue": "Events with a value",
"TotalEventsDocumentation": "Total number of events",
"TotalValueDocumentation": "The sum of event values",
"MinValueDocumentation": "The minimum value for this event",
"MaxValueDocumentation": "The maximum value for this event",
"AvgValueDocumentation": "The average of all values for this event",
"EventsWithValueDocumentation": "Number of events where an Event value was set",
"EventValueTooltip": "Total Event value is the sum of %s events values %s between minimum of %s and maximum of %s.",
"AvgEventValue": "Average Event value is: %s",
"TopEvents": "Top Events",
"SecondaryDimension": "Secondary dimension is %s.",
"SwitchToSecondaryDimension": "Switch to %s",
"ViewEvents": "View Events"
}
}

View file

@ -0,0 +1,21 @@
{
"Events": {
"Event": "Evento",
"EventAction": "Acción de evento",
"EventActions": "Acciones de evento",
"EventCategories": "Categorias del evento",
"EventCategory": "Categoría del evento",
"EventName": "Nombre del evento",
"EventNames": "Nombres de los eventos",
"Events": "Eventos",
"EventValue": "Valor del evento",
"MaxValue": "Valor máximo",
"MaxValueDocumentation": "El valor máximo de evento",
"MinValue": "Valor minimo",
"MinValueDocumentation": "El valor minimo de este evento",
"TotalEvents": "El total de eventos",
"TotalEventsDocumentation": "El numero total de eventos",
"TotalValue": "Valor total",
"TotalValueDocumentation": "Valor total de eventos (la suma del valor de los eventos)"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Sündmus",
"EventAction": "Sündmuse tegevus",
"EventCategory": "Sündmuse kategooria",
"EventName": "Sündmuse nimi",
"Events": "Sündmused",
"EventValue": "Sündmuse väärtus"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "رویداد",
"EventAction": "اقدامات رویداد",
"EventCategory": "دسته رویداد",
"EventName": "نام رویداد",
"Events": "رویداد ها",
"EventValue": "ارزش رویداد"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Tapahtuma",
"EventAction": "Tapahtuman toiminto",
"EventCategory": "Tapahtuman kategoria",
"EventName": "Tapahtuman nimi",
"Events": "Tapahtumat",
"EventValue": "Tapahtuman arvo"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Evènement",
"EventAction": "Action de l'évènement",
"EventCategory": "Catégorie d'évènement",
"EventName": "Nom d'évènement",
"Events": "Evènements",
"EventValue": "Valeur d'évènement"
}
}

View file

@ -0,0 +1,21 @@
{
"Events": {
"Event": "Evento",
"EventAction": "Azione Evento",
"EventActions": "Azioni Evento",
"EventCategories": "Categorie Evento",
"EventCategory": "Categoria Evento",
"EventName": "Nome Evento",
"EventNames": "Nomi Evento",
"Events": "Eventi",
"EventValue": "Valore Evento",
"MaxValue": "Valore massimo",
"MaxValueDocumentation": "Valore massimo per questo evento",
"MinValue": "Valore minimo",
"MinValueDocumentation": "Valore minimo per questo evento",
"TotalEvents": "Totale eventi",
"TotalEventsDocumentation": "Numero totale degli eventi",
"TotalValue": "Valore totale",
"TotalValueDocumentation": "Valore totale degli eventi (somma dei valori degli eventi)"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "イベント",
"EventAction": "イベントのアクション",
"EventCategory": "イベントのカテゴリー",
"EventName": "イベントの名称",
"Events": "イベント",
"EventValue": "イベントの価値"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Gebeurtenis",
"EventAction": "Gebeurtenis Actie",
"EventCategory": "Gebeurtenis Categorie",
"EventName": "Gebeurtenis Naam",
"Events": "Gebeurtenissen",
"EventValue": "Gebeurtenis Waarde"
}
}

View file

@ -0,0 +1,9 @@
{
"Events": {
"Event": "Evento",
"EventCategory": "Categoria do Evento",
"EventName": "Nome do Evento",
"Events": "Eventos",
"EventValue": "Valor do Evento"
}
}

View file

@ -0,0 +1,21 @@
{
"Events": {
"Event": "Eveniment",
"EventAction": "Actiunea Evenimentului",
"EventActions": "Actiunile Evenimentului",
"EventCategories": "Categoriile Evenimentului",
"EventCategory": "Categoria Evenimentului",
"EventName": "Numele Evenimentului",
"EventNames": "Numele Evenimentelor",
"Events": "Evenimente",
"EventValue": "Valoarea Evenimentului",
"MaxValue": "Valoarea maxima",
"MaxValueDocumentation": "Valoarea maxima pentru acest eveniment",
"MinValue": "Valoarea minima",
"MinValueDocumentation": "Valoarea minima pentru acest eveniment",
"TotalEvents": "Totalul evenimentelor",
"TotalEventsDocumentation": "Numarul total al evenimentelor",
"TotalValue": "Valoarea totala",
"TotalValueDocumentation": "Valoarea totala a evenimentelor (suma valorilor evenimentelor)"
}
}

View file

@ -0,0 +1,13 @@
{
"Events": {
"Event": "Događaj",
"EventActions": "Akcije događaja",
"EventCategory": "Kategorije događaja",
"EventNames": "Nazivi događaja",
"EventValue": "Vrednost događaja",
"MaxValueDocumentation": "Maksimalna vrednost za ovaj događaj",
"MinValueDocumentation": "Minimalna vrednost za ovaj događaj",
"TotalEventsDocumentation": "Ukupan broj događaja",
"TotalValueDocumentation": "Ukupna vrednost događaja (suma vrednosti događaja)"
}
}

View file

@ -0,0 +1,10 @@
{
"Events": {
"Event": "Händelse",
"EventAction": "Händelse Åtgärd",
"EventCategory": "Händelsekategori",
"EventName": "Händelse Namn",
"Events": "Händelser",
"EventValue": "Händelse Värde"
}
}

View file

@ -0,0 +1,9 @@
{
"Events": {
"EventAction": "நிகழ்ச்சி செயல்",
"EventCategory": "நிகழ்ச்சி வகை",
"EventName": "நிகழ்ச்சி பெயர்",
"Events": "நிகழ்சிகள்",
"EventValue": "நிகழ்ச்சி பெறுமதி"
}
}

View file

@ -0,0 +1,9 @@
{
"Events": {
"EventAction": "Hành động sự kiện",
"EventCategory": "Danh mục sự kiện",
"EventName": "Tên sự kiện",
"Events": "Các sự kiện",
"EventValue": "Giá trị sự kiện"
}
}

View file

@ -0,0 +1,9 @@
{
"Events": {
"EventAction": "事件行为",
"EventCategory": "事件分类",
"EventName": "事件名字",
"Events": "事件",
"EventValue": "事件值"
}
}

View file

@ -0,0 +1,6 @@
{
"name": "Events",
"version": "1.0",
"description": "Track Custom Events and get reports on your visitors activity.",
"theme": false
}

View file

@ -0,0 +1,2 @@
{{ leftMenuReports|raw }}