Последнее время на меня валится большое количество шаблонных проектов и становится скучно. Приходится развлекаться на стороне =)
Сразу оговорюсь - подключение к битриксу шаблонизатора это скорее теоретические изыскание, на практике нигде не применял, поэтому особенно интересно мнение сообщества - какие вы видите в этом плюсы и минусы. Также цель поста - попиарить проект
[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> |