PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -0,0 +1,63 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Site;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class IdSite extends VisitDimension
{
protected $columnName = 'idsite';
// we do not install or define column definition here as we need to create this column when installing as there is
// an index on it. Currently we do not define the index here... although we could overwrite the install() method
// and add column 'idsite' and add index. Problem is there is also an index
// INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether config_id already exists at
// installing point (we do not know whether visit_last_action_time or idsite column would be added first).
protected $nameSingular = 'General_Measurable';
protected $namePlural = 'General_Measurables';
protected $type = self::TYPE_TEXT;
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return $request->getIdSite();
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
{
return $request->getIdSite();
}
public function formatValue($value, $idSite, Formatter $formatter)
{
try {
return Site::getNameFor($value);
} catch (\Exception $ex) {
$formatted = parent::formatValue($value, $idSite, $formatter);
return Piwik::translate('General_MeasurableId') . ': ' . $formatted;
}
}
}

View File

@ -0,0 +1,33 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Piwik;
use Piwik\Plugin\ArchivedMetric;
use Piwik\Plugin\Dimension\ActionDimension;
class LinkVisitActionId extends ActionDimension
{
protected $columnName = 'idlink_va';
protected $acceptValues = 'Any integer.';
protected $category = 'General_Actions';
protected $nameSingular = 'General_Actions';
protected $metricId = 'hits';
protected $type = self::TYPE_NUMBER;
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
$metric = $dimensionMetricFactory->createMetric(ArchivedMetric::AGGREGATION_UNIQUE);
$metric->setTranslatedName(Piwik::translate('General_ColumnHits'));
$metric->setName('hits');
$metricsList->addMetric($metric);
}
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\Discriminator;
use Piwik\Columns\MetricsList;
use Piwik\Piwik;
use Piwik\Plugin\ArchivedMetric;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Tracker\Action;
class LinkVisitActionIdPages extends ActionDimension
{
protected $columnName = 'idlink_va';
protected $category = 'General_Actions';
protected $nameSingular = 'General_Actions';
protected $type = self::TYPE_NUMBER;
public function configureSegments()
{
// empty so we don't auto-generate a segment
}
public function getDbDiscriminator()
{
return new Discriminator('log_action', 'type', Action::TYPE_PAGE_URL);
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
$metric = $dimensionMetricFactory->createMetric(ArchivedMetric::AGGREGATION_UNIQUE);
$metric->setTranslatedName(Piwik::translate('General_ColumnPageviews'));
$metric->setDocumentation(Piwik::translate('General_ColumnPageviewsDocumentation'));
$metric->setName('pageviews');
$metricsList->addMetric($metric);
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable\Row;
use Piwik\Piwik;
use Piwik\Plugin\ProcessedMetric;
/**
* The average number of actions per visit. Calculated as:
*
* nb_actions / nb_visits
*
* nb_actions & nb_visits are calculated during archiving.
*/
class ActionsPerVisit extends ProcessedMetric
{
public function getName()
{
return 'nb_actions_per_visit';
}
public function compute(Row $row)
{
$actions = $this->getMetric($row, 'nb_actions');
$visits = $this->getMetric($row, 'nb_visits');
return Piwik::getQuotientSafe($actions, $visits, $precision = 1);
}
public function getTranslatedName()
{
return Piwik::translate('General_ColumnActionsPerVisit');
}
public function getDependentMetrics()
{
return array('nb_actions', 'nb_visits');
}
}

View File

@ -0,0 +1,53 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable\Row;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\ProcessedMetric;
/**
* The average number of seconds spent on the site per visit. Calculated as:
*
* sum_visit_length / nb_visits
*
* sum_visit_length & nb_visits are calculated during archiving.
*
* @api
*/
class AverageTimeOnSite extends ProcessedMetric
{
public function getName()
{
return 'avg_time_on_site';
}
public function compute(Row $row)
{
$sumVisitLength = $this->getMetric($row, 'sum_visit_length');
$nbVisits = $this->getMetric($row, 'nb_visits');
return Piwik::getQuotientSafe($sumVisitLength, $nbVisits, $precision = 0);
}
public function format($value, Formatter $formatter)
{
return $formatter->getPrettyTimeFromSeconds($value, true);
}
public function getTranslatedName()
{
return Piwik::translate('General_ColumnAvgTimeOnSite');
}
public function getDependentMetrics()
{
return array('sum_visit_length', 'nb_visits');
}
}

View File

@ -0,0 +1,52 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable\Row;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\ProcessedMetric;
/**
* The percentage of visits that leave the site without visiting another page. Calculated
* as:
*
* bounce_count / nb_visits
*
* bounce_count & nb_visits are calculated by an Archiver.
*/
class BounceRate extends ProcessedMetric
{
public function getName()
{
return 'bounce_rate';
}
public function getTranslatedName()
{
return Piwik::translate('General_ColumnBounceRate');
}
public function getDependentMetrics()
{
return array('bounce_count', 'nb_visits');
}
public function format($value, Formatter $formatter)
{
return $formatter->getPrettyPercentFromQuotient($value);
}
public function compute(Row $row)
{
$bounceCount = $this->getMetric($row, 'bounce_count');
$visits = $this->getMetric($row, 'nb_visits');
return Piwik::getQuotientSafe($bounceCount, $visits, $precision = 2);
}
}

View File

@ -0,0 +1,47 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable\Row;
use Piwik\Plugin\ProcessedMetric;
class CallableProcessedMetric extends ProcessedMetric
{
private $name;
private $callback;
private $dependentMetrics;
public function __construct($name, $callback, $dependentMetrics = array())
{
$this->name = $name;
$this->callback = $callback;
$this->dependentMetrics = $dependentMetrics;
}
public function getName()
{
return $this->name;
}
public function compute(Row $row)
{
if ($this->callback) {
return call_user_func($this->callback, $row);
}
}
public function getTranslatedName()
{
return '';
}
public function getDependentMetrics()
{
return $this->dependentMetrics;
}
}

View File

@ -0,0 +1,51 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable\Row;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\ProcessedMetric;
/**
* The percent of visits that result in a conversion. Calculated as:
*
* nb_visits_converted / nb_visits
*
* nb_visits_converted & nb_visits are calculated by the archiving process.
*/
class ConversionRate extends ProcessedMetric
{
public function getName()
{
return 'conversion_rate';
}
public function getTranslatedName()
{
return Piwik::translate('General_ColumnConversionRate');
}
public function getDependentMetrics()
{
return array('nb_visits_converted', 'nb_visits');
}
public function format($value, Formatter $formatter)
{
return $formatter->getPrettyPercentFromQuotient($value);
}
public function compute(Row $row)
{
$nbVisitsConverted = $this->getMetric($row, 'nb_visits_converted');
$nbVisits = $this->getMetric($row, 'nb_visits');
return Piwik::getQuotientSafe($nbVisitsConverted, $nbVisits, $precision = 4);
}
}

View File

@ -0,0 +1,173 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Metrics;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\Metric;
use Piwik\Plugin\ProcessedMetric;
/**
* Calculates evolution values for any other metric. An evolution is the percent change from a
* point in the past to the present. They are computed as:
*
* (current value - value in past) / value in past
*
* @api
*/
class EvolutionMetric extends ProcessedMetric
{
/**
* @var Metric|string
*/
private $wrapped;
/**
* @var string
*/
private $evolutionMetricName;
/**
* @var int
*/
private $quotientPrecision;
/**
* @var DataTable
*/
private $pastData;
/**
* The list of labels leading to the current subtable being processed. Used to get the proper subtable in
* $pastData.
*
* @var string[]
*/
private $labelPath = [];
/**
* Constructor.
*
* @param string|Metric $wrapped The metric used to calculate the evolution.
* @param DataTable|null $pastData The data in the past to use when calculating evolutions.
* @param string|false $evolutionMetricName The name of the evolution processed metric. Defaults to
* $wrapped's name with `'_evolution'` appended.
* @param int $quotientPrecision The percent's quotient precision.
*/
public function __construct($wrapped, DataTable $pastData = null, $evolutionMetricName = false, $quotientPrecision = 0)
{
$this->wrapped = $wrapped;
$this->pastData = $pastData;
if (empty($evolutionMetricName)) {
$wrappedName = $this->getWrappedName();
$evolutionMetricName = $wrappedName . '_evolution';
}
$this->evolutionMetricName = $evolutionMetricName;
$this->quotientPrecision = $quotientPrecision;
}
public function getName()
{
return $this->evolutionMetricName;
}
public function getTranslatedName()
{
if ($this->wrapped instanceof Metric) {
$metricName = $this->wrapped->getTranslatedName();
} else {
$defaultMetricTranslations = Metrics::getDefaultMetricTranslations();
$metricName = isset($defaultMetricTranslations[$this->wrapped]) ? $defaultMetricTranslations[$this->wrapped] : $this->wrapped;
}
return Piwik::translate('CoreHome_EvolutionMetricName', [$metricName]);
}
public function compute(Row $row)
{
$columnName = $this->getWrappedName();
$pastRow = $this->getPastRowFromCurrent($row);
$currentValue = $this->getMetric($row, $columnName);
$pastValue = $pastRow ? $this->getMetric($pastRow, $columnName) : 0;
$dividend = $currentValue - $pastValue;
$divisor = $pastValue;
if ($dividend == 0) {
return 0;
} else if ($divisor == 0) {
return 1;
} else {
return Piwik::getQuotientSafe($dividend, $divisor, $this->quotientPrecision + 2);
}
}
public function format($value, Formatter $formatter)
{
return $formatter->getPrettyPercentFromQuotient($value);
}
public function getDependentMetrics()
{
return array($this->getWrappedName());
}
public function beforeComputeSubtable(Row $row)
{
$this->labelPath[] = $row->getColumn('label');
}
public function afterComputeSubtable(Row $row)
{
array_pop($this->labelPath);
}
protected function getWrappedName()
{
return $this->wrapped instanceof Metric ? $this->wrapped->getName() : $this->wrapped;
}
/**
* public for Insights use.
*/
public function getPastRowFromCurrent(Row $row)
{
$pastData = $this->getPastDataTable();
if (empty($pastData)) {
return null;
}
$label = $row->getColumn('label');
return $label ? $pastData->getRowFromLabel($label) : $pastData->getFirstRow();
}
private function getPastDataTable()
{
$result = $this->pastData;
foreach ($this->labelPath as $label) {
$row = $result->getRowFromLabel($label);
if (empty($row)) {
return null;
}
$subtable = $row->getSubtable();
if (empty($subtable)) {
return null;
}
$result = $subtable;
}
return $result;
}
}

View File

@ -0,0 +1,77 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\ProcessedMetric;
use Piwik\Plugin\Report;
/**
* Percent of visits in the whole table. Calculated as:
*
* nb_visits / sum(all nb_visits in table)
*
* nb_visits is calculated by core archiving process.
*/
class VisitsPercent extends ProcessedMetric
{
private $cachedTotalVisits = null;
private $forceTotalVisits = null;
/**
* Constructor.
*
* @param int|null $totalVisits The forced value of total visits to use.
*/
public function __construct($totalVisits = null)
{
$this->forceTotalVisits = $totalVisits;
}
public function getName()
{
return 'nb_visits_percentage';
}
public function getTranslatedName()
{
return Piwik::translate('General_ColumnPercentageVisits');
}
public function compute(Row $row)
{
$visits = $this->getMetric($row, 'nb_visits');
return Piwik::getQuotientSafe($visits, $this->cachedTotalVisits, $precision = 2);
}
public function format($value, Formatter $formatter)
{
return $formatter->getPrettyPercentFromQuotient($value);
}
public function getDependentMetrics()
{
return array('nb_visits');
}
public function beforeCompute($report, DataTable $table)
{
if ($this->forceTotalVisits === null) {
$this->cachedTotalVisits = array_sum($this->getMetricValues($table, 'nb_visits'));
} else {
$this->cachedTotalVisits = $this->forceTotalVisits;
}
return true; // always compute
}
}

View File

@ -0,0 +1,35 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Metrics\Formatter;
use Piwik\Plugin\Dimension\ActionDimension;
class ServerMinute extends ActionDimension
{
protected $columnName = 'server_time';
protected $segmentName = 'actionServerMinute';
protected $sqlSegment = 'MINUTE(log_link_visit_action.server_time)';
protected $nameSingular = 'VisitTime_ColumnServerMinute';
protected $type = self::TYPE_DATETIME;
protected $acceptValues = '0, 1, 2, 3, ..., 56, 57, 58, 59';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(0, min(59, $maxValuesToReturn));
};
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,55 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Date;
use Piwik\Metrics\Formatter;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
require_once PIWIK_INCLUDE_PATH . '/plugins/VisitTime/functions.php';
class ServerTime extends ActionDimension
{
protected $columnName = 'server_time';
protected $columnType = 'DATETIME NOT NULL';
protected $segmentName = 'actionServerHour';
protected $sqlSegment = 'HOUR(log_link_visit_action.server_time)';
protected $nameSingular = 'VisitTime_ColumnServerHour';
protected $type = self::TYPE_DATETIME;
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(0, min(23, $maxValuesToReturn));
};
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return \Piwik\Plugins\VisitTime\getTimeLabel($value);
}
public function install()
{
$changes = parent::install();
$changes['log_link_visit_action'][] = "ADD INDEX index_idsite_servertime ( idsite, server_time )";
return $changes;
}
public function onNewAction(Request $request, Visitor $visitor, Action $action)
{
$timestamp = $request->getCurrentTimestamp();
return Date::getDatetimeFromTimestamp($timestamp);
}
}

