Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CustomDimensions/Dimension/Extraction.php')
m---------plugins/CustomDimensions0
-rw-r--r--plugins/CustomDimensions/Dimension/Extraction.php125
2 files changed, 125 insertions, 0 deletions
diff --git a/plugins/CustomDimensions b/plugins/CustomDimensions
deleted file mode 160000
-Subproject 318661a2fb1ef3b3e5d6d999ae8b9628cb5a113
diff --git a/plugins/CustomDimensions/Dimension/Extraction.php b/plugins/CustomDimensions/Dimension/Extraction.php
new file mode 100644
index 0000000000..040992fd1a
--- /dev/null
+++ b/plugins/CustomDimensions/Dimension/Extraction.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Plugins\CustomDimensions\Dimension;
+
+use Piwik\Common;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Action;
+use Piwik\Url;
+use Piwik\UrlHelper;
+use Piwik\Piwik;
+use Exception;
+
+class Extraction
+{
+ private $dimension = '';
+ private $pattern = '';
+ private $caseSensitive = true;
+
+ public function __construct($dimension, $pattern)
+ {
+ $this->dimension = $dimension;
+ $this->pattern = $pattern;
+ }
+
+ public function toArray()
+ {
+ return array('dimension' => $this->dimension, 'pattern' => $this->pattern);
+ }
+
+ public function check()
+ {
+ $dimensions = $this->getSupportedDimensions();
+ if (!array_key_exists($this->dimension, $dimensions)) {
+ $dimensions = implode(', ', array_keys($dimensions));
+ throw new Exception("Invald dimension '$this->dimension' used in an extraction. Available dimensions are: " . $dimensions);
+ }
+
+ if (!empty($this->pattern) && $this->dimension !== 'urlparam') {
+ // make sure there is exactly one ( followed by one )
+ if (1 !== substr_count($this->pattern, '(') ||
+ 1 !== substr_count($this->pattern, ')') ||
+ 1 !== substr_count($this->pattern, ')', strpos($this->pattern, '('))) {
+ throw new Exception("You need to group exactly one part of the regular expression inside round brackets, eg 'index_(.+).html'");
+ }
+ }
+ }
+
+ public static function getSupportedDimensions()
+ {
+ return array(
+ 'url' => Piwik::translate('Actions_ColumnPageURL'),
+ 'urlparam' => Piwik::translate('CustomDimensions_PageUrlParam'),
+ 'action_name' => Piwik::translate('Goals_PageTitle')
+ );
+ }
+
+ public function setCaseSensitive($caseSensitive)
+ {
+ $this->caseSensitive = (bool) $caseSensitive;
+ }
+
+ public function extract(Request $request)
+ {
+ $value = $this->getValueForDimension($request);
+ $value = $this->extractValue($value);
+
+ return $value;
+ }
+
+ private function getValueForDimension(Request $request)
+ {
+ /** @var Action $action */
+ $action = $request->getMetadata('Actions', 'action');
+
+ if (in_array($this->dimension, array('url', 'urlparam'))) {
+ if (!empty($action)) {
+ $dimension = $action->getActionUrlRaw();
+ } else {
+ $dimension = $request->getParam('url');
+ }
+ } elseif ($this->dimension === 'action_name' && !empty($action)) {
+ $dimension = $action->getActionName();
+ } else {
+ $dimension = $request->getParam($this->dimension);
+ }
+
+ if (!empty($dimension)) {
+ $dimension = Common::unsanitizeInputValue($dimension);
+ }
+
+ return $dimension;
+ }
+
+ private function extractValue($value)
+ {
+ if (!isset($value) || '' === $value) {
+ return null;
+ }
+
+ $pattern = $this->pattern;
+ if ($this->dimension === 'urlparam') {
+ $pattern = '\?.*' . $pattern . '=([^&]*)';
+ }
+
+ $regex = '/' . str_replace('/', '\/', $pattern) . '/';
+ if (!$this->caseSensitive) {
+ $regex .= 'i';
+ }
+
+ if (preg_match($regex, (string) $value, $matches)) {
+ // we could improve performance here I reckon by combining all patterns of all configs see eg http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html
+
+ if (array_key_exists(1, $matches)) {
+ return $matches[1];
+ }
+ }
+ }
+} \ No newline at end of file