Fix for #1 - incorrect context for partials.

Partials now receive a flattened version of the parent context, including a cloned Mustache instance (if the root context is a Mustache instance). There may be issues with cloning, for example: if a pragma is enabled in the parent template, partials might also inherit the pragma.
Added (basic) test case for partials.
This commit is contained in:
Justin Hileman
2010-05-16 15:04:22 -04:00
parent df36b205c1
commit 2c3984a604
4 changed files with 60 additions and 3 deletions
+42 -3
View File
@@ -424,7 +424,7 @@ class Mustache {
* @return string
*/
protected function _renderPartial($tag_name, &$context) {
$view = new self($this->_getPartial($tag_name), $context, $this->_partials);
$view = new self($this->_getPartial($tag_name), $this->_flattenContext($context), $this->_partials);
$view->_otag = $this->_otag;
$view->_ctag = $this->_ctag;
return $view->render();
@@ -458,8 +458,8 @@ class Mustache {
*
* @access protected
* @param array $context
* @param mixed $local_context
* @return void
* @param array $local_context
* @return array
*/
protected function _getContext(&$context, &$local_context) {
$ret = array();
@@ -470,6 +470,45 @@ class Mustache {
return $ret;
}
/**
* Prepare a new (flattened) context.
*
* This is used to create a view object or array for rendering partials.
*
* @access protected
* @param array &$context
* @return array
* @throws MustacheException
*/
protected function _flattenContext(&$context) {
$keys = array_keys($context);
$first = $context[$keys[0]];
if ($first instanceof Mustache) {
$ret = clone $first;
unset($keys[0]);
foreach ($keys as $name) {
foreach ($context[$name] as $key => $val) {
$ret->$key =& $val;
}
}
} else if (is_array($first)) {
$ret = array();
foreach ($keys as $name) {
foreach ($context[$name] as $key => $val) {
$ret[$key] =& $val;
}
}
} else {
throw new MustacheException('Unknown root context type.');
}
return $ret;
}
/**
* Get a variable from the context array.
*