Browse Source

Make full page caching + Themes work.

Dispatcher now uses ThemeView for rendering cache files.
This enables nocache blocks to reference theme elements.
Fixes #1858
mark_story 14 years ago
parent
commit
0e5797d69d

+ 3 - 1
lib/Cake/Routing/Dispatcher.php

@@ -218,8 +218,10 @@ class Dispatcher {
 			}
 
 			if (file_exists($filename)) {
+				App::uses('ThemeView', 'View');
+
 				$controller = null;
-				$view = new View($controller);
+				$view = new ThemeView($controller);
 				return $view->renderCache($filename, microtime(true));
 			}
 		}

+ 48 - 0
lib/Cake/Test/Case/Routing/DispatcherTest.php

@@ -442,6 +442,15 @@ class TestCachedPagesController extends Controller {
 		$this->cacheAction = 10;
 		$this->helpers[] = 'Form';
 	}
+
+/**
+ * Test cached views with themes.
+ */
+	public function themed() {
+		$this->cacheAction = 10;
+		$this->viewClass = 'Theme';
+		$this->theme = 'TestTheme';
+	}
 }
 
 /**
@@ -1425,6 +1434,45 @@ class DispatcherTest extends CakeTestCase {
 	}
 
 /**
+ * Test full page caching with themes.
+ *
+ * @return void
+ */
+	public function testFullPageCachingWithThemes() {
+		Configure::write('Cache.disable', false);
+		Configure::write('Cache.check', true);
+		Configure::write('debug', 2);
+
+		Router::reload();
+		Router::connect('/:controller/:action/*');
+
+		App::build(array(
+			'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS),
+		), true);
+
+		$dispatcher = new TestDispatcher();
+		$request = new CakeRequest('/test_cached_pages/themed');
+		$response = new CakeResponse();
+
+		ob_start();
+		$dispatcher->dispatch($request, $response);
+		$out = ob_get_clean();
+
+		ob_start();
+		$dispatcher->cached($request->here);
+		$cached = ob_get_clean();
+
+		$result = str_replace(array("\t", "\r\n", "\n"), "", $out);
+		$cached = preg_replace('/<!--+[^<>]+-->/', '', $cached);
+		$expected =  str_replace(array("\t", "\r\n", "\n"), "", $cached);
+
+		$this->assertEqual($expected, $result);
+
+		$filename = $this->__cachePath($request->here);
+		unlink($filename);
+	}
+
+/**
  * testHttpMethodOverrides method
  *
  * @return void

+ 2 - 1
lib/Cake/Test/test_app/View/Themed/TestTheme/Layouts/default.ctp

@@ -1 +1,2 @@
-default test_theme layout
+default test_theme layout
+<?php echo $content_for_layout ?>

+ 4 - 0
lib/Cake/Test/test_app/View/Themed/TestTheme/Posts/themed.ctp

@@ -0,0 +1,4 @@
+posts themed themed file.
+<!--nocache-->
+<?php echo $this->element('test_element'); ?>
+<!--/nocache-->

+ 3 - 1
lib/Cake/View/ThemeView.php

@@ -38,7 +38,9 @@ class ThemeView extends View {
  */
 	public function __construct($controller) {
 		parent::__construct($controller);
-		$this->theme = $controller->theme;
+		if ($controller) {
+			$this->theme = $controller->theme;
+		}
 	}
 
 /**