Pull to refresh

MACRO — гибкий PHP шаблонизатор, с человеческим «лицом»

PHP *
Раз уж сегодня на хабре день РНР шаблонизаторов, то не могу не рассказать о MACRO — наиболее гибком шаблонизаторе с читаемыми шаблонами, среди известных мне.

Причина его создания проста — используемый нами в то время WACT, становился все более монструозным. Подробнее о причинах и первоначальной идее можно прочитать у нас на форуме.

Основные «фишки»


Гибкость


Внутри можно легко использовать обычные php-вставки, а сам шаблонизатор содержит очень небольшой набор правил своего использования. Это дает нам очень гибкий инструмент, с поддержкой, как pull, так и push доступа к данным.

Высокий реюз шаблонов


Мощные средства для компоновки шаблонов: обворачивание(wrap), включение(include), переиспользование(apply) в рамках одного и того же шаблона. Примеры шаблонной магии можно посмотреть в вики проекта. Благодаря использованию MACRO, нам удалось полностью избавиться от дублирования в шаблонах.

Скорость


Код первоначального шаблона сначала переводится в готовый к запуску php-скрипт, причем шаблон компилируется целиком, поэтому композиция (разбиение шаблона на части, обворачивание и т.д. ) почти никак не влияет на скорость исполнения шаблона, так как он собирается в одно целое(класс) при компиляции, а область видимости(контекст) организуется с помощью методов скомпилированного класса. То есть большинство «тяжелых» операций либо выполняются на стадии компиляции, либо используют встроенные в РНР средства, что позволило добиться хороших «скоростных» показателей.

Расширяемость


Легкость добавления своих тегов и своих фильтров. А также возможность создавать целые пакеты со своими тегами или фильтрами.

Модифицируемость


Гибкость настраивания и легкость допиливания достигается за счет низкого связанности компонентов и адекватного ООП.

Читаемость


Шаблоны, несмотря на всю гибкость, нормально читаются непрограммистами, после их неглубокого зомбирования.

Немного дегтя


MACRO по сути является syntactic sugar для нативного РНР. И если вы не платите верстальщику зарплату уже три месяца, то он вполне может загубить весь сайт, имея доступ только к шаблонам.

Show me the code!


Пример шаблона:
{{insert into="content_zone" file="page.phtml"}}
<img src={$#photo.largeFileUrl} />
<dl>
<dt>Автор:</dt><dd>{$#photo.member.name}</dd>
<dt>Категория:</dt><dd>{$#photo.category.title}</dd>
<dt>Название:</dt><dd>{$#photo.title}</dd>
<dt>Теги:</dt>
<dd>
{{list using='{$#photo.tags}' as='$tag'}}
 <ul>
 {{list:item}}
  <li>{$tag.title|uppercase}</li>
 {{/list:item}}
 </ul>
 {{list:default}}
 Нет тегов
 {{/list:default}} 
{{/list}}
</dd>
{{insert file="photo/marks.phtml"/}}
</dl>
{{/insert}}


* This source code was highlighted with Source Code Highlighter.


Тэги


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

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

Выражения


Выражения (output expressions) используются для вывода каких-либо значений переменных. Выражения в нашем примере, это {$tag.title|uppercase} и {$#photo.largeFileUrl}. Выражения, стоящие в шаблонах — это по сути операции echo. Точкой разделяются части пути до выводимой переменной. Выражение {$tag.title} эквивалентно <?php if(isset($tag['title'])) echo $tag['title']; ?>.

Подробно выражения описаны в разделе "Выражения".

Фильтры


Фильтры используются для модификации/форматирования значений, выводимых в выражениях. Выражения с фильтрами в нашем примере, это {$tag.title|uppercase}. Фильтр uppercase — переводит значения в верхний регистр. По-сути это алиас на php-функцию strtoupper, которая применяется для переменной, указанной в выражении.

Обычно фильтр представляет из себя враппер для какой-нибудь часто используемой функции php. Однако, ничего не мешает создавать свои уникальные фильтры, так как делать это достаточно просто. Например, несколько дней назад мне довелось добавить фильтр склоняющий существительные в зависимости от числа (1 человек, 2 человека и далее).

Немного о скорости


Разрабатывать шаблонизатор с прицелом на высокую скорость не имеет смысла без набора тестов. Если кратко, то на верстке, близкой к «боевой», MACRO медленнее чистого РНР в 1,75 раза, но быстрее ближайшего «человеческого» шаблонизатора (smarty) на треть.

Подробные результаты тестов можно посмотреть(и скачать) на соответствующей странице.

Tags:
Hubs:
Total votes 48: ↑35 and ↓13 +22
Views 2.4K
Comments Comments 96