diff options
author | Matthieu Aubry <matt@piwik.org> | 2015-09-15 03:18:17 +0300 |
---|---|---|
committer | Matthieu Aubry <matt@piwik.org> | 2015-09-15 03:18:17 +0300 |
commit | 1d805fe626807fd648de68ad8d13cd78fd5dbc97 (patch) | |
tree | ddd4aa22a67faeba467d088f68e6c284efe44b9e /plugins/API | |
parent | 3a84a8aeb2612fa16926d65554c182b156844642 (diff) | |
parent | ca6b7e77f4d4b886db0d0660db1f0ae6980e3fe4 (diff) |
Merge pull request #8754 from piwik/6031_cvar_unified_segment
Define four segments that search over all custom variable name/value columns instead of one per column
Diffstat (limited to 'plugins/API')
-rw-r--r-- | plugins/API/API.php | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/plugins/API/API.php b/plugins/API/API.php index dcdacf40b2..fb1e5ae669 100644 --- a/plugins/API/API.php +++ b/plugins/API/API.php @@ -189,6 +189,12 @@ class API extends \Piwik\Plugin\API unset($segment['sqlFilter']); unset($segment['sqlFilterValue']); unset($segment['sqlSegment']); + + if (isset($segment['suggestedValuesCallback']) + && !is_string($segment['suggestedValuesCallback']) + ) { + unset($segment['suggestedValuesCallback']); + } } } @@ -487,8 +493,14 @@ class API extends \Piwik\Plugin\API } // if segment has suggested values callback then return result from it instead + $suggestedValuesCallbackRequiresTable = false; if (isset($segmentFound['suggestedValuesCallback'])) { - return call_user_func($segmentFound['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn); + $suggestedValuesCallbackRequiresTable = $this->doesSuggestedValuesCallbackNeedData( + $segmentFound['suggestedValuesCallback']); + + if (!$suggestedValuesCallbackRequiresTable) { + return call_user_func($segmentFound['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn); + } } // if period=range is disabled, do not proceed @@ -523,12 +535,16 @@ class API extends \Piwik\Plugin\API throw new \Exception("There was no data to suggest for $segmentName"); } - // Cleanup data to return the top suggested (non empty) labels for this segment - $values = $table->getColumn($segmentName); + if ($suggestedValuesCallbackRequiresTable) { + $values = call_user_func($segmentFound['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn, $table); + } else { + // Cleanup data to return the top suggested (non empty) labels for this segment + $values = $table->getColumn($segmentName); - // Select also flattened keys (custom variables "page" scope, page URLs for one visit, page titles for one visit) - $valuesBis = $table->getColumnsStartingWith($segmentName . ColumnDelete::APPEND_TO_COLUMN_NAME_TO_KEEP); - $values = array_merge($values, $valuesBis); + // Select also flattened keys (custom variables "page" scope, page URLs for one visit, page titles for one visit) + $valuesBis = $table->getColumnsStartingWith($segmentName . ColumnDelete::APPEND_TO_COLUMN_NAME_TO_KEEP); + $values = array_merge($values, $valuesBis); + } $values = $this->getMostFrequentValues($values); @@ -579,6 +595,23 @@ class API extends \Piwik\Plugin\API $values = array_keys($values); return $values; } + + private function doesSuggestedValuesCallbackNeedData($suggestedValuesCallback) + { + if (is_string($suggestedValuesCallback) + && strpos($suggestedValuesCallback, '::') !== false + ) { + $suggestedValuesCallback = explode('::', $suggestedValuesCallback); + } + + if (is_array($suggestedValuesCallback)) { + $methodMetadata = new \ReflectionMethod($suggestedValuesCallback[0], $suggestedValuesCallback[1]); + } else { + $methodMetadata = new \ReflectionFunction($suggestedValuesCallback); + } + + return $methodMetadata->getNumberOfParameters() >= 3; + } } /** |