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.
This commit is contained in:
Justin Hileman
2013-03-12 16:03:58 -07:00
parent 72007e65b4
commit ca44ef68f8
2 changed files with 36 additions and 5 deletions
+12 -4
View File
@@ -226,7 +226,7 @@ class Mustache_Engine
public function getPartialsLoader() public function getPartialsLoader()
{ {
if (!isset($this->partialsLoader)) { if (!isset($this->partialsLoader)) {
$this->partialsLoader = $this->getLoader(); $this->partialsLoader = new Mustache_Loader_ArrayLoader;
} }
return $this->partialsLoader; return $this->partialsLoader;
@@ -492,13 +492,21 @@ class Mustache_Engine
public function loadPartial($name) public function loadPartial($name)
{ {
try { try {
return $this->loadSource($this->getPartialsLoader()->load($name)); if (isset($this->partialsLoader)) {
} catch (InvalidArgumentException $e) { $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. // If the named partial cannot be found, log then return null.
$this->log( $this->log(
Mustache_Logger::WARNING, Mustache_Logger::WARNING,
'Partial not found: "{name}"', 'Partial not found: "{name}"',
array('name' => $name) array('name' => $e->getTemplateName())
); );
} }
} }
+24 -1
View File
@@ -104,7 +104,7 @@ class Mustache_Test_EngineTest extends PHPUnit_Framework_TestCase
$mustache->setLoader($loader); $mustache->setLoader($loader);
$this->assertSame($loader, $mustache->getLoader()); $this->assertSame($loader, $mustache->getLoader());
$this->assertSame($loader, $mustache->getPartialsLoader()); $this->assertNotSame($loader, $mustache->getPartialsLoader());
$mustache->setPartialsLoader($loader); $mustache->setPartialsLoader($loader);
$this->assertSame($loader, $mustache->getPartialsLoader()); $this->assertSame($loader, $mustache->getPartialsLoader());
@@ -240,6 +240,29 @@ class Mustache_Test_EngineTest extends PHPUnit_Framework_TestCase
$mustache->setLogger(new StdClass); $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() public function testPartialLoadFailLogging()
{ {
$name = tempnam(sys_get_temp_dir(), 'mustache-test'); $name = tempnam(sys_get_temp_dir(), 'mustache-test');