View File

@ -0,0 +1,139 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Cache;
use Piwik\DataTable;
use Piwik\DataTable\Map;
use Piwik\Metrics;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\VisitsSummary\API as VisitsSummaryApi;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
use Piwik\Tracker\Action;
/**
* UserId dimension.
*/
class UserId extends VisitDimension
{
/**
* @var string
*/
protected $columnName = 'user_id';
protected $type = self::TYPE_TEXT;
protected $allowAnonymous = false;
protected $segmentName = 'userId';
protected $nameSingular = 'General_UserId';
protected $namePlural = 'General_UserIds';
protected $acceptValues = 'any non empty unique string identifying the user (such as an email address or a username).';
/**
* @var string
*/
protected $columnType = 'VARCHAR(200) NULL';
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed|false
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return $request->getForcedUserId();
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
*
* @return mixed|false
*/
public function onExistingVisit(Request $request, Visitor $visitor, $action)
{
return $request->getForcedUserId();
}
public function isUsedInAtLeastOneSite($idSites, $period, $date)
{
if ($period === 'day' || $period === 'week') {
$period = 'month';
}
if ($period === 'range') {
$period = 'day';
}
if (!empty($idSites)) {
foreach ($idSites as $idSite) {
if ($this->isUsedInSiteCached($idSite, $period, $date)) {
return true;
}
}
}
return false;
}
private function isUsedInSiteCached($idSite, $period, $date)
{
$cache = Cache::getTransientCache();
$key = sprintf('%d.%s.%s', $idSite, $period, $date);
if (!$cache->contains($key)) {
$result = $this->isUsedInSite($idSite, $period, $date);
$cache->save($key, $result);
}
return $cache->fetch($key);
}
private function isUsedInSite($idSite, $period, $date)
{
$result = \Piwik\API\Request::processRequest('VisitsSummary.get', [
'columns' => 'nb_users',
'idSite' => $idSite,
'period' => $period,
'date' => $date,
'segment' => false,
], $default = []);
return $this->hasDataTableUsers($result);
}
public function hasDataTableUsers(DataTable\DataTableInterface $result)
{
if ($result instanceof Map) {
foreach ($result->getDataTables() as $table) {
if ($this->hasDataTableUsers($table)) {
return true;
}
}
}
if (!$result->getRowsCount()) {
return false;
}
$firstRow = $result->getFirstRow();
if ($firstRow instanceof DataTable\Row && $firstRow->hasColumn(Metrics::INDEX_NB_USERS)) {
$metric = Metrics::INDEX_NB_USERS;
} else {
$metric = 'nb_users';
}
$numUsers = $result->getColumn($metric);
$numUsers = array_sum($numUsers);
return !empty($numUsers);
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
require_once PIWIK_INCLUDE_PATH . '/plugins/VisitTime/functions.php';
class VisitFirstActionMinute extends VisitDimension
{
protected $columnName = 'visit_first_action_time';
protected $type = self::TYPE_DATETIME;
protected $sqlSegment = 'HOUR(log_visit.visit_first_action_time)';
protected $segmentName = 'visitStartServerMinute';
protected $acceptValues = '0, 1, 2, 3, ..., 56, 57, 58, 59';
protected $nameSingular = 'VisitTime_ColumnVisitStartServerMinute';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(0, min(59, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics to be generated
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,53 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Date;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
use Piwik\Metrics\Formatter;
require_once PIWIK_INCLUDE_PATH . '/plugins/VisitTime/functions.php';
class VisitFirstActionTime extends VisitDimension
{
protected $columnName = 'visit_first_action_time';
protected $columnType = 'DATETIME NOT NULL';
protected $type = self::TYPE_DATETIME;
protected $sqlSegment = 'HOUR(log_visit.visit_first_action_time)';
protected $segmentName = 'visitStartServerHour';
protected $acceptValues = '0, 1, 2, 3, ..., 20, 21, 22, 23';
protected $nameSingular = 'VisitTime_ColumnVisitStartServerHour';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(0, min(23, $maxValuesToReturn));
};
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return \Piwik\Plugins\VisitTime\getTimeLabel($value);
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return Date::getDatetimeFromTimestamp($request->getCurrentTimestamp());
}
}

View File

@ -0,0 +1,143 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\CoreHome\Segment;
use Piwik\Tracker\Action;
use Piwik\Tracker\GoalManager;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class VisitGoalBuyer extends VisitDimension
{
// log_visit.visit_goal_buyer
const TYPE_BUYER_NONE = 0;
const TYPE_BUYER_ORDERED = 1;
const TYPE_BUYER_OPEN_CART = GoalManager::TYPE_BUYER_OPEN_CART;
const TYPE_BUYER_ORDERED_AND_OPEN_CART = GoalManager::TYPE_BUYER_ORDERED_AND_OPEN_CART;
protected static $visitEcommerceStatus = array(
self::TYPE_BUYER_NONE => 'none',
self::TYPE_BUYER_ORDERED => 'ordered',
self::TYPE_BUYER_OPEN_CART => 'abandonedCart',
self::TYPE_BUYER_ORDERED_AND_OPEN_CART => 'orderedThenAbandonedCart',
);
protected $columnName = 'visit_goal_buyer';
protected $columnType = 'TINYINT(1) NULL';
protected $segmentName = 'visitEcommerceStatus';
protected $nameSingular = 'General_EcommerceVisitStatusDesc';
protected $type = self::TYPE_ENUM;
public function __construct()
{
$example = Piwik::translate('General_EcommerceVisitStatusEg', '"&segment=visitEcommerceStatus==ordered,visitEcommerceStatus==orderedThenAbandonedCart"');
$this->acceptValues = implode(", ", self::$visitEcommerceStatus) . '. ' . $example;
}
public function formatValue($value, $idSite, Formatter $formatter)
{
switch ($value) {
case 'none';
case '0':
case self::TYPE_BUYER_NONE:
return Piwik::translate('UserCountryMap_None');
case 'ordered':
case '1':
case self::TYPE_BUYER_ORDERED:
return Piwik::translate('CoreHome_VisitStatusOrdered');
case 'abandonedCart':
case self::TYPE_BUYER_OPEN_CART:
return Piwik::translate('Goals_AbandonedCart');
case 'orderedThenAbandonedCart':
case self::TYPE_BUYER_ORDERED_AND_OPEN_CART:
return Piwik::translate('CoreHome_VisitStatusOrderedThenAbandoned');
}
return $value;
}
public function getEnumColumnValues()
{
return self::$visitEcommerceStatus;
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return $this->getBuyerType($request);
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return int
*/
public function onExistingVisit(Request $request, Visitor $visitor, $action)
{
$goalBuyer = $visitor->getVisitorColumn($this->columnName);
// Ecommerce buyer status
$visitEcommerceStatus = $this->getBuyerType($request, $goalBuyer);
if ($visitEcommerceStatus != self::TYPE_BUYER_NONE
// only update if the value has changed (prevents overwriting the value in case a request has
// updated it in the meantime)
&& $visitEcommerceStatus != $goalBuyer) {
return $visitEcommerceStatus;
}
return false;
}
/**
* @ignore
*/
public static function getVisitEcommerceStatusFromId($id)
{
if (!isset(self::$visitEcommerceStatus[$id])) {
throw new \Exception("Unexpected ECommerce status value ");
}
return self::$visitEcommerceStatus[$id];
}
private function getBuyerType(Request $request, $existingType = self::TYPE_BUYER_NONE)
{
$isRequestEcommerce = $request->getMetadata('Ecommerce', 'isRequestEcommerce');
if (!$isRequestEcommerce) {
return $existingType;
}
$isGoalAnOrder = $request->getMetadata('Ecommerce', 'isGoalAnOrder');
if ($isGoalAnOrder) {
return self::TYPE_BUYER_ORDERED;
}
// request is Add to Cart
if ($existingType == self::TYPE_BUYER_ORDERED
|| $existingType == self::TYPE_BUYER_ORDERED_AND_OPEN_CART
) {
return self::TYPE_BUYER_ORDERED_AND_OPEN_CART;
}
return self::TYPE_BUYER_OPEN_CART;
}
}

View File

@ -0,0 +1,62 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Piwik;
use Piwik\Plugin\ComputedMetric;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class VisitGoalConverted extends VisitDimension
{
protected $columnName = 'visit_goal_converted';
protected $columnType = 'TINYINT(1) NULL';
protected $type = self::TYPE_BOOL;
protected $segmentName = 'visitConverted';
protected $nameSingular = 'General_VisitConvertedGoal';
protected $acceptValues = '0, 1';
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
$metric1 = $dimensionMetricFactory->createCustomMetric('nb_visits_converted', Piwik::translate('General_ColumnVisitsWithConversions'), 'sum(case %s when 1 then 1 else 0 end)');
$metricsList->addMetric($metric1);
$metric = $dimensionMetricFactory->createComputedMetric($metric1->getName(), 'nb_visits', ComputedMetric::AGGREGATION_RATE);
$metric->setTranslatedName(Piwik::translate('General_ColumnConversionRate'));
$metric->setDocumentation(Piwik::translate('General_ColumnConversionRateDocumentation'));
$metric->setName('visits_conversion_rate');
$metricsList->addMetric($metric);
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return 0;
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onConvertedVisit(Request $request, Visitor $visitor, $action)
{
return 1;
}
}

View File

@ -0,0 +1,48 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Piwik;
use Piwik\Plugin\ArchivedMetric;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
/**
* Dimension for the log_visit.idvisit column. This column is added in the CREATE TABLE
* statement, so this dimension exists only to configure a segment.
*/
class VisitId extends VisitDimension
{
protected $columnName = 'idvisit';
protected $acceptValues = 'Any integer.';
protected $nameSingular = 'General_Visit';
protected $namePlural = 'General_ColumnNbVisits';
protected $segmentName = 'visitId';
protected $allowAnonymous = false;
protected $metricId = 'visits';
protected $type = self::TYPE_TEXT;
protected function configureSegments()
{
$segment = new Segment();
$segment->setName('General_VisitId');
$this->addSegment($segment);
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
$metric = $dimensionMetricFactory->createMetric(ArchivedMetric::AGGREGATION_UNIQUE);
$metric->setTranslatedName(Piwik::translate('General_ColumnNbVisits'));
$metric->setDocumentation(Piwik::translate('General_ColumnNbVisitsDocumentation'));
$metric->setName('nb_visits');
$metricsList->addMetric($metric);
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Common;
use Piwik\Metrics\Formatter;
use Piwik\Network\IPUtils;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
/**
* Dimension for the log_visit.location_ip column. This column is added in the CREATE TABLE
* statement, so this dimension exists only to configure a segment.
*/
class VisitIp extends VisitDimension
{
protected $columnName = 'location_ip';
protected $type = self::TYPE_BINARY;
protected $allowAnonymous = false;
protected $segmentName = 'visitIp';
protected $nameSingular = 'General_VisitorIP';
protected $namePlural = 'General_VisitorIPs';
protected $acceptValues = '13.54.122.1. </code>Select IP ranges with notation: <code>visitIp>13.54.122.0;visitIp<13.54.122.255';
protected $sqlFilterValue = array('Piwik\Network\IPUtils', 'stringToBinaryIP');
public function formatValue($value, $idSite, Formatter $formatter)
{
$value = Common::hex2bin($value);
$value = IPUtils::binaryToStringIP($value);
return $value;
}
protected function configureSegments()
{
$segment = new Segment();
$segment->setType(Segment::TYPE_METRIC); // we cannot remove this for now as it would assign dimension based on text type
$this->addSegment($segment);
}
}

View File

@ -0,0 +1,52 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Date;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
class VisitLastActionDate extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerDate';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerDate';
protected $sqlSegment = 'DATE(log_visit.visit_last_action_time)';
protected $acceptValues = '2018-12-31, 2018-03-20, ...';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
if (defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE) {
$date = Date::factory('2018-02-02');
} else {
$date = Date::now();
}
$return = array($date->toString());
for ($i = 0; $i < $maxValuesToReturn; $i++) {
$date = $date->subDay(1);
$return[] = $date->toString();
}
return $return;
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
class VisitLastActionDayOfMonth extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerDayOfMonth';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerDayOfMonth';
protected $sqlSegment = 'DAYOFMONTH(log_visit.visit_last_action_time)';
protected $acceptValues = '0, 1, 2, 3, ..., 29, 30, 31';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(0, min(31, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,43 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
require_once PIWIK_INCLUDE_PATH . '/plugins/VisitTime/functions.php';
class VisitLastActionDayOfWeek extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerDayOfWeek';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerDayOfWeek';
protected $sqlSegment = 'DAYOFWEEK(log_visit.visit_last_action_time)';
protected $acceptValues = '1, 2, 3, 4, 5, 6, 7';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(1, min(7, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return \Piwik\Plugins\VisitTime\translateDayOfWeek($value);
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
class VisitLastActionDayOfYear extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerDayOfYear';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerDayOfYear';
protected $sqlSegment = 'DAYOFYEAR(log_visit.visit_last_action_time)';
protected $acceptValues = '1, 2, 3, 4, ..., 365, 366';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(1, min(366, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,51 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
require_once PIWIK_INCLUDE_PATH . '/plugins/VisitTime/functions.php';
/**
* This dimension holds the best guess for a visit's end time. It is set the last action
* time for each visit. `ping=1` requests can be sent to update the dimension value so
* it can be a more accurate guess of the time the visitor spent on the site.
*
* Note: though it is named 'visit last action time' it actually refers to the visit's last action's
* end time.
*/
class VisitLastActionMinute extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerMinute';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerMinute';
protected $sqlSegment = 'MINUTE(log_visit.visit_last_action_time)';
protected $acceptValues = '0, 1, 2, 3, ..., 56, 57, 58, 59';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(0, min(59, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,43 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
require_once PIWIK_INCLUDE_PATH . '/plugins/VisitTime/functions.php';
class VisitLastActionMonth extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerMonth';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerMonth';
protected $sqlSegment = 'MONTH(log_visit.visit_last_action_time)';
protected $acceptValues = '1, 2, 3, ..., 11, 12';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(1, min(12, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return \Piwik\Plugins\VisitTime\translateMonth($value);
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
class VisitLastActionQuarter extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerQuarter';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerQuarter';
protected $sqlSegment = 'QUARTER(log_visit.visit_last_action_time)';
protected $acceptValues = '1, 2, 3, 4';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(1, min(4, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
class VisitLastActionSecond extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerSecond';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerSecond';
protected $sqlSegment = 'SECOND(log_visit.visit_last_action_time)';
protected $acceptValues = '0, 1, 2, 3, ..., 58, 59';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(0, min(59, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,73 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Date;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
use Piwik\Metrics\Formatter;
require_once PIWIK_INCLUDE_PATH . '/plugins/VisitTime/functions.php';
/**
* This dimension holds the best guess for a visit's end time. It is set the last action
* time for each visit. `ping=1` requests can be sent to update the dimension value so
* it can be a more accurate guess of the time the visitor spent on the site.
*
* Note: though it is named 'visit last action time' it actually refers to the visit's last action's
* end time.
*/
class VisitLastActionTime extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $nameSingular = 'VisitTime_ColumnVisitEndServerHour';
protected $sqlSegment = 'HOUR(log_visit.visit_last_action_time)';
protected $segmentName = 'visitServerHour';
protected $acceptValues = '0, 1, 2, 3, ..., 20, 21, 22, 23';
public function formatValue($value, $idSite, Formatter $formatter)
{
return \Piwik\Plugins\VisitTime\getTimeLabel($value);
}
// we do not install or define column definition here as we need to create this column when installing as there is
// an index on it. Currently we do not define the index here... although we could overwrite the install() method
// and add column 'visit_last_action_time' and add index. Problem is there is also an index
// INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether idsite already exists at
// installing point (we do not know whether idsite column will be added first).
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return Date::getDatetimeFromTimestamp($request->getCurrentTimestamp());
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onExistingVisit(Request $request, Visitor $visitor, $action)
{
if ($request->getParam('ping') == 1) {
return false;
}
return $this->onNewVisit($request, $visitor, $action);
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
class VisitLastActionWeekOfYear extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerWeekOfYear';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerWeekOfYear';
protected $sqlSegment = 'WEEKOFYEAR(log_visit.visit_last_action_time)';
protected $acceptValues = '1, 2, 3, 4, ..., 51, 52, 53';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(1, min(53, $maxValuesToReturn));
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Metrics\Formatter;
class VisitLastActionYear extends VisitDimension
{
protected $columnName = 'visit_last_action_time';
protected $type = self::TYPE_DATETIME;
protected $segmentName = 'visitEndServerYear';
protected $nameSingular = 'VisitTime_ColumnVisitEndServerYear';
protected $sqlSegment = 'YEAR(log_visit.visit_last_action_time)';
protected $acceptValues = '2016, 2017, 2018, ..., 9998, 9999';
public function __construct()
{
$this->suggestedValuesCallback = function ($idSite, $maxValuesToReturn) {
return range(2016, 2016 + $maxValuesToReturn);
};
}
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension
}
public function formatValue($value, $idSite, Formatter $formatter)
{
return $value;
}
}

View File

@ -0,0 +1,96 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Config;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\CoreHome\Segment;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class VisitTotalTime extends VisitDimension
{
protected $columnName = 'visit_total_time';
protected $columnType = 'INT(11) UNSIGNED NOT NULL';
protected $segmentName = 'visitDuration';
protected $nameSingular = 'General_ColumnVisitDuration';
protected $type = self::TYPE_DURATION_S;
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
$totalTime = Config::getInstance()->Tracker['default_time_one_page_visit'];
$totalTime = $this->cleanupVisitTotalTime($totalTime);
return $totalTime;
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onExistingVisit(Request $request, Visitor $visitor, $action)
{
$firstActionTime = $visitor->getVisitorColumn('visit_first_action_time');
$totalTime = 1 + $request->getCurrentTimestamp() - $firstActionTime;
$totalTime = $this->cleanupVisitTotalTime($totalTime);
return $totalTime;
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return int
*/
public function onConvertedVisit(Request $request, Visitor $visitor, $action)
{
if (!$visitor->isVisitorKnown()) {
return false;
}
$totalTime = $visitor->getVisitorColumn('visit_total_time');
// If a pageview and goal conversion in the same second, with previously a goal conversion recorded
// the request would not "update" the row since all values are the same as previous
// therefore the request below throws exception, instead we make sure the UPDATE will affect the row
$totalTime = $totalTime + $request->getParam('idgoal');
// +2 to offset idgoal=-1 and idgoal=0
$totalTime = $totalTime + 2;
return $this->cleanupVisitTotalTime($totalTime);
}
public function getRequiredVisitFields()
{
return array('visit_first_action_time');
}
private function cleanupVisitTotalTime($t)
{
$t = (int)$t;
if ($t < 0) {
$t = 0;
}
return $t;
}
}

View File

@ -0,0 +1,50 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class VisitorDaysSinceFirst extends VisitDimension
{
protected $columnName = 'visitor_days_since_first';
protected $columnType = 'SMALLINT(5) UNSIGNED NULL';
protected $segmentName = 'daysSinceFirstVisit';
protected $nameSingular = 'General_DaysSinceFirstVisit';
protected $type = self::TYPE_NUMBER;
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
// if the visitor is new, force days since first to 0, to ignore any potential bad values for _idts
if (!$visitor->isVisitorKnown()) {
return 0;
}
return $request->getDaysSinceFirstVisit();
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
{
return $visitor->getVisitorColumn($this->columnName);
}
}

View File

@ -0,0 +1,52 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class VisitorDaysSinceOrder extends VisitDimension
{
protected $columnName = 'visitor_days_since_order';
protected $columnType = 'SMALLINT(5) UNSIGNED NULL';
protected $segmentName = 'daysSinceLastEcommerceOrder';
protected $nameSingular = 'General_DaysSinceLastEcommerceOrder';
protected $category = 'General_Visitors'; // todo put into ecommerce category?
protected $type = self::TYPE_NUMBER;
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
$daysSinceLastOrder = $request->getDaysSinceLastOrder();
if ($daysSinceLastOrder === false) {
$daysSinceLastOrder = 0;
}
return $daysSinceLastOrder;
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
{
return $visitor->getVisitorColumn($this->columnName);
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\ArchivedMetric;
use Piwik\Plugin\Dimension\VisitDimension;
/**
* Dimension for the log_visit.idvisitor column. This column is added in the CREATE TABLE
* statement, so this dimension exists only to configure a segment.
*/
class VisitorId extends VisitDimension
{
protected $columnName = 'idvisitor';
protected $metricId = 'visitors';
protected $nameSingular = 'General_VisitorID';
protected $namePlural = 'General_Visitors';
protected $segmentName = 'visitorId';
protected $acceptValues = '34c31e04394bdc63 - any 16 Hexadecimal chars ID, which can be fetched using the Tracking API function getVisitorId()';
protected $allowAnonymous = false;
protected $sqlFilterValue = array('Piwik\Common', 'convertVisitorIdToBin');
protected $type = self::TYPE_BINARY;
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
$metric = $dimensionMetricFactory->createMetric(ArchivedMetric::AGGREGATION_UNIQUE);
$metric->setTranslatedName(Piwik::translate('General_ColumnNbUniqVisitors'));
$metric->setName('nb_uniq_visitors');
$metricsList->addMetric($metric);
}
}

View File

@ -0,0 +1,102 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class VisitorReturning extends VisitDimension
{
const IS_RETURNING_CUSTOMER = 2;
const IS_RETURNING = 1;
const IS_NEW = 0;
protected $columnName = 'visitor_returning';
protected $columnType = 'TINYINT(1) NULL';
protected $segmentName = 'visitorType';
protected $nameSingular = 'General_VisitType';
protected $namePlural = 'General_VisitTypes';
protected $conversionField = true;
protected $type = self::TYPE_ENUM;
public function __construct()
{
$this->acceptValues = 'new, returning, returningCustomer. ';
$this->acceptValues .= Piwik::translate('General_VisitTypeExample', '"&segment=visitorType==returning,visitorType==returningCustomer"');
$this->sqlFilterValue = function ($type) {
if (is_numeric($type)) {
return $type;
}
return $type == "new" ? 0 : ($type == "returning" ? 1 : 2);
};
}
public function formatValue($value, $idSite, Formatter $formatter)
{
if ($value === 1 || $value === '1' || $value === 'returning') {
return Piwik::translate('CoreHome_VisitTypeReturning');
} elseif ($value === 2 || $value === '2' || $value === 'returningCustomer'){
return Piwik::translate('CoreHome_VisitTypeReturningCustomer');
} elseif ($value === 0 || $value === '0' || $value === 'new'){
return Piwik::translate('General_New');
}
return $value;
}
public function getEnumColumnValues()
{
return array(
self::IS_RETURNING_CUSTOMER => 'returningCustomer',
self::IS_RETURNING => 'returning',
self::IS_NEW => 'new',
);
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
$daysSinceLastOrder = $request->getDaysSinceLastOrder();
$isReturningCustomer = ($daysSinceLastOrder !== false);
if ($isReturningCustomer) {
return self::IS_RETURNING_CUSTOMER;
}
$visitCount = $request->getVisitCount();
$daysSinceFirstVisit = $request->getDaysSinceFirstVisit();
$daysSinceLastVisit = $request->getDaysSinceLastVisit();
if ($visitCount > 1 || $visitor->isVisitorKnown() || $daysSinceFirstVisit > 0 || $daysSinceLastVisit > 0) {
return self::IS_RETURNING;
}
return self::IS_NEW;
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
{
return $visitor->getVisitorColumn($this->columnName);
}
}

View File

@ -0,0 +1,52 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Columns\DimensionMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class VisitsCount extends VisitDimension
{
protected $columnName = 'visitor_count_visits';
protected $columnType = 'INT(11) UNSIGNED NOT NULL';
protected $segmentName = 'visitCount';
protected $nameSingular = 'General_NumberOfVisits';
protected $type = self::TYPE_NUMBER;
public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
{
// no metrics for this dimension, it would be rather confusing I think
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
return $request->getVisitCount();
}
/**
* @param Request $request
* @param Visitor $visitor
* @param Action|null $action
* @return mixed
*/
public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
{
return $visitor->getVisitorColumn($this->columnName);
}
}