Теперь по пробуем сделать наш шаблонизатор ещё функциональнее и удобнее.
Во время разработки интерфейса сайта у нас, так или иначе, будут появлятся многократно используемые участки кода/разметки. Это может быть форматированием текста, выводом пагинации и т.д.
Часто, все эти моменты оформляются в виде отдельных вспомогательных функций или классов, мы же пойдём другим путём и заложим в наш шаблонизатор немного расширяемости с помощью макросов.
Возвращаемся к Tpl.php.
Сначала изменим свойство $config добавив в массив ключ "macros" в котором мы будим сохранять зарегистрированные макросы.
protected $config = array(
'macros' => array( )
);
И реализуем методы для регистрации и вызова макросов.
public function macros( $name, Closure $lambda ) {
$this->config['macros'][ $name ] = $lambda;
}
public function __call( $name, $parameters )
{
if (isset($this->config['macros'][ $name ])) {
return call_user_func_array($this->config['macros'][ $name ], $parameters);
}
throw new Exception("Method 'Tpl::{$name}' does not exist.");
}
Откроем index.php и опробуем макросы в действии:
require './Tpl.php';
$tpl = Tpl::instance(array(
'dir' => './templates',
'ext' => 'php',
));
// регистрируем макрос "capitalize", который делает заглавной первую букву в переданной строке и красит её в красный цвет.
// действие, конечно, надуманное, макросы могут применяться и для более сложных задач.
$tpl->macros('capitalize', function($string) {
return '<b style="color:red">'. ucwords($string) . '</b>';
});
$tpl->render('welcome', array('name' => 'limp'), 'content');
echo $tpl->render('layout');
... применим макрос в шаблоне welcome.php
<center>Hello <?= $this->capitalize($this->name) ?>!</center>
... запускаем скрипт что бы увидить результат.