From 13c771ee55252bb8a825f7d8474de7f704ec5fc5 Mon Sep 17 00:00:00 2001
From: Thomas Steur <thomas.steur@googlemail.com>
Date: Tue, 28 Oct 2014 02:20:33 +0100
Subject: [PATCH] refs #6481 in report generator always show the dimensions of
 the selected plugin even if the plugin is not enabled

---
 core/Columns/Dimension.php                    | 20 ++++++++
 .../CoreConsole/Commands/GenerateReport.php   | 12 +++--
 tests/PHPUnit/Unit/Columns/DimensionTest.php  | 46 +++++++++++++++++++
 3 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/core/Columns/Dimension.php b/core/Columns/Dimension.php
index a6f8831a71..d591cea9db 100644
--- a/core/Columns/Dimension.php
+++ b/core/Columns/Dimension.php
@@ -9,6 +9,7 @@
 namespace Piwik\Columns;
 
 use Exception;
+use Piwik\Plugin;
 use Piwik\Plugin\ComponentFactory;
 use Piwik\Plugin\Dimension\ActionDimension;
 use Piwik\Plugin\Dimension\ConversionDimension;
@@ -188,6 +189,25 @@ abstract class Dimension
         return $dimensions;
     }
 
+    public static function getDimensions(Plugin $plugin)
+    {
+        $dimensions = array();
+
+        foreach (VisitDimension::getDimensions($plugin) as $dimension) {
+            $dimensions[] = $dimension;
+        }
+
+        foreach (ActionDimension::getDimensions($plugin) as $dimension) {
+            $dimensions[] = $dimension;
+        }
+
+        foreach (ConversionDimension::getDimensions($plugin) as $dimension) {
+            $dimensions[] = $dimension;
+        }
+
+        return $dimensions;
+    }
+
     /**
      * Creates a Dimension instance from a string ID (see {@link getId()}).
      *
diff --git a/plugins/CoreConsole/Commands/GenerateReport.php b/plugins/CoreConsole/Commands/GenerateReport.php
index d03b20781b..9eb7313400 100644
--- a/plugins/CoreConsole/Commands/GenerateReport.php
+++ b/plugins/CoreConsole/Commands/GenerateReport.php
@@ -10,6 +10,7 @@
 namespace Piwik\Plugins\CoreConsole\Commands;
 
 use Piwik\Columns\Dimension;
+use Piwik\Plugin\Manager;
 use Piwik\Plugin\Report;
 use Piwik\Translate;
 use Symfony\Component\Console\Input\InputInterface;
@@ -37,7 +38,7 @@ class GenerateReport extends GeneratePluginBase
         $reportName    = $this->getReportName($input, $output);
         $category      = $this->getCategory($input, $output, $pluginName);
         $documentation = $this->getDocumentation($input, $output);
-        list($dimension, $dimensionClass) = $this->getDimension($input, $output);
+        list($dimension, $dimensionClass) = $this->getDimension($input, $output, $pluginName);
 
         $order   = $this->getOrder($category);
         $apiName = $this->getApiName($reportName);
@@ -216,10 +217,11 @@ class GenerateReport extends GeneratePluginBase
     /**
      * @param InputInterface $input
      * @param OutputInterface $output
+     * @param string $pluginName
      * @return array
      * @throws \RuntimeException
      */
-    protected function getDimension(InputInterface $input, OutputInterface $output)
+    protected function getDimension(InputInterface $input, OutputInterface $output, $pluginName)
     {
         $dimensions = array();
         $dimensionNames = array();
@@ -235,7 +237,11 @@ class GenerateReport extends GeneratePluginBase
             }
         }
 
-        foreach (Dimension::getAllDimensions() as $dimension) {
+        $plugin     = Manager::getInstance()->loadPlugin($pluginName);
+        $dimensions = Dimension::getAllDimensions();
+        $dimensions = array_merge($dimensions, Dimension::getDimensions($plugin));
+
+        foreach ($dimensions as $dimension) {
             $name = $dimension->getName();
             if (!empty($name)) {
                 $dimensions[$name] = get_class($dimension);
diff --git a/tests/PHPUnit/Unit/Columns/DimensionTest.php b/tests/PHPUnit/Unit/Columns/DimensionTest.php
index 6952b3880f..cf0da5ff94 100644
--- a/tests/PHPUnit/Unit/Columns/DimensionTest.php
+++ b/tests/PHPUnit/Unit/Columns/DimensionTest.php
@@ -136,6 +136,52 @@ namespace Piwik\Tests\Core\Columns
             $this->assertTrue($foundVisit);
         }
 
+        public function test_getDimensions_shouldReturnAllKindOfDimensionsThatBelongToASpecificPlugin()
+        {
+            Manager::getInstance()->loadPlugins(array('Actions', 'Events', 'DevicesDetector', 'Goals'));
+
+            $dimensions = Dimension::getDimensions(Manager::getInstance()->loadPlugin('Actions'));
+
+            $this->assertGreaterThan(10, count($dimensions));
+
+            $foundVisit      = false;
+            $foundAction     = false;
+
+            foreach ($dimensions as $dimension) {
+                if ($dimension instanceof \Piwik\Plugin\Dimension\ActionDimension) {
+                    $foundAction = true;
+                } else if ($dimension instanceof \Piwik\Plugin\Dimension\VisitDimension) {
+                    $foundVisit = true;
+                }
+
+                $this->assertRegExp('/Piwik.Plugins.Actions.Columns/', get_class($dimension));
+            }
+
+            $this->assertTrue($foundAction);
+            $this->assertTrue($foundVisit);
+        }
+
+        public function test_getDimensions_shouldReturnConversionDimensionsThatBelongToASpecificPlugin()
+        {
+            Manager::getInstance()->loadPlugins(array('Actions', 'Events', 'DevicesDetector', 'Goals'));
+
+            $dimensions = Dimension::getDimensions(Manager::getInstance()->loadPlugin('Goals'));
+
+            $this->assertGreaterThan(2, count($dimensions));
+
+            $foundConversion = false;
+
+            foreach ($dimensions as $dimension) {
+                if ($dimension instanceof \Piwik\Plugin\Dimension\ConversionDimension) {
+                    $foundConversion = true;
+                }
+
+                $this->assertRegExp('/Piwik.Plugins.Goals.Columns/', get_class($dimension));
+            }
+
+            $this->assertTrue($foundConversion);
+        }
+
         public function test_getSegment_ShouldReturnConfiguredSegments()
         {
             $segments = $this->dimension->getSegments();
-- 
GitLab