From ca44ef68f8d2b232bf5c0ef4d598462d6ac92c98 Mon Sep 17 00:00:00 2001 From: Justin Hileman Date: Tue, 12 Mar 2013 15:52:42 -0700 Subject: [PATCH] Move loader cascading into the loadPartial method. This means the `partialsLoader` property is never set to the default loader, fixing things like `setPartials`, but template loading cascades as per the spec. Add test coverage for partial cascading. --- src/Mustache/Engine.php | 16 ++++++++++++---- test/Mustache/Test/EngineTest.php | 25 ++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/Mustache/Engine.php b/src/Mustache/Engine.php index fd2fb05..2f61f58 100644 --- a/src/Mustache/Engine.php +++ b/src/Mustache/Engine.php @@ -226,7 +226,7 @@ class Mustache_Engine public function getPartialsLoader() { if (!isset($this->partialsLoader)) { - $this->partialsLoader = $this->getLoader(); + $this->partialsLoader = new Mustache_Loader_ArrayLoader; } return $this->partialsLoader; @@ -492,13 +492,21 @@ class Mustache_Engine public function loadPartial($name) { try { - return $this->loadSource($this->getPartialsLoader()->load($name)); - } catch (InvalidArgumentException $e) { + if (isset($this->partialsLoader)) { + $loader = $this->partialsLoader; + } elseif (isset($this->loader) && !$this->loader instanceof Mustache_Loader_StringLoader) { + $loader = $this->loader; + } else { + throw new Mustache_Exception_UnknownTemplateException($name); + } + + return $this->loadSource($loader->load($name)); + } catch (Mustache_Exception_UnknownTemplateException $e) { // If the named partial cannot be found, log then return null. $this->log( Mustache_Logger::WARNING, 'Partial not found: "{name}"', - array('name' => $name) + array('name' => $e->getTemplateName()) ); } } diff --git a/test/Mustache/Test/EngineTest.php b/test/Mustache/Test/EngineTest.php index 8149b13..5c00821 100644 --- a/test/Mustache/Test/EngineTest.php +++ b/test/Mustache/Test/EngineTest.php @@ -104,7 +104,7 @@ class Mustache_Test_EngineTest extends PHPUnit_Framework_TestCase $mustache->setLoader($loader); $this->assertSame($loader, $mustache->getLoader()); - $this->assertSame($loader, $mustache->getPartialsLoader()); + $this->assertNotSame($loader, $mustache->getPartialsLoader()); $mustache->setPartialsLoader($loader); $this->assertSame($loader, $mustache->getPartialsLoader()); @@ -240,6 +240,29 @@ class Mustache_Test_EngineTest extends PHPUnit_Framework_TestCase $mustache->setLogger(new StdClass); } + public function testLoadPartialCascading() + { + $loader = new Mustache_Loader_ArrayLoader(array( + 'foo' => 'FOO', + )); + + $mustache = new Mustache_Engine(array('loader' => $loader)); + + $tpl = $mustache->loadTemplate('foo'); + + $this->assertSame($tpl, $mustache->loadPartial('foo')); + + $mustache->setPartials(array( + 'foo' => 'f00', + )); + + // setting partials overrides the default template loading fallback. + $this->assertNotSame($tpl, $mustache->loadPartial('foo')); + + // but it didn't overwrite the original template loader templates. + $this->assertSame($tpl, $mustache->loadTemplate('foo')); + } + public function testPartialLoadFailLogging() { $name = tempnam(sys_get_temp_dir(), 'mustache-test');