From 37e6529c7b8a498b3852275e523fbd74721deade Mon Sep 17 00:00:00 2001 From: uwetews Date: Tue, 1 Sep 2015 02:10:15 +0200 Subject: [PATCH] - improvement convert template inheritance into runtime processing - bugfix {$smarty.block.parent} did always reference the root parent block https://github.com/smarty-php/smarty/issues/68 --- .../smarty_internal_runtime_block.php | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 libs/sysplugins/smarty_internal_runtime_block.php diff --git a/libs/sysplugins/smarty_internal_runtime_block.php b/libs/sysplugins/smarty_internal_runtime_block.php new file mode 100644 index 00000000..36694588 --- /dev/null +++ b/libs/sysplugins/smarty_internal_runtime_block.php @@ -0,0 +1,98 @@ +inheritanceBlocks[$block['name']][$level])) { + $block = $this->inheritanceBlocks[$block['name']][$level]; + $block['level'] = $level; + $level ++; + } + // ignore hidden block + if (isset($block['hide'])) { + return; + } + // root block function for possible parent block call + $block['root'] = $function; + if (isset($block['append'])) { + $this->callParentBlock($callerTpl, $block); + } + $block['function']($callerTpl, $block); + if (isset($block['prepend'])) { + $this->callParentBlock($callerTpl, $block); + } + } + + /** + * Call inheritance parent {block} tag + * + * @param \Smarty_Internal_Template $callerTpl template object of caller + * @param array $block block parameter + */ + public function callParentBlock(Smarty_Internal_Template $callerTpl, $block) + { + $level = isset($block['level']) ? $block['level'] : 0; + if (isset($this->inheritanceBlocks[$block['name']][$level - 1])) { + // call registered parent + $parent = $this->inheritanceBlocks[$block['name']][$level - 1]; + $parent['root'] = $block['root']; + $parent['function']($callerTpl, $parent); + } else { + // default to root block + $block['root']($callerTpl, $block); + } + } + + /** + * Call inheritance child {block} tag + * + * @param \Smarty_Internal_Template $callerTpl template object of caller + * @param array $block block parameter + */ + public function callChildBlock(Smarty_Internal_Template $callerTpl, $block) + { + $level = isset($block['level']) ? $block['level'] : - 1; + if (isset($this->inheritanceBlocks[$block['name']][$level + 1])) { + $child = $this->inheritanceBlocks[$block['name']][$level + 1]; + $child['level'] = $level + 1; + $child['function']($callerTpl, $child); + } + } + + /** + * Register inheritance {block} tag + * + * @param \Smarty_Internal_Template $callerTpl template object of caller + * @param array $block block parameter + */ + public function registerBlock(Smarty_Internal_Template $callerTpl, $block) + { + if (!isset($this->inheritanceBlocks[$block['name']])) { + $this->inheritanceBlocks[$block['name']][0] = $block; + } else { + array_unshift($this->inheritanceBlocks[$block['name']], $block); + } + } +} \ No newline at end of file