Pull to refresh

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

Reading time3 min
Views16K
image
Представляю вашему вниманию 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. В комментах я постараюсь ответить на все ваши вопросы.
Tags:
Hubs:
Total votes 97: ↑42 and ↓55-13
Comments95

Articles