1<?php 2/** 3 * Matomo - free/libre analytics platform 4 * 5 * @link https://matomo.org 6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later 7 * 8 */ 9namespace Piwik\DataTable\Filter; 10 11use Piwik\DataTable; 12use Piwik\DataTable\BaseFilter; 13use Piwik\Development; 14 15/** 16 * Executes a filter for each row of a {@link DataTable} and generates a segment filter for each row. 17 * 18 * **Basic usage example** 19 * 20 * $dataTable->filter('AddSegmentByRangeLabel', array('segmentName')); 21 * 22 * @api 23 */ 24class AddSegmentByRangeLabel extends BaseFilter 25{ 26 private $segments; 27 private $delimiter; 28 29 /** 30 * Generates a segment filter based on the label column and the given segment name 31 * 32 * @param DataTable $table 33 * @param string $segment one segment 34 */ 35 public function __construct($table, $segment) 36 { 37 parent::__construct($table); 38 39 $this->segment = $segment; 40 } 41 42 /** 43 * @param DataTable $table 44 */ 45 public function filter($table) 46 { 47 if (empty($this->segment)) { 48 $msg = 'AddSegmentByRangeLabel is called without having any segment defined'; 49 Development::error($msg); 50 return; 51 } 52 53 foreach ($table->getRowsWithoutSummaryRow() as $key => $row) { 54 $label = $row->getColumn('label'); 55 56 if (empty($label)) { 57 return; 58 } 59 60 if ($label === 'General_NewVisits') { 61 $row->setMetadata('segment', 'visitorType==new'); 62 continue; 63 } 64 65 // if there's more than one element, handle as a range w/ an upper bound 66 if (strpos($label, "-") !== false) { 67 // get the range 68 sscanf($label, "%d - %d", $lowerBound, $upperBound); 69 70 if ($lowerBound == $upperBound) { 71 $row->setMetadata('segment', $this->segment . '==' . urlencode($lowerBound)); 72 } else { 73 $row->setMetadata('segment', $this->segment . '>=' . urlencode($lowerBound) . ';' . 74 $this->segment . '<=' . urlencode($upperBound)); 75 } 76 } // if there's one element, handle as a range w/ no upper bound 77 else { 78 // get the lower bound 79 sscanf($label, "%d", $lowerBound); 80 81 if ($lowerBound !== null) { 82 $row->setMetadata('segment', $this->segment . '>=' . urlencode($lowerBound)); 83 } 84 } 85 } 86 } 87} 88