Separate – Шаблонизатор для PHP

в 13:31, , рубрики: php, Веб-разработка, шаблонизатор, метки: ,

Представляю вашему вниманию PHP шаблонизатор, который я разрабатывал несколько лет и только недавно выложил в сеть.

Как все началось и зачем вообще нужен еще один шаблонизатор?

Smarty и другие популярные шаблонизаторы мне показались слишком громоздкими для простых проектов и я решил разработать собственный шаблонизатор. Первая версия появилась еще в 2004 году. В процессе разработки интернет проектов я постоянно внедрял новые идеи и прочие улучшения. В настояший момент движок шаблонизатора состоит из всего одного файла и все равно имеет ряд уникальных возможностей.

На сайте separate.esud.info/ вы можете скачать исходный код. Также там доступна подробная документация всех функций на трех языках – русском, английском и немецком. Я надеюсь что проект заинтересует людей и будет в будущем активно развиваться. Поэтому код я выложил в Github на сайте github.com/esud/separate

Подробное описание вы найдете на сайте ru.separate.esud.info/documentation/
Ниже я коротко опишу ключевые возможности.

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

Самое простое что есть – присвоение значений.
Шаблон (index.htm):

${MY_VARIABLE}

PHP код:

require_once './separate/SeparateTemplate.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
$t->assign('MY_VARIABLE', 'my value');
$t->display(); 

Вывод:

my value

Можно генерировать списки с динамической информацией.

Шаблон (index.htm):

<ul>
 <!-- BEGIN my_block -->
  <li>${ROW_NUMBER}</li>
 <!-- END my_block --> 
</ul>

PHP код:

require_once './separate/SeparateTemplate.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
for($row = 1; $row <= 3; $row++)
{
    $myBlock = $t->fetch('my_block');
    $myBlock->assign('ROW_NUMBER', $row);
    $t->assign('my_block', $myBlock);
}
$t->display(); 

Вывод:

<ul>
 <li>1</li>
 <li>2</li>
 <li>3</li>
</ul>

Одна из уникальных возможностей, это форматирование значений. В данном случае форматер «Time» конвертирует Unix-Timestamp значение в читаемое время.

Шаблон (index.htm):

${(Time)UNIX_TIMESTAMP}

PHP код:

require_once './separate/SeparateTemplate.php';
require_once './separate/formatter/TimeFormatter.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
$t->assign('UNIX_TIMESTAMP', time());
$t->display(); 

Вывод:

08:55

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

Шаблон (index.htm):

${(ToUpper)MY_VARIABLE} 

PHP код:

require_once './separate/SeparateTemplate.php';
class ToUpperFormatter extends AbstractValueFormatter
{
    public function formatValue($value)
    {
        return strtoupper($value);
    }
} 
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
$t->assign('MY_VARIABLE', 'my value'); 
$t->display(); 

Вывод:

MY VALUE

Кроме SeparateTemplate.assign(...) есть и другие методы присвоения значений. Например SeparateTemplate.assignForBlock(...). Этим методом можно присвоить значение к переменной, которая находится в определенном блоке (включая дальнейшие под-блоки). Переменные, находящиеся в других блоках, игнорируются. Метод SeparateTemplate.assignForGlobal(...) присваивает значения ко всем переменным, независимо от того, в каком блоке они находятся.

В основной шаблонный файл можно интегрировать дополнительные файлы, например:

Header-файл (header.htm):

<html>
 <body>

Footer-файл (footer.htm):

 </body>
</html>

Код основного шаблона (index.htm):

<!-- INCLUDE header.htm -->
 <p>Привет</p>
<!-- INCLUDE footer.htm -->

Вывод:

<html>
 <body>
  <p>Привет</p>
 </body>
</html>

В шаблонном коде также поддерживаются IF-условия:

<!-- IF '${MY_VARIABLE}' == 'hello' --> 
 HTML код...
<!-- END IF -->

С помощью параметров можно установить любые настройки в самом коде шаблона. В PHP коде все доступные параметры прочитываются методом SeparateTemplate.getParameters().

Шаблон (index.htm):

<!-- PARAMETER NUMBER_OF_ROWS '100' -->

PHP код:

require_once './separate/SeparateTemplate.php';
$t = SeparateTemplate::instance()->loadSourceFromFile('./index.htm');
print_r($t->getParameters());

Вывод:

Array
(
    [NUMBER_OF_ROWS] => 100
)

PS: Это моя первая статья на сайте habrahabr.ru. Если она вам понравилась и вы хотите поддержать распространение шаблонизатора Separate, то я буду очень рад если вы поставите ей +1. В комментах я постараюсь ответить на все ваши вопросы.

Автор: esudnik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js