Как сделать аналог Blitz::fetch для PHP-native шблона ?

pilot911

Новичок
Как сделать аналог Blitz::fetch для PHP-native шаблона ?

Собственно, сабж заключен в названии вопроса.

-~{}~ 04.04.10 12:31:

столько просмотров и ни одного варианта ?
 

nerezus

Вселенский отказник
Оно?

Zend_View_Abstract

PHP:
    /**
     * Processes a view script and returns the output.
     *
     * @param string $name The script name to process.
     * @return string The script output.
     */
    public function render($name)
    {
        // find the script file name using the parent private method
        $this->_file = $this->_script($name);
        unset($name); // remove $name from local scope

        ob_start();
        $this->_run($this->_file);

        return $this->_filter(ob_get_clean()); // filter output
    }
 

pilot911

Новичок
спасибо за вариант, не совсем его понял, можно раскрыть подробнее ?

стоит осветить проблему

в Blitz у нас есть понятие контекста, или блока, вложенного блока и тд, например

PHP:
{{BLOCK aaaa}}

     {{BLOCK bbbb}}


     {{END}}

{{END}}

имеем 2 контекста - это /aaaa/ и /aaaa/bbbb/

я могу обратиться к шаблонизатору и извлечь, например, не весь шаблон, а лишь содержимое вложенного блока ( /aaaa/bbbb/ )


как это сделать в нативном шаблоне - пока не представляю.. ведь там все идет сплошным кодом, верно?

может быть, выход состоит в разбиении шаблона на функции, когда вложенный контекст - это вложенная функция ?
 

HraKK

Мудак
Команда форума
ну так же и делай, в чем проблема? /aaaaa/bbbb/ делай отдельным шаблоном и выполняй.
 

AmdY

Пью пиво
Команда форума
Автор оригинала: nerezus
PHP:
    /**
     * Processes a view script and returns the output.
     *
     * @param string $name The script name to process.
     * @return string The script output.
     */
    public function render()
    {
        // find the script file name using the parent private method
        $this->_file = $this->_script(func_get_arg(0));
        ob_start();
        $this->_run($this->_file);
        return $this->_filter(ob_get_clean()); // filter output
    }
ну и код же генерят в зенде, показал как убрать $name
 

HraKK

Мудак
Команда форума
Показал как не надо делать, молодец.
 

pilot911

Новичок
решать проблему двумя шаблонами некомильфо, хочется решения пооптимальнее ибо реализовавать этот вариант для трех-четырех и более вложений будет сущим испытанием

сейчас я автоматически парсю блоки {{BEGIN aaaa}}{{END}} в отдельные функции и записываю их в php файл

но для плоского нативного пхп-шаблона это не подходит
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ну, шаблонизаторы для этого и придумали, ага.
 

fixxxer

К.О.
Партнер клуба
ну можно чота в этом духе
PHP:
class _Template_6987698769 {
    private $vars = array(),
               $context_stack = array( array('/' => $this->vars) );

    private $blocks_map = array(
        '/' => 'block1',
        '/A' => 'block2',
        '/A/B' => 'block3',
        '/C' => 'block4',
    );

    protected function block1() {
        return 'texttext' . $this->getContextVar('var_name') 
            . $this->iterate('A') . $this->iterate('C') ....
    }

    protected function iterate($block) {
        $this->pushContext($block);
        $this->{$this->blocks_map[$block]}();
        $this->popContext();
    }

    public function fetch($item = '/') {
        return $this->iterate($item);
    }

}
 

HraKK

Мудак
Команда форума
AmdY
потому что добавляет неопределенное поведение.
 

Fortop

Новичок
решать проблему двумя шаблонами некомильфо, хочется решения пооптимальнее ибо реализовавать этот вариант для трех-четырех и более вложений будет сущим испытанием
Не будет.
Впрочем, на практике, и вложенности глубже 3-4 не будет, а в большинстве случаев обойдется 2мя + layout(который тоже шаблон) т.е. 3.
 

AmdY

Пью пиво
Команда форума
HraKK
а unset переменной со входа, это не добавляет неопределенности? p.s. Подумал и решил, что действительно HraKK прав, с исчезающим $name лучше.

Fortop можно клонировать шаблонизатор, очищая переменные и задавая новые.
 

Fortop

Новичок
AmdY
? в смысле? :)

http://www.php.ru/forum/viewtopic.php?p=200670#200670
3й блок кода.
Если шаблонизатор легкий - то очень удобно работать так.

В случае с Zend, конечно, все сложнее. View там грузоемкий.
 
Сверху