Глава 6. Пользовательские методы

Возможность включать в шаблон пользовательские методы - самая интересная с точки зрения организации хорошего и удобно читаемого кода. До сих пор в примерах использовался стандартный класс Blitz, никакими новыми методами не обладающий. Однако если создать объект класса-наследника Blitz, который предоставляет некоторый метод my_test, в шаблоне можно использовать вызов этого метода ровно с таким же названием.

Пример 6.1. Вызов пользовательского метода

пример вызова пользовательского метода: {{ my_test }}
<?

class BlitzTemplate extends Blitz {
    function my_test() {
        return 'user method called ('.__CLASS__.','.__LINE__.')';
    }
}

$T = new BlitzTemplate('tpl');
echo $T->parse();

?>
пример вызова пользовательского метода: user method called (blitztemplate,5)

Все, что возвращает пользовательский метод, будет конвертировано в строку и подставлено вместо вызова. Если вызов метода в шаблоне есть, но самого метода нет - будет подставлена пустая строка. Вообще, действует обычное правило: никаких исходных вызовов никогда не присутствует в конечном результате, независимо от существования переменной, метода и проч.

Внутри пользовательского метода также можно включать другие шаблоны. Конечно, никто не запрещает вам написать что-нибудь вроде:

class BlitzTemplate extends Blitz {
    var $data;
    var $TItem;
    function BlitzTemplate($t,$titem) {
        parent::Blitz($t);
        $TItem = new Blitz($titem);
    }

    function set_data() {
        // some code
    }

    function my_test() {
        $result = '';
        foreach ($this->data as $i_data) {
            $result .= $TItem->parse($i_data);
        }
        return $result;
    }
}

$T = new BlitzTemplate('main.tpl','item.tpl');
// $bla_bla = ...
$T->set_data($blabla);
echo $T->parse();

Этот метод будет работать, но не очень хорош по двум причинам. Во-первых, $TItem является совершенно отдельным объектом, никак не связанным с $T. Blitzу несколько сложнее переключаться с одного объекта на другой, нежели выполнять все операции через один и тот же объект. Во-вторых, $TItem не будет наследовать установленные переменные из $T, их при необходимости нужно будет протягивать самостоятельно, а также внутри $TItem нельзя использовать методы $T. Поэтому более правильным будет использование встроенного метода include().

Начиная с версии 0.3 в Blitz поддерживается передача параметров из шаблона в пользовательский метод.

Пример 6.2. Передача параметров из шаблона в пользовательский метод

calling template with arguments: {{ my_test(134,$x,"hello,world!",$dummy) }}
<?

class BlitzTemplate extends Blitz {
    var $titem;

    function BlitzTemplate($t) {
        parent::Blitz($t);
        $this->set(array('x' => 1234));
    }

    function my_test($p1,$p2,$p3,$p4) {
        $result = 'user method called ('.__CLASS__.','.__LINE__.')'."\n";
        $result .= 'parameters are:'."\n";
        $result .= '1:'.var_export($p1,TRUE)."\n";
        $result .= '2:'.var_export($p2,TRUE)."\n";
        $result .= '3:'.var_export($p3,TRUE)."\n";
        $result .= '4:'.var_export($p4,TRUE)."\n";
        return $result;
    }
}

$T = new BlitzTemplate('tpl');
echo $T->parse();

?>
calling template with arguments: user method called (blitztemplate,12)
parameters are:
1:134
2:1234
3:'hello,world!'
4:NULL