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