From a7c7436d8ec758795e0cf38b6062befd12933134 Mon Sep 17 00:00:00 2001
From: Juan Basso <jrbasso@gmail.com>
Date: Sat, 18 Dec 2010 19:31:10 -0200
Subject: [PATCH] Passing viewVars to cache views, avoiding cake:nocache
 problems.

---
 cake/libs/view/helpers/cache.php              |  2 ++
 cake/libs/view/view.php                       |  1 +
 .../cases/libs/view/helpers/cache.test.php    | 36 +++++++++++++++++++
 3 files changed, 39 insertions(+)

diff --git a/cake/libs/view/helpers/cache.php b/cake/libs/view/helpers/cache.php
index adea15cc5..52ebd75b9 100644
--- a/cake/libs/view/helpers/cache.php
+++ b/cake/libs/view/helpers/cache.php
@@ -233,6 +233,7 @@ class CacheHelper extends AppHelper {
 				$controller->params = $this->params = unserialize(stripslashes(\'' . addslashes(serialize($this->params)) . '\'));
 				$controller->action = $this->action = unserialize(\'' . serialize($this->action) . '\');
 				$controller->data = $this->data = unserialize(stripslashes(\'' . addslashes(serialize($this->data)) . '\'));
+				$controller->viewVars = $this->viewVars = unserialize(stripslashes(\'' . addslashes(serialize($this->viewVars)) . '\'));
 				$controller->theme = $this->theme = \'' . $this->theme . '\';
 				Router::setRequestInfo(array($this->params, array(\'base\' => $this->base, \'webroot\' => $this->webroot)));';
 
@@ -253,6 +254,7 @@ class CacheHelper extends AppHelper {
 					$this->loaded[$camelBackedHelper] =& ${$camelBackedHelper};
 					$this->{$helper} =& $loadedHelpers[$helper];
 				}
+				extract($this->viewVars, EXTR_SKIP);
 		?>';
 		$content = preg_replace("/(<\\?xml)/", "<?php echo '$1';?>",$content);
 		$file .= $content;
diff --git a/cake/libs/view/view.php b/cake/libs/view/view.php
index fd1999e9a..dbf7b5f9b 100644
--- a/cake/libs/view/view.php
+++ b/cake/libs/view/view.php
@@ -751,6 +751,7 @@ class View extends Object {
 				$cache->controllerName = $this->name;
 				$cache->layout = $this->layout;
 				$cache->cacheAction = $this->cacheAction;
+				$cache->viewVars = $this->viewVars;
 				$cache->cache($___viewFn, $out, $cached);
 			}
 		}
diff --git a/cake/tests/cases/libs/view/helpers/cache.test.php b/cake/tests/cases/libs/view/helpers/cache.test.php
index 3a42ec0fa..d2d6b43ee 100644
--- a/cake/tests/cases/libs/view/helpers/cache.test.php
+++ b/cake/tests/cases/libs/view/helpers/cache.test.php
@@ -308,6 +308,42 @@ class CacheHelperTest extends CakeTestCase {
 		$this->assertPattern('/7\. layout after content and after element with no cache tags/', $contents);
 	}
 
+/**
+ * test cache of view vars
+ *
+ * @access public
+ * @return void
+ */
+	function testCacheViewVars() {
+		$this->Controller->cache_parsing();
+		$this->Controller->params = array(
+			'controller' => 'cache_test',
+			'action' => 'cache_parsing',
+			'url' => array(),
+			'pass' => array(),
+			'named' => array()
+		);
+		$this->Controller->cacheAction = 21600;
+		$this->Controller->here = '/cacheTest/cache_parsing';
+		$this->Controller->action = 'cache_parsing';
+
+		$View = new View($this->Controller);
+		$result = $View->render('index');
+		$this->assertNoPattern('/cake:nocache/', $result);
+		$this->assertNoPattern('/php echo/', $result);
+
+		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
+		$this->assertTrue(file_exists($filename));
+
+		$contents = file_get_contents($filename);
+		$this->assertPattern('/\$this\-\>viewVars.*variable/', $contents);
+		$this->assertPattern('/extract\(\$this\-\>viewVars, EXTR_SKIP\);/', $contents);
+		$this->assertPattern('/php echo \$variable/', $contents);
+		$this->assertPattern('/variableValue/', $contents);
+
+		@unlink($filename);
+	}
+
 /**
  * test cacheAction set to a boolean
  *