Просмотр поста

.
L!MP

Теперь по пробуем сделать наш шаблонизатор ещё функциональнее и удобнее.
Во время разработки интерфейса сайта у нас, так или иначе, будут появлятся многократно используемые участки кода/разметки. Это может быть форматированием текста, выводом пагинации и т.д.
Часто, все эти моменты оформляются в виде отдельных вспомогательных функций или классов, мы же пойдём другим путём и заложим в наш шаблонизатор немного расширяемости с помощью макросов.

Возвращаемся к 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>


... запускаем скрипт что бы увидить результат.
Прикрепленные файлы: