Как стать автором
Обновить
0
0
0biwan @crYpt

Пользователь

Отправить сообщение
терроризм :(
поправка — телепортация масс беженцев и незаконных мигрантов :)
При использовании вашего плагина для наследования шаблонов обнаружил несколько проблем:
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 будет выведено:
child

child


Следующий код позволяет решить эту проблему:

плагины:
<?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 и при закрывающем)
Класс! С помощь вашего метода можно реализовать аспектно-ориентированный подход для Javascript.
2

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность