Последнее время на меня валится большое количество шаблонных проектов и становится скучно. Приходится развлекаться на стороне =)
Сразу оговорюсь - подключение к битриксу шаблонизатора это скорее теоретические изыскание, на практике нигде не применял, поэтому особенно интересно мнение сообщества - какие вы видите в этом плюсы и минусы. Также цель поста - попиарить проект =)
[spoiler]
Итак - начнем. Подключить шаблонизатор к битрикс довольно просто - надо задать глобальную переменную arCustomTemplateEngines и описать в ней используемые шаблонизаторы с привязкой к расширениям, в общих чертах делается это так:
$loader = new \Twig_Loader_Filesystem(array($_SERVER['DOCUMENT_ROOT']));
$GLOBALS['twig'] = new \Twig_Environment($loader,array(
'debug' => true,
));
$GLOBALS['twig']->addExtension(new \Twig_Extension_Debug());
function twigRender($templateFile, $arResult, $arParams, $arLangMessages, $templateFolder, $parentTemplateFolder, $template){
$arResult['PARAMS']=$arParams;
echo $GLOBALS['twig']->render($templateFile,$arResult);
}
|
В общих чертах, зачем это может быть нужно.
Плюсы
- Более лаконичный синтаксис, по сравнению с php-шаблонами
- Отсутствие соблазнов использовать в шаблоне выборку и обработку данных
- Расширяемость - очень легко задавать собственные функции, фильтры и даже лексемы
- Синтаксис php знают все, синтаксис twig необходимо учить
- php-шаблоны отрабатывают быстрее, но с учетом что все и так держится на кэшировании - не очень большой минус
- Битрикс поддерживает шаблонизаторы только для компонентов, шаблоны сайтов все равно останутся в php
<div class="news-list">
{%if PARAMS.DISPLAY_TOP_PAGER=="Y" %}
{{ NAV_STRING | raw }}<br>
{%endif%}
{%for item in ITEMS%}
{{ AddBitrixActions(item) }}
<p class="news-item" id="{{ GetEditAreaId(item) }}">
{% if PARAMS.DISPLAY_PICTURE != "N" and item.PREVIEW_PICTURE is iterable %}
{% if not PARAMS.HIDE_LINK_WHEN_NO_DETAIL or (item.DETAIL_TEXT and USER_HAVE_ACCESS) %}
<a href="{{ item.DETAIL_PAGE_URL }}">
{{ ResizeImageView(item.PREVIEW_PICTURE.ID,100,100,{'class':'preview_picture','alt':item.PREVIEW_PICTURE.TITLE}) | raw }}
</a>
{% else %}
{{ ResizeImageView(item.PREVIEW_PICTURE.ID,50,50,{'class':'preview_picture','alt':item.PREVIEW_PICTURE.TITLE}) | raw }}
{% endif %}
{% endif %}
{% if PARAMS.DISPLAY_DATE!="N" and item.DISPLAY_ACTIVE_FROM %}
<span class="news-date-time">{{ item.DISPLAY_ACTIVE_FROM }}</span>
{% endif %}
{% if PARAMS.DISPLAY_NAME!="N" and item.NAME %}
{% if PARAMS.HIDE_LINK_WHEN_NO_DETAIL or (item.DETAIL_TEXT and USER_HAVE_ACCESS) %}
<a href="{{ item.DETAIL_PAGE_URL }}"><b>{{ item.NAME }}</b></a><br />
{% else %}
<b>{{ item.NAME }}</b><br>
{% endif %}
{% endif %}
{% if PARAMS.DISPLAY_PREVIEW_TEXT!="N" and item.PREVIEW_TEXT %}
{{ item.PREVIEW_TEXT }}
{% endif %}
{% if PARAMS.DISPLAY_PICTURE!="N" and item.PREVIEW_PICTURE is iterable %}
<div style="clear: both;"></div>
{% endif %}
{% for property in item.DISPLAY_PROPERTIES %}
<small>
{{ property.NAME }}:
{% if(property.DISPLAY_VALUE is iterable) %}
{{ property.DISPLAY_VALUE | join(" / ") }}
{% else %}
property.DISPLAY_VALUE
{% endif %}
</small><br>
{% endfor %}
</p>
{%endfor%}
{%if PARAMS.DISPLAY_BOTTOM_PAGER=="Y"%}
{{ NAV_STRING | raw }}<br>
{%endif%}
</div>
|