При использовании вашего плагина для наследования шаблонов обнаружил несколько проблем:
1. базовый шаблон загружается дважды (при открывающем теге extends и при закрывающем)
2. если вставляю два наследуемых блока, а внутренний блок расширяю только для одного, то для второго будет подставлено содержимое первого вставленного блока. напрмер:
При использовании вашего плагина для наследования шаблонов обнаружил несколько проблем:
1. базовый шаблон загружается дважды (при открывающем теге extends и при закрывающем)
1. базовый шаблон загружается дважды (при открывающем теге extends и при закрывающем)
2. если вставляю два наследуемых блока, а внутренний блок расширяю только для одного, то для второго будет подставлено содержимое первого вставленного блока. напрмер:
a.tpl ---- {block name=head}parent{/block} ---- b.tpl ---- {extends template="a.tpl"} {block name="head"}child{/block} {/extends} {extends template="a.tpl"}{/extends} ---при отображении b.tpl будет выведено:
Следующий код позволяет решить эту проблему:
плагины:
<?php function smarty_block_block($params, $content, $smarty) { if ( !array_key_exists('name', $params) ) { $smarty->trigger_error('Block name is not set'); } $name = $params['name']; if ( !$smarty->isBlockSet($name) && !is_null($content) ) { $smarty->setBlock($name, $content); } if ( !is_null($content) ) { return $smarty->getBlock($name); } } ?> <?php function smarty_block_extends($params, $content, $smarty) { if ( !array_key_exists('template', $params) ) { $smarty->trigger_error('Plese set extending template name!'); } // if open tag if ( is_null($content) ) { $smarty->openBlocksScope(); } else { $content = $smarty->fetch($params['template']); $smarty->closeBlocksScope(); return $content; } return ''; } ?>поля и методы класса SmartyX (extends Smarty)
protected $_blocks = array(array()); protected $_blocksScope = 0; ... public function openBlocksScope() { $this->_blocksScope++; $this->_blocks[$this->_blocksScope] = array(); } public function closeBlocksScope() { if ( $this->_blocksScope > 0 ) { $this->_blocks[$this->_blocksScope] = array(); $this->_blocksScope--; } } public function isBlockSet($key) { return array_key_exists($key, $this->_blocks[$this->_blocksScope]) !== false; } public function setBlock($key, $value) { $this->_blocks[$this->_blocksScope][$key] = $value; } public function getBlock($key) { if (array_key_exists($key, $this->_blocks[$this->_blocksScope])) { return $this->_blocks[$this->_blocksScope][$key]; } return ''; }1. базовый шаблон загружается дважды (при открывающем теге extends и при закрывающем)