Расширения для Tags

Эта справка служит помочь понять некоторые аспекты шаблонизатора. И в первую очередь тем, как расширить его функциональность.

Переменные

Обычные (${some}) и локальные (%{some}) переменные можно расширить двумя способами: 1) типами; 2) модифицировав переменные. Для этого достаточно создать PHP-файл в директории ext с функцией со специальным префиксом. Для типов это префикс type, для модиикации переменных - var.

Добавляем тип

function type_bold($var, $value){
    return '<b>'.$value.'</b>';
}

$var = 'Test';
$text = 'Is a simple $bold{var}.';

// Is a simple <b>Test</b>.
print_r(tags::parse($text));

Первый параметр функции type_bold() $var это название переменной. Второй - $value - значение этой переменной.

Добавляем модификатор переменной

function var_array($var, $value){
    return '<b>'.$var.'</b>';
}

$array = array(
    'key1' => 'Value #1',
    'key2' => 'Value #2',
    'key3' => 'Value #3',
);
$text = 'Is a simple ${array.key2}.';

// Is a simple <b>key2</b>.
print_r(tags::parse($text));

Первый параметр функции var_array() $var это текущее значение переменной. Второй - $value - новое значение переменной, то есть заданное в шаблоне. Если значение не задано $value является null. Кстати да, по этой причине его можно не задавать как параметр функции.

Устанавливаемая переменная ничего не возвращает.

function var_array($var, $value){
    // $value == Boo, но return бессмысленен
    return '<b>'.$value.'</b>';
}

$array = array(
    'key1' => 'Value #1',
    'key2' => 'Value #2',
    'key3' => 'Value #3',
);
$text = 'Is a simple ${array.key2 = Boo}.';

// Is a simple .
print_r(tags::parse($text));

Можно обрабатывать переменные со спец. символами в названии.

function var__at_array($var){
    return '<b>at '.$var.'</b>';
}

b::l('@array', array(
    'key1' => 'Value #1',
    'key2' => 'Value #2',
    'key3' => 'Value #3',
));
$text = 'Is a simple ${@array.key2}.';

// Is a simple <b>at key2</b>.
print_r(tags::parse($text));

Спец. символы

Знак Слово Название
& _ampersand_ Амперсанд.
@ _at_ Собака.
* _asterisk_ Звёздочка.
^ _caret_ Циркумфлекс.
# _octothorp_ Решётка.
$ _dollar_ Знак доллара.
% _percent_ Знак процента.
/ _slash_ Слеш.
\ _backslash_ Обратный слеш.
. _dot_ Точка.

Теги

Помимо обычных тегов, существуют контейнеры и супер-дупер теги. Контейнеры обрабатываются шаблонизатором, но своё содержания парсят сами. Супер-дупер теги не обрабатываются шаблонизатором в полном обьёме и парсятся сразу же после переменных, то есть вторыми, затем парсятся аттрибуты, после обычные и контейнеры. Пример ниже полезность супер-дупер тегов не передаёт, но она есть, да.

Пример

// Обычный тег
function tag_simple($attr){
    return 'simple [attr param: '.$attr['param'].']';
}

// Контейнер
function container_priority($attr){
    $array = array(
        'key1' => 'Value #1',
        'key2' => 'Value #2',
        'key3' => 'Value #3',
    );

    return tags::parse_lvars($attr, $array);
}

// Супер-дупер тег
function supadupa_somepupertag($attr){
    return $attr['#text'];
}

$text = '
    Simple: <simple param="one" />.
    Priority: <priority><simple param="%{priority.key2}" /></priority>.
    Supadupa: <somepupertag><simple param="two" /></somepupertag>.
';

print_r(tags::parse($text));

/* Simple: simple [attr param: one].
Priority: simple [attr param: Value #2].
Supadupa: simple [attr param: two]. */

Аттрибуты

У каждого тега может быть атрибут. Вот эти аттрибуты и можно добавлять или заменять стандартные. У супер-дупер тегов аттрибуты не подменяются.

Пример

function attr_param($attr){
    if ($attr['param'] == 1)
        $attr['newparam'] = 'New';

    return $attr;
}

$text = 'Test <b param="1">attribute</b>. Test <i param="2">attribute</i>.';

// // Test <b param="1" newparam="New">attribute</b>. Test <i param="2">attribute</i>.
print_r(tags::parse($text));

Если в расширении аттрибута задать ключ #skip, то шаблонизатор вырежит тег и его содержание.

function attr_param($attr){
    if ($attr['param'] == 1)
        $attr['#skip'] = true;

    return $attr;
}

$text = 'Test <b param="1">attribute</b>. Test <i param="2">attribute</i>.';

// // Test . Test <i param="2">attribute</i>.
print_r(tags::parse($text));

А если тип #skip будет отличным от буливого (true/false), то шаблонизатор заменит тег и его содержание #skip.

function attr_param($attr){
    if ($attr['param'] == 1)
        $attr['#skip'] = '[skipped]';

    return $attr;
}

$text = 'Test <b param="1">attribute</b>. Test <i param="2">attribute</i>.';

// // Test [skipped]. Test <i param="2">attribute</i>.
print_r(tags::parse($text));