Browse Source

Correct order of themed plugin paths.

The themed plugin path should precede the generic theme path. This makes
it possible for a plugin to provide specific views for specific
controllers even when plugins contain controllers of the same name.

Refs #4064
mark_story 11 years ago
parent
commit
a084fcee0f
2 changed files with 33 additions and 11 deletions
  1. 4 10
      src/View/View.php
  2. 29 1
      tests/TestCase/View/ViewTest.php

+ 4 - 10
src/View/View.php

@@ -932,11 +932,9 @@ class View {
 		}
 		$paths = array();
 		$viewPaths = App::path('Template');
-		$corePaths = App::core('Template');
 
 		if (!empty($plugin)) {
-			$count = count($viewPaths);
-			for ($i = 0; $i < $count; $i++) {
+			for ($i = 0, $count = count($viewPaths); $i < $count; $i++) {
 				$paths[] = $viewPaths[$i] . 'Plugin' . DS . $plugin . DS;
 			}
 			$paths = array_merge($paths, App::path('Template', $plugin));
@@ -948,21 +946,17 @@ class View {
 			$themePaths = App::path('Template', $theme);
 
 			if ($plugin) {
-				$count = count($viewPaths);
-				for ($i = 0; $i < $count; $i++) {
-					$themePaths[] = $themePaths[$i] . 'Plugin' . DS . $plugin . DS;
+				for ($i = 0, $count = count($viewPaths); $i < $count; $i++) {
+					array_unshift($themePaths, $themePaths[$i] . 'Plugin' . DS . $plugin . DS);
 				}
 			}
-
 			$paths = array_merge($themePaths, $paths);
 		}
-
-		$paths = array_merge($paths, $corePaths);
+		$paths = array_merge($paths, App::core('Template'));
 
 		if ($plugin !== null) {
 			return $this->_pathsForPlugin[$plugin] = $paths;
 		}
-
 		return $this->_paths = $paths;
 	}
 

+ 29 - 1
tests/TestCase/View/ViewTest.php

@@ -422,7 +422,7 @@ class ViewTest extends TestCase {
  *
  * @return void
  */
-	public function testPluginPathGeneration() {
+	public function testPathPluginGeneration() {
 		$viewOptions = ['plugin' => 'TestPlugin',
 			'name' => 'TestPlugin',
 			'viewPath' => 'Tests',
@@ -446,6 +446,34 @@ class ViewTest extends TestCase {
 	}
 
 /**
+ * Test that themed plugin paths are generated correctly.
+ *
+ * @return void
+ */
+	public function testPathThemedPluginGeneration() {
+		$viewOptions = ['plugin' => 'TestPlugin',
+			'name' => 'TestPlugin',
+			'viewPath' => 'Tests',
+			'view' => 'index',
+			'theme' => 'TestTheme'
+		];
+
+		$View = new TestView(null, null, null, $viewOptions);
+		$paths = $View->paths('TestPlugin');
+		$pluginPath = Plugin::path('TestPlugin');
+		$themePath = Plugin::path('TestTheme');
+		$expected = array(
+			$themePath . 'src' . DS . 'Template' . DS . 'Plugin' . DS . 'TestPlugin' . DS,
+			$themePath . 'src' . DS . 'Template' . DS,
+			TEST_APP . 'TestApp' . DS . 'Template' . DS . 'Plugin' . DS . 'TestPlugin' . DS,
+			$pluginPath . 'src' . DS . 'Template' . DS,
+			TEST_APP . 'TestApp' . DS . 'Template' . DS,
+			CAKE . 'Template' . DS,
+		);
+		$this->assertPathEquals($expected, $paths);
+	}
+
+/**
  * Test that CamelCase'd plugins still find their view files.
  *
  * @return void