diff options
Diffstat (limited to 'core/Columns/MetricsList.php')
-rw-r--r-- | core/Columns/MetricsList.php | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/core/Columns/MetricsList.php b/core/Columns/MetricsList.php new file mode 100644 index 0000000000..e65ec67ec7 --- /dev/null +++ b/core/Columns/MetricsList.php @@ -0,0 +1,190 @@ +<?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\Columns; + +use Piwik\Cache; +use Piwik\Piwik; +use Piwik\Plugin\ArchivedMetric; +use Piwik\Plugin\Metric; +use Piwik\Plugin\ProcessedMetric; + +/** + * Manages the global list of metrics that can be used in reports. + * + * Metrics are added automatically by dimensions as well as through the {@hook Metric.addMetrics} and + * {@hook Metric.addComputedMetrics} and filtered through the {@hook Metric.filterMetrics} event. + * Observers for this event should call the {@link addMetric()} method to add metrics or use any of the other + * methods to remove metrics. + * + * @api since Piwik 3.2.0 + */ +class MetricsList +{ + /** + * List of metrics + * + * @var Metric[] + */ + private $metrics = array(); + + /** + * @param Metric $metric + */ + public function addMetric(Metric $metric) + { + $this->metrics[] = $metric; + } + + /** + * Get all available metrics. + * + * @return Metric[] + */ + public function getMetrics() + { + return $this->metrics; + } + + /** + * Removes one or more metrics from the metrics list. + * + * @param string $metricCategory The metric category id. Can be a translation token eg 'General_Visits' + * see {@link Metric::getCategory()}. + * @param string|false $metricName The name of the metric to remove eg 'nb_visits'. + * If not supplied, all metrics within that category will be removed. + */ + public function remove($metricCategory, $metricName = false) + { + foreach ($this->metrics as $index => $metric) { + if ($metric->getCategoryId() === $metricCategory) { + if (!$metricName || $metric->getName() === $metricName) { + unset($this->metrics[$index]); + } + } + } + } + + /** + * @param string $metricName + * @return Metric|ArchivedMetric|null + */ + public function getMetric($metricName) + { + foreach ($this->metrics as $index => $metric) { + if ($metric->getName() === $metricName) { + return $metric; + } + } + return null; + } + + /** + * Get all metrics defined in the Piwik platform. + * @ignore + * @return static + */ + public static function get() + { + $cache = Cache::getTransientCache(); + $cacheKey = 'MetricsList'; + + foreach (array('idsite', 'idSite') as $param) { + if (!empty($_GET[$param]) && is_numeric($_GET[$param])) { + $cacheKey .= $cacheKey . '_' . $_GET[$param]; + } + + if (!empty($_POST[$param]) && is_numeric($_POST[$param])) { + $cacheKey .= $cacheKey . '_' . $_POST[$param]; + } + } + + if ($cache->contains($cacheKey)) { + return $cache->fetch($cacheKey); + } + + $list = new static; + + /** + * Triggered to add new metrics that cannot be picked up automatically by the platform. + * This is useful if the plugin allows a user to create metrics dynamically. For example + * CustomDimensions or CustomVariables. + * + * **Example** + * + * public function addMetric(&$list) + * { + * $list->addMetric(new MyCustomMetric()); + * } + * + * @param MetricsList $list An instance of the MetricsList. You can add metrics to the list this way. + */ + Piwik::postEvent('Metric.addMetrics', array($list)); + + $dimensions = Dimension::getAllDimensions(); + foreach ($dimensions as $dimension) { + $factory = new DimensionMetricFactory($dimension); + $dimension->configureMetrics($list, $factory); + } + + $computedFactory = new ComputedMetricFactory($list); + + /** + * Triggered to add new metrics that cannot be picked up automatically by the platform. + * This is useful if the plugin allows a user to create metrics dynamically. For example + * CustomDimensions or CustomVariables. + * + * **Example** + * + * public function addMetric(&$list) + * { + * $list->addMetric(new MyCustomMetric()); + * } + * + * @param MetricsList $list An instance of the MetricsList. You can add metrics to the list this way. + */ + Piwik::postEvent('Metric.addComputedMetrics', array($list, $computedFactory)); + + /** + * Triggered to filter metrics. + * + * **Example** + * + * public function removeMetrics(Piwik\Columns\MetricsList $list) + * { + * $list->remove($category='General_Visits'); // remove all metrics having this category + * } + * + * @param MetricsList $list An instance of the MetricsList. You can change the list of metrics this way. + */ + Piwik::postEvent('Metric.filterMetrics', array($list)); + + $availableMetrics = array(); + foreach ($list->getMetrics() as $metric) { + $availableMetrics[] = $metric->getName(); + } + + foreach ($list->metrics as $index => $metric) { + if ($metric instanceof ProcessedMetric) { + $depMetrics = $metric->getDependentMetrics(); + if (is_array($depMetrics)) { + foreach ($depMetrics as $depMetric) { + if (!in_array($depMetric, $availableMetrics, $strict = true)) { + unset($list->metrics[$index]); // not resolvable metric + } + } + } + } + } + + $cache->save($cacheKey, $list); + + return $list; + } + +} |