Возможность включать в шаблон пользовательские методы - самая интересная с точки зрения организации хорошего и удобно читаемого кода. До сих пор в примерах использовался стандартный класс 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