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:
authorThomas Steur <thomas.steur@gmail.com>2015-12-10 00:50:07 +0300
committerThomas Steur <thomas.steur@gmail.com>2015-12-10 00:50:07 +0300
commitebced800c0184f5ce93663afab6b0337c3755cbb (patch)
treefb26c2506d37586ff0d38fb902d63d17701bd883 /plugins/API
parent3d26af780d8fe0e4f7c5824a88b95c4a0d0d25d7 (diff)
parentdb36ca384809ea36457a465a3b6d1ecf951b0e26 (diff)
Merge master into "3.0"
Conflicts: .travis.yml CHANGELOG.md core/Plugin/ControllerAdmin.php core/Version.php core/testMinimumPhpVersion.php plugins/API/API.php plugins/Actions/Reports/GetPageUrls.php plugins/AnonymousPiwikUsageMeasurement plugins/CoreHome/CoreHome.php plugins/CoreHome/templates/_menu.twig plugins/CoreVisualizations/javascripts/jqplotEvolutionGraph.js plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__CustomVariables.getCustomVariables_day.xml plugins/Goals/Controller.php tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php tests/PHPUnit/Integration/Plugin/ManagerTest.php tests/PHPUnit/System/expected/test_FlattenReports__CustomVariables.getCustomVariables_day.xml tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__CustomVariables.getCustomVariables_range.xml tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__CustomVariables.getCustomVariables_range.xml tests/PHPUnit/System/expected/test_reportLimiting__CustomVariables.getCustomVariables_day.xml tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__CustomVariables.getCustomVariables_day.xml tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData__CustomVariables.getCustomVariables_day.xml tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData__CustomVariables.getCustomVariables_week.xml tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchVisitorType__CustomVariables.getCustomVariables_day.xml tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchVisitorType__CustomVariables.getCustomVariables_week.xml tests/UI/expected-ui-screenshots tests/UI/specs/Overlay_spec.js tests/UI/specs/UIIntegration_spec.js
Diffstat (limited to 'plugins/API')
-rw-r--r--plugins/API/API.php123
-rw-r--r--plugins/API/ProcessedReport.php10
-rw-r--r--plugins/API/RowEvolution.php14
-rw-r--r--plugins/API/lang/cs.json4
-rw-r--r--plugins/API/lang/ja.json5
-rw-r--r--plugins/API/lang/ko.json6
-rw-r--r--plugins/API/lang/nb.json3
7 files changed, 122 insertions, 43 deletions
diff --git a/plugins/API/API.php b/plugins/API/API.php
index 8dcaf0186b..4eab2c63fd 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -91,8 +91,9 @@ class API extends \Piwik\Plugin\API
* are not visible in the UI and not present in the API meta data. These columns are
* translated here.
* @return array
+ * @deprecated since Piwik 2.15.1
*/
- public static function getDefaultMetricTranslations()
+ public function getDefaultMetricTranslations()
{
return Metrics::getDefaultMetricTranslations();
}
@@ -105,6 +106,8 @@ class API extends \Piwik\Plugin\API
*/
public function getAvailableMeasurableTypes()
{
+ Piwik::checkUserHasSomeViewAccess();
+
$typeManager = new TypeManager();
$types = $typeManager->getAllTypes();
@@ -123,11 +126,17 @@ class API extends \Piwik\Plugin\API
public function getSegmentsMetadata($idSites = array(), $_hideImplementationData = true)
{
- $isAuthenticatedWithViewAccess = Piwik::isUserHasViewAccess($idSites) && !Piwik::isUserIsAnonymous();
+ if (empty($idSites)) {
+ Piwik::checkUserHasSomeViewAccess();
+ } else {
+ Piwik::checkUserHasViewAccess($idSites);
+ }
+
+ $isNotAnonymous = !Piwik::isUserIsAnonymous();
$sites = (is_array($idSites) ? implode('.', $idSites) : (int) $idSites);
$cache = Cache::getTransientCache();
- $cachKey = 'API.getSegmentsMetadata' . $sites . '_' . (int) $_hideImplementationData . '_' . (int) $isAuthenticatedWithViewAccess;
+ $cachKey = 'API.getSegmentsMetadata' . $sites . '_' . (int) $_hideImplementationData . '_' . (int) $isNotAnonymous;
$cachKey = CacheId::pluginAware($cachKey);
if ($cache->contains($cachKey)) {
@@ -135,7 +144,7 @@ class API extends \Piwik\Plugin\API
}
$metadata = new SegmentMetadata();
- $segments = $metadata->getSegmentsMetadata($idSites, $_hideImplementationData, $isAuthenticatedWithViewAccess);
+ $segments = $metadata->getSegmentsMetadata($idSites, $_hideImplementationData, $isNotAnonymous);
$cache->save($cachKey, $segments);
@@ -164,6 +173,7 @@ class API extends \Piwik\Plugin\API
*
* @param bool $pathOnly If true, returns path relative to doc root. Otherwise, returns a URL.
* @return string
+ * @deprecated since Piwik 2.15.1
*/
public function getLogoUrl($pathOnly = false)
{
@@ -176,6 +186,7 @@ class API extends \Piwik\Plugin\API
*
* @param bool $pathOnly If true, returns path relative to doc root. Otherwise, returns a URL.
* @return string
+ * @deprecated since Piwik 2.15.1
*/
public function getHeaderLogoUrl($pathOnly = false)
{
@@ -214,6 +225,8 @@ class API extends \Piwik\Plugin\API
public function getMetadata($idSite, $apiModule, $apiAction, $apiParameters = array(), $language = false,
$period = false, $date = false, $hideMetricsDoc = false, $showSubtableReports = false)
{
+ Piwik::checkUserHasViewAccess($idSite);
+
if ($language) {
/** @var Translator $translator */
$translator = StaticContainer::get('Piwik\Translation\Translator');
@@ -239,6 +252,8 @@ class API extends \Piwik\Plugin\API
public function getReportMetadata($idSites = '', $period = false, $date = false, $hideMetricsDoc = false,
$showSubtableReports = false)
{
+ Piwik::checkUserHasViewAccess($idSites);
+
$reporter = new ProcessedReport();
$metadata = $reporter->getReportMetadata($idSites, $period, $date, $hideMetricsDoc, $showSubtableReports);
return $metadata;
@@ -247,11 +262,13 @@ class API extends \Piwik\Plugin\API
public function getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false,
$apiParameters = false, $idGoal = false, $language = false,
$showTimer = true, $hideMetricsDoc = false, $idSubtable = false, $showRawMetrics = false,
- $format_metrics = null)
+ $format_metrics = null, $idDimension = false)
{
+ Piwik::checkUserHasViewAccess($idSite);
+
$reporter = new ProcessedReport();
$processed = $reporter->getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment,
- $apiParameters, $idGoal, $language, $showTimer, $hideMetricsDoc, $idSubtable, $showRawMetrics, $format_metrics);
+ $apiParameters, $idGoal, $language, $showTimer, $hideMetricsDoc, $idSubtable, $showRawMetrics, $format_metrics, $idDimension);
return $processed;
}
@@ -296,6 +313,8 @@ class API extends \Piwik\Plugin\API
*/
public function get($idSite, $period, $date, $segment = false, $columns = false)
{
+ Piwik::checkUserHasViewAccess($idSite);
+
$columns = Piwik::getArrayFromApiParameter($columns);
// build columns map for faster checks later on
@@ -376,13 +395,16 @@ class API extends \Piwik\Plugin\API
* @param bool|int $idGoal
* @param bool|string $legendAppendMetric
* @param bool|string $labelUseAbsoluteUrl
+ * @param bool|int $idDimension
* @return array
*/
- public function getRowEvolution($idSite, $period, $date, $apiModule, $apiAction, $label = false, $segment = false, $column = false, $language = false, $idGoal = false, $legendAppendMetric = true, $labelUseAbsoluteUrl = true)
+ public function getRowEvolution($idSite, $period, $date, $apiModule, $apiAction, $label = false, $segment = false, $column = false, $language = false, $idGoal = false, $legendAppendMetric = true, $labelUseAbsoluteUrl = true, $idDimension = false)
{
+ Piwik::checkUserHasViewAccess($idSite);
+
$rowEvolution = new RowEvolution();
return $rowEvolution->getRowEvolution($idSite, $period, $date, $apiModule, $apiAction, $label, $segment, $column,
- $language, $idGoal, $legendAppendMetric, $labelUseAbsoluteUrl);
+ $language, $idGoal, $legendAppendMetric, $labelUseAbsoluteUrl, $idDimension);
}
/**
@@ -442,30 +464,20 @@ class API extends \Piwik\Plugin\API
if (empty(Config::getInstance()->General['enable_segment_suggested_values'])) {
return array();
}
+
Piwik::checkUserHasViewAccess($idSite);
$maxSuggestionsToReturn = 30;
- $segmentsMetadata = $this->getSegmentsMetadata($idSite, $_hideImplementationData = false);
-
- $segmentFound = false;
- foreach ($segmentsMetadata as $segmentMetadata) {
- if ($segmentMetadata['segment'] == $segmentName) {
- $segmentFound = $segmentMetadata;
- break;
- }
- }
- if (empty($segmentFound)) {
- throw new \Exception("Requested segment not found.");
- }
+ $segment = $this->findSegment($segmentName, $idSite);
// if segment has suggested values callback then return result from it instead
$suggestedValuesCallbackRequiresTable = false;
- if (isset($segmentFound['suggestedValuesCallback'])) {
+ if (isset($segment['suggestedValuesCallback'])) {
$suggestedValuesCallbackRequiresTable = $this->doesSuggestedValuesCallbackNeedData(
- $segmentFound['suggestedValuesCallback']);
+ $segment['suggestedValuesCallback']);
if (!$suggestedValuesCallbackRequiresTable) {
- return call_user_func($segmentFound['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn);
+ return call_user_func($segment['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn);
}
}
@@ -474,6 +486,57 @@ class API extends \Piwik\Plugin\API
return array();
}
+ if (!empty($segment['unionOfSegments'])) {
+ $values = array();
+ foreach ($segment['unionOfSegments'] as $unionSegmentName) {
+ $unionSegment = $this->findSegment($unionSegmentName, $idSite);
+
+ try {
+ $result = $this->getSuggestedValuesForSegmentName($idSite, $unionSegment, $maxSuggestionsToReturn);
+ if (!empty($result)) {
+ $values = array_merge($result, $values);
+ }
+ } catch (\Exception $e) {
+ // we ignore if there was no data found for $unionSegmentName
+ }
+ }
+
+ if (empty($values)) {
+ throw new \Exception("There was no data to suggest for $segmentName");
+ }
+
+ } else {
+ $values = $this->getSuggestedValuesForSegmentName($idSite, $segment, $maxSuggestionsToReturn);
+ }
+
+ $values = $this->getMostFrequentValues($values);
+ $values = array_slice($values, 0, $maxSuggestionsToReturn);
+ $values = array_map(array('Piwik\Common', 'unsanitizeInputValue'), $values);
+
+ return $values;
+ }
+
+ private function findSegment($segmentName, $idSite)
+ {
+ $segmentsMetadata = $this->getSegmentsMetadata($idSite, $_hideImplementationData = false);
+
+ $segmentFound = false;
+ foreach ($segmentsMetadata as $segmentMetadata) {
+ if ($segmentMetadata['segment'] == $segmentName) {
+ $segmentFound = $segmentMetadata;
+ break;
+ }
+ }
+
+ if (empty($segmentFound)) {
+ throw new \Exception("Requested segment $segmentName not found.");
+ }
+
+ return $segmentFound;
+ }
+
+ private function getSuggestedValuesForSegmentName($idSite, $segment, $maxSuggestionsToReturn)
+ {
$startDate = Date::now()->subDay(60)->toString();
$requestLastVisits = "method=Live.getLastVisitsDetails
&idSite=$idSite
@@ -483,6 +546,8 @@ class API extends \Piwik\Plugin\API
&serialize=0
&flat=1";
+ $segmentName = $segment['segment'];
+
// Select non empty fields only
// Note: this optimization has only a very minor impact
$requestLastVisits .= "&segment=$segmentName" . urlencode('!=');
@@ -497,22 +562,18 @@ class API extends \Piwik\Plugin\API
$request = new Request($requestLastVisits);
$table = $request->process();
+
if (empty($table)) {
throw new \Exception("There was no data to suggest for $segmentName");
}
- if ($suggestedValuesCallbackRequiresTable) {
- $values = call_user_func($segmentFound['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn, $table);
+ if (isset($segment['suggestedValuesCallback']) &&
+ $this->doesSuggestedValuesCallbackNeedData($segment['suggestedValuesCallback'])) {
+ $values = call_user_func($segment['suggestedValuesCallback'], $idSite, $maxSuggestionsToReturn, $table);
} else {
$values = $this->getSegmentValuesFromVisitorLog($segmentName, $table);
}
- $values = $this->getMostFrequentValues($values);
-
- $values = array_slice($values, 0, $maxSuggestionsToReturn);
-
- $values = array_map(array('Piwik\Common', 'unsanitizeInputValue'), $values);
-
return $values;
}
diff --git a/plugins/API/ProcessedReport.php b/plugins/API/ProcessedReport.php
index 65b59a2051..8a9a96b537 100644
--- a/plugins/API/ProcessedReport.php
+++ b/plugins/API/ProcessedReport.php
@@ -298,17 +298,25 @@ class ProcessedReport
public function getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false,
$apiParameters = false, $idGoal = false, $language = false,
$showTimer = true, $hideMetricsDoc = false, $idSubtable = false, $showRawMetrics = false,
- $formatMetrics = null)
+ $formatMetrics = null, $idDimension = false)
{
$timer = new Timer();
if (empty($apiParameters)) {
$apiParameters = array();
}
+
if (!empty($idGoal)
&& empty($apiParameters['idGoal'])
) {
$apiParameters['idGoal'] = $idGoal;
}
+
+ if (!empty($idDimension)
+ && empty($apiParameters['idDimension'])
+ ) {
+ $apiParameters['idDimension'] = (int) $idDimension;
+ }
+
// Is this report found in the Metadata available reports?
$reportMetadata = $this->getMetadata($idSite, $apiModule, $apiAction, $apiParameters, $language,
$period, $date, $hideMetricsDoc, $showSubtableReports = true);
diff --git a/plugins/API/RowEvolution.php b/plugins/API/RowEvolution.php
index c708608089..711a48316c 100644
--- a/plugins/API/RowEvolution.php
+++ b/plugins/API/RowEvolution.php
@@ -37,7 +37,7 @@ class RowEvolution
'getPageUrl'
);
- public function getRowEvolution($idSite, $period, $date, $apiModule, $apiAction, $label = false, $segment = false, $column = false, $language = false, $idGoal = false, $legendAppendMetric = true, $labelUseAbsoluteUrl = true)
+ public function getRowEvolution($idSite, $period, $date, $apiModule, $apiAction, $label = false, $segment = false, $column = false, $language = false, $idGoal = false, $legendAppendMetric = true, $labelUseAbsoluteUrl = true, $idDimension = false)
{
// validation of requested $period & $date
if ($period == 'range') {
@@ -52,9 +52,9 @@ class RowEvolution
$label = DataTablePostProcessor::unsanitizeLabelParameter($label);
$labels = Piwik::getArrayFromApiParameter($label);
- $metadata = $this->getRowEvolutionMetaData($idSite, $period, $date, $apiModule, $apiAction, $language, $idGoal);
+ $metadata = $this->getRowEvolutionMetaData($idSite, $period, $date, $apiModule, $apiAction, $language, $idGoal, $idDimension);
- $dataTable = $this->loadRowEvolutionDataFromAPI($metadata, $idSite, $period, $date, $apiModule, $apiAction, $labels, $segment, $idGoal);
+ $dataTable = $this->loadRowEvolutionDataFromAPI($metadata, $idSite, $period, $date, $apiModule, $apiAction, $labels, $segment, $idGoal, $idDimension);
if (empty($labels)) {
$labels = $this->getLabelsFromDataTable($dataTable, $labels);
@@ -249,7 +249,7 @@ class RowEvolution
* @throws Exception
* @return DataTable\Map|DataTable
*/
- private function loadRowEvolutionDataFromAPI($metadata, $idSite, $period, $date, $apiModule, $apiAction, $label = false, $segment = false, $idGoal = false)
+ private function loadRowEvolutionDataFromAPI($metadata, $idSite, $period, $date, $apiModule, $apiAction, $label = false, $segment = false, $idGoal = false, $idDimension = false)
{
if (!is_array($label)) {
$label = array($label);
@@ -266,6 +266,7 @@ class RowEvolution
'serialize' => '0',
'segment' => $segment,
'idGoal' => $idGoal,
+ 'idDimension' => $idDimension,
// data for row evolution should NOT be limited
'filter_limit' => -1,
@@ -310,12 +311,15 @@ class RowEvolution
* @throws Exception
* @return array
*/
- private function getRowEvolutionMetaData($idSite, $period, $date, $apiModule, $apiAction, $language, $idGoal = false)
+ private function getRowEvolutionMetaData($idSite, $period, $date, $apiModule, $apiAction, $language, $idGoal = false, $idDimension = false)
{
$apiParameters = array();
if (!empty($idGoal) && $idGoal > 0) {
$apiParameters = array('idGoal' => $idGoal);
}
+ if (!empty($idDimension) && $idDimension > 0) {
+ $apiParameters = array('idDimension' => (int) $idDimension);
+ }
$reportMetadata = API::getInstance()->getMetadata($idSite, $apiModule, $apiAction, $apiParameters, $language,
$period, $date, $hideMetricsDoc = false, $showSubtableReports = true);
diff --git a/plugins/API/lang/cs.json b/plugins/API/lang/cs.json
index 68c93a8e58..32d7dcba79 100644
--- a/plugins/API/lang/cs.json
+++ b/plugins/API/lang/cs.json
@@ -4,9 +4,9 @@
"KeepTokenSecret": "Tento token_auth je tajný jako vaše uživatelské jméno a heslo, %s neříkejte jej nikomu jinému %s!",
"LoadedAPIs": "Úspěšně načteno %s API",
"MoreInformation": "Pro více informací o API Piwiku se podívejte na %s Úvod do API Piwiku %s a %s Referenci API Piwiku %s",
- "PluginDescription": "Všechna data v Piwiku jsou dostupná pomocí jednoduchých API. Tento zásuvný modul je vstupním bodem těchto webových služeb, který vám umožňuje získat vaše analitická data jako XML, JSON, CSV, PHP atd.",
+ "PluginDescription": "Všechna data v Piwiku jsou dostupná pomocí jednoduchých API. Tento zásuvný modul je vstupním bodem těchto webových služeb, který vám umožňuje získat vaše analytická data jako XML, JSON, CSV, PHP atd.",
"ReportingApiReference": "Reference API hlášení",
- "TopLinkTooltip": "Zpřístupněte Vaše Webové analýzy programově skrze jednoduché API pomocí json, xml a dalších.",
+ "TopLinkTooltip": "Zpřístupněte svoje Webové analýzy programově skrze jednoduché API pomocí json, xml a dalších.",
"UserAuthentication": "Autentifikace uživatele",
"UsingTokenAuth": "Pokud chcete %s načíst data ze skriptu, cronu, atd. %s Potřebujete přidat parametr %s k voláním API, které vyžadují přihlášení",
"Glossary": "Glosář",
diff --git a/plugins/API/lang/ja.json b/plugins/API/lang/ja.json
index 7e65064104..f32bf15992 100644
--- a/plugins/API/lang/ja.json
+++ b/plugins/API/lang/ja.json
@@ -5,8 +5,11 @@
"LoadedAPIs": "%s API が正常に読み込まれました",
"MoreInformation": "Piwik API の詳細については、%sIntroduction to Piwik API%s や %sPiwik API Reference%s を参照してください。",
"PluginDescription": "Pwik の全てのデータは簡単な API を通して利用することができます。このプラグインはウェブサービスの入り口で、xml , json , php , csv などのあなたのウェブ分析データを入手するために呼び出すことができます。",
+ "ReportingApiReference": "API リファレンスを報告",
"TopLinkTooltip": "jsopn、xml等シンプルなAPIを介して、プログラムで分析データにアクセスできます",
"UserAuthentication": "ユーザー認証",
- "UsingTokenAuth": "%sスクリプト(crontab 等)でリクエストデータを得たい場合%sは、API をコールする URL(認証が必要)にパラメータ %s を付加する必要があります。"
+ "UsingTokenAuth": "%sスクリプト(crontab 等)でリクエストデータを得たい場合%sは、API をコールする URL(認証が必要)にパラメータ %s を付加する必要があります。",
+ "Glossary": "用語集",
+ "LearnAboutCommonlyUsedTerms": "Piwik Analytics の最もよく使われる用語について: %s と %s"
}
} \ No newline at end of file
diff --git a/plugins/API/lang/ko.json b/plugins/API/lang/ko.json
index c2c8657960..2f04051378 100644
--- a/plugins/API/lang/ko.json
+++ b/plugins/API/lang/ko.json
@@ -5,7 +5,9 @@
"LoadedAPIs": "성공적으로 %s API를 불러옴",
"MoreInformation": "Piwik API에 대한 자세한 내용은 %sIntroduction to Piwik API %s 문서와 %sPiwik API Reference%s 문서를 참조하세요.",
"TopLinkTooltip": "JSON, XML 등의 간단한 API를 통해 프로그래밍 방식으로 웹 로그 분석 데이터에 접근할 수 있습니다.",
- "UserAuthentication": "용자 인증",
- "UsingTokenAuth": "%s 스크립트 (crontab 등)에서 요청 데이터를 얻고 싶다면 %s는 API를 호출하는 URL (인증 필요)에 매개 변수 %s를 추가해야합니다."
+ "UserAuthentication": "사용자 인증",
+ "UsingTokenAuth": "%s 스크립트 (crontab 등)에서 요청 데이터를 얻고 싶다면 %s는 API를 호출하는 URL (인증 필요)에 매개 변수 %s를 추가해야합니다.",
+ "Glossary": "용어",
+ "LearnAboutCommonlyUsedTerms": "Piwik 분석에 있어 자주 사용되는 용어 %s 와 %s 배우기"
}
} \ No newline at end of file
diff --git a/plugins/API/lang/nb.json b/plugins/API/lang/nb.json
index 7cde5b4d1c..cd56984f85 100644
--- a/plugins/API/lang/nb.json
+++ b/plugins/API/lang/nb.json
@@ -1,6 +1,7 @@
{
"API": {
"LoadedAPIs": "Lastet %s API",
- "UserAuthentication": "Brukerautentisering"
+ "UserAuthentication": "Brukerautentisering",
+ "Glossary": "Ordliste"
}
} \ No newline at end of file