Piles

Класс для работы с шаблонами.

Мне нравится HTML поэтому сделал шаблонизатор, шаблоны которого выглядят как обычный HTML, так же парсятся и так же работают. Жертва скорости (относительно, конечно) в пользу собственной удобности.

Пример шаблона

<? if ($reviews) { ?>
    <? foreach ($reviews as $review){ ?>
        <div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;">
            <b>${review.author}</b> |
            <img src="catalog/view/theme/default/image/stars_${review.rating}.png" alt="${review.stars}" /><br />
            ${review.date_added}<br /><br />
            ${review.text}
        </div>
    <? } ?>

    <div class="pagination">${pagination}</div>
<?php /* для примера */ } else { ?>
    <div style="background: #F7F7F7; border: 1px solid #DDDDDD; padding: 10px; margin-bottom: 10px;"></div>
<? } ?>

Каждый элемент — часть шаблонизатора: короткие и полные PHP-теги, обычные переменные ($review, $review['author']) и переменные в фигурных скобках (${review}, ${review.author}), теги и их атрибуты. Все вызываемые напрямую (в PHP-тегах) функции или методы будут обёрнуты в b::call(), которая подгрузит необходимые файлы — файлы хранящии сами функции.

Методы

piles::show()

Парсит шаблон. Можно указать файл (лежащий в папке mod/, ext/ или lib/, например, tag.msg.i это ext//msg/i.phtml) или текст. Вторым параметром может быть передан массив переменных видимые внутри шаблона.

Пример

function tag_my_first_tag($attr){
    return '[tag_my_first_tag] '.$attr['#text'];
}

function tag_my_second_tag($attr){
    return str_replace('[tag_my_first_tag]', '[replaced]', $attr['#text']);
}

$text = 'Some ${test} text <my_second_tag>
    and text here
    <my_first_tag>and <b>here</b> some text</my_first_tag>
</my_second_tag>.';

$vars = array('test' => 'Hello');

print_r(piles::show($text, $vars));

/* Some Hello text
    and text here
    [replaced] and <b>here</b> some text
. */

Третим параметром можно передать список доступных тегов и атрибутов.

$text = '
    Text with <b attr="work?">Bold</b>, <i style="color: red;" attr="work?">Italic</i>
    and <big attr="work?">Big</big>.
';

$allowed = array(
    'b', // разрешаем использовать тег B
    'i' => array('style'), // размерашем использовать тег I и присваивать ему атрибт style
    // '?', // так можно разрешить PHP-тег - <? тут код ?>
    // '$', // а так - переменные
);

print_r(piles::show($text, array(), $allowed));

/* Text with <b>Bold</b>, <i style="color: red; ">Italic</i>
    and &lt;big attr="work?">Big&lt;/big>. */

piles::fill()

Заполняет тег данными из массива.

Пример

$array = array(
    'param1' => 'Value #1',
    'param2' => 'Value #2'
);

// <test_tag param1="Value #1" param2="Value #2" />
print_r(piles::fill('test_tag', $array));

// или

$array = array(
    '#tag' => 'test_tag',
    'param1' => 'Value #1',
    'param2' => 'Value #2'
);

// <test_tag param1="Value #1" param2="Value #2" />
print_r(piles::fill($array));

piles::char()

Экранизатор символов.

piles::varname()

Строит переменную. Вторым параметром можно задать неймспейс.

Пример

// $key['subkey']['sussubkey']
print_r(piles::varname('key.subkey.sussubkey'));

// $_POST['field']
print_r(piles::varname('_post.field'));

// $this->vars['key']['subkey']['sussubkey']
print_r(piles::varname('key.subkey.sussubkey', '$this->vars'));

piles::name2var()

Переводит названия полей в форме к виду переменных шаблонизатора.

Пример

// form.name.sub\.name
print_r(piles::name2var('form[name][sub.name]'));

piles::var2name()

Обратное предыдущему.

Пример

// form[name][sub.name]
print_r(piles::var2name('form.name.sub\.name'));

piles::attr_group()

Получает группу атрибутов.

Пример

$array = array(
    'some' => 1,
    'pre_key1' => 2,
    'pre_key2' => 3
);

print_r(piles::attr_group('pre', $array));

/* Array
(
    [key1] => 2
    [key2] => 3
) */