1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Segment;
use Piwik\Cache;
use Piwik\CacheId;
use Piwik\Columns\Dimension;
use Piwik\Columns\DimensionSegmentFactory;
use Piwik\Piwik;
use Piwik\Plugin\Segment;
/**
* Manages the global list of segments that can be used.
*
* Segments are added automatically by dimensions as well as through the {@hook Segment.addSegments} event.
* Observers for this event should call the {@link addSegment()} method to add segments or use any of the other
* methods to remove segments.
*
* @api since Piwik 4.0.0
*/
class SegmentsList
{
/**
* List of segments
*
* @var Segment[]
*/
private $segments = array();
private $segmentsByNameCache = array();
public function addSegment(Segment $segment)
{
$this->segments[] = $segment;
$this->segmentsByNameCache = array();
}
/**
* Get all available segments.
*
* @return Segment[]
*/
public function getSegments()
{
return $this->segments;
}
/**
* Removes one or more segments from the segments list.
*
* @param string $segmentCategory The segment category id. Can be a translation token eg 'General_Visits'
* see {@link Segment::getCategoryId()}.
* @param string|false $segmentExpression The segment expression name to remove eg 'pageUrl'.
* If not supplied, all segments within that category will be removed.
*/
public function remove($segmentCategory, $segmentExpression = false)
{
foreach ($this->segments as $index => $segment) {
if ($segment->getCategoryId() === $segmentCategory) {
if (!$segmentExpression || $segment->getSegment() === $segmentExpression) {
unset($this->segments[$index]);
$this->segmentsByNameCache = array();
}
}
}
}
/**
* @param string $segmentExpression Name of the segment expression. eg `pageUrl`
* @return Segment|null
*/
public function getSegment($segmentExpression)
{
if (empty($this->segmentsByNameCache)) {
foreach ($this->segments as $index => $segment) {
$this->segmentsByNameCache[$segment->getSegment()] = $segment;
}
}
if (!empty($this->segmentsByNameCache[$segmentExpression])) {
return $this->segmentsByNameCache[$segmentExpression];
}
return null;
}
/**
* Get all metrics defined in the Piwik platform.
* @ignore
* @return static
*/
public static function get()
{
$cache = Cache::getTransientCache();
$idSites = CacheId::getIdSiteListFromParams();
$cacheKey = CacheId::siteAware('SegmentsList', $idSites);
if ($cache->contains($cacheKey)) {
return $cache->fetch($cacheKey);
}
$list = new static();
/**
* Triggered to add custom segment definitions.
*
* **Example**
*
* public function addSegments(&$segments)
* {
* $segment = new Segment();
* $segment->setSegment('my_segment_name');
* $segment->setType(Segment::TYPE_DIMENSION);
* $segment->setName('My Segment Name');
* $segment->setSqlSegment('log_table.my_segment_name');
* $segments[] = $segment;
* }
*
* @param SegmentsList $list An instance of the SegmentsList. You can add segments to the list this way.
*/
Piwik::postEvent('Segment.addSegments', [$list]);
foreach (Dimension::getAllDimensions() as $dimension) {
$dimension->configureSegments($list, new DimensionSegmentFactory($dimension));
}
/**
* Triggered to filter segment definitions.
*
* **Example**
*
* public function filterSegments(&$segmentList)
* {
* $segmentList->remove('Category');
* }
*
* @param SegmentsList $list An instance of the SegmentsList.
* @param array $idSites
*/
Piwik::postEvent('Segment.filterSegments', [&$list, $idSites]);
$cache->save($cacheKey, $list);
return $list;
}
}
|