add icons for Character groups
This commit is contained in:
commit
2d9a41a5fe
3461 changed files with 594457 additions and 0 deletions
204
www/analytics/plugins/Events/API.php
Normal file
204
www/analytics/plugins/Events/API.php
Normal 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)
|
||||
);
|
||||
}
|
||||
}
|
||||
260
www/analytics/plugins/Events/Archiver.php
Normal file
260
www/analytics/plugins/Events/Archiver.php
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
115
www/analytics/plugins/Events/Controller.php
Normal file
115
www/analytics/plugins/Events/Controller.php
Normal 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()
|
||||
);
|
||||
}
|
||||
}
|
||||
306
www/analytics/plugins/Events/Events.php
Normal file
306
www/analytics/plugins/Events/Events.php
Normal 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');
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/bg.json
Normal file
10
www/analytics/plugins/Events/lang/bg.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"Events": {
|
||||
"Event": "Събитие",
|
||||
"EventAction": "Действие на събитието",
|
||||
"EventCategory": "Категория на събитие",
|
||||
"EventName": "Име на събитие",
|
||||
"Events": "Събития",
|
||||
"EventValue": "Стойност за събитие"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/da.json
Normal file
10
www/analytics/plugins/Events/lang/da.json
Normal 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"
|
||||
}
|
||||
}
|
||||
21
www/analytics/plugins/Events/lang/de.json
Normal file
21
www/analytics/plugins/Events/lang/de.json
Normal 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)"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/el.json
Normal file
10
www/analytics/plugins/Events/lang/el.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"Events": {
|
||||
"Event": "Γεγονός",
|
||||
"EventAction": "Ενέργεια Συμβάντος",
|
||||
"EventCategory": "Κατηγορία Συμβάντος",
|
||||
"EventName": "Όνομα Συμβάντος",
|
||||
"Events": "Συμβάντα",
|
||||
"EventValue": "Τιμή Συμβάντος"
|
||||
}
|
||||
}
|
||||
31
www/analytics/plugins/Events/lang/en.json
Normal file
31
www/analytics/plugins/Events/lang/en.json
Normal 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"
|
||||
}
|
||||
}
|
||||
21
www/analytics/plugins/Events/lang/es.json
Normal file
21
www/analytics/plugins/Events/lang/es.json
Normal 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)"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/et.json
Normal file
10
www/analytics/plugins/Events/lang/et.json
Normal 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"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/fa.json
Normal file
10
www/analytics/plugins/Events/lang/fa.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"Events": {
|
||||
"Event": "رویداد",
|
||||
"EventAction": "اقدامات رویداد",
|
||||
"EventCategory": "دسته رویداد",
|
||||
"EventName": "نام رویداد",
|
||||
"Events": "رویداد ها",
|
||||
"EventValue": "ارزش رویداد"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/fi.json
Normal file
10
www/analytics/plugins/Events/lang/fi.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"Events": {
|
||||
"Event": "Tapahtuma",
|
||||
"EventAction": "Tapahtuman toiminto",
|
||||
"EventCategory": "Tapahtuman kategoria",
|
||||
"EventName": "Tapahtuman nimi",
|
||||
"Events": "Tapahtumat",
|
||||
"EventValue": "Tapahtuman arvo"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/fr.json
Normal file
10
www/analytics/plugins/Events/lang/fr.json
Normal 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"
|
||||
}
|
||||
}
|
||||
21
www/analytics/plugins/Events/lang/it.json
Normal file
21
www/analytics/plugins/Events/lang/it.json
Normal 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)"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/ja.json
Normal file
10
www/analytics/plugins/Events/lang/ja.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"Events": {
|
||||
"Event": "イベント",
|
||||
"EventAction": "イベントのアクション",
|
||||
"EventCategory": "イベントのカテゴリー",
|
||||
"EventName": "イベントの名称",
|
||||
"Events": "イベント",
|
||||
"EventValue": "イベントの価値"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/nl.json
Normal file
10
www/analytics/plugins/Events/lang/nl.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"Events": {
|
||||
"Event": "Gebeurtenis",
|
||||
"EventAction": "Gebeurtenis Actie",
|
||||
"EventCategory": "Gebeurtenis Categorie",
|
||||
"EventName": "Gebeurtenis Naam",
|
||||
"Events": "Gebeurtenissen",
|
||||
"EventValue": "Gebeurtenis Waarde"
|
||||
}
|
||||
}
|
||||
9
www/analytics/plugins/Events/lang/pt-br.json
Normal file
9
www/analytics/plugins/Events/lang/pt-br.json
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"Events": {
|
||||
"Event": "Evento",
|
||||
"EventCategory": "Categoria do Evento",
|
||||
"EventName": "Nome do Evento",
|
||||
"Events": "Eventos",
|
||||
"EventValue": "Valor do Evento"
|
||||
}
|
||||
}
|
||||
21
www/analytics/plugins/Events/lang/ro.json
Normal file
21
www/analytics/plugins/Events/lang/ro.json
Normal 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)"
|
||||
}
|
||||
}
|
||||
13
www/analytics/plugins/Events/lang/sr.json
Normal file
13
www/analytics/plugins/Events/lang/sr.json
Normal 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)"
|
||||
}
|
||||
}
|
||||
10
www/analytics/plugins/Events/lang/sv.json
Normal file
10
www/analytics/plugins/Events/lang/sv.json
Normal 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"
|
||||
}
|
||||
}
|
||||
9
www/analytics/plugins/Events/lang/ta.json
Normal file
9
www/analytics/plugins/Events/lang/ta.json
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"Events": {
|
||||
"EventAction": "நிகழ்ச்சி செயல்",
|
||||
"EventCategory": "நிகழ்ச்சி வகை",
|
||||
"EventName": "நிகழ்ச்சி பெயர்",
|
||||
"Events": "நிகழ்சிகள்",
|
||||
"EventValue": "நிகழ்ச்சி பெறுமதி"
|
||||
}
|
||||
}
|
||||
9
www/analytics/plugins/Events/lang/vi.json
Normal file
9
www/analytics/plugins/Events/lang/vi.json
Normal 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"
|
||||
}
|
||||
}
|
||||
9
www/analytics/plugins/Events/lang/zh-cn.json
Normal file
9
www/analytics/plugins/Events/lang/zh-cn.json
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"Events": {
|
||||
"EventAction": "事件行为",
|
||||
"EventCategory": "事件分类",
|
||||
"EventName": "事件名字",
|
||||
"Events": "事件",
|
||||
"EventValue": "事件值"
|
||||
}
|
||||
}
|
||||
6
www/analytics/plugins/Events/plugin.json
Normal file
6
www/analytics/plugins/Events/plugin.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"name": "Events",
|
||||
"version": "1.0",
|
||||
"description": "Track Custom Events and get reports on your visitors activity.",
|
||||
"theme": false
|
||||
}
|
||||
2
www/analytics/plugins/Events/templates/index.twig
Normal file
2
www/analytics/plugins/Events/templates/index.twig
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
{{ leftMenuReports|raw }}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue