Вся вёрстка проекта живёт в каталоге templates/,
разложенная по именованным группам. Группа — это полный набор
.htm-файлов витрины: одна группа даёт один внешний вид.
Дополнительные группы заводят под мобильную версию, альтернативный
дизайн, отдельное оформление партнёрского раздела.
Этот раздел — про то, как устроены файлы шаблонов, как группы наследуют друг друга и как переключить группу из кода. Как модуль работает с шаблонами изнутри — в разделе «Методы шаблонизатора».
Шаблоны хранятся в каталоге templates/ в корне проекта.
Внутри находятся именованные группы шаблонов:
templates/
default/
units/
melbis_base_page/
main.htm
page_index.htm
page_goods.htm
page_404.htm
melbis_store_card/
main.htm
melbis_cataloge/
main.htm
Каждый модуль имеет собственный подкаталог внутри
units/, в котором хранятся все его
.htm-шаблоны. Внутри одного модуля может быть произвольное
количество шаблонов — они загружаются методами Tpl* по
имени файла без расширения.
По умолчанию используется группа default. После создания
новой группы она автоматически появится в дереве каждого модуля в
IDE.
Активная группа задаётся в config.json (параметр
MELBIS_TEMPLATE) или через диалог «Проектирование →
Инсталляция» — об этом подробно рассказано в разделе
«Конфигурация». Это значение действует, пока проект не переключит группу
из кода.
Дополнительная группа редко отличается от default
целиком — обычно это те же шаблоны с небольшими правками. Полностью
дублировать их не нужно, для этого есть два механизма.
Пустой файл наследует группу по умолчанию. Если
.htm-файл в группе пуст (или его нет), движок берёт
одноимённый файл из группы MELBIS_TEMPLATE. Пустой
templates/mobi/units/melbis_cataloge/main.htm отдаст
содержимое
templates/default/units/melbis_cataloge/main.htm. Такой
пустой файл читается как явная пометка «здесь всё как в
default» — в отличие от полной копии, про которую потом не
скажешь, есть в ней отличия или нет. Наследование одноуровневое — только
в default, не по цепочке; если файла нет ни в группе, ни в
default, сборка запишет ошибку в лог.
Мелкие различия — условием по группе. Расхождения удобно держать в одном общем файле, помечая куски условием по текущей группе:
{*TEMPLATE==default} <div class="page-wide"> {TEMPLATE*}
{*TEMPLATE==mobi} <div class="page-narrow"> {TEMPLATE*}Файл лежит в default, а mobi подтягивает
его пустым файлом-наследником; под каждой группой активна своя ветка,
потому что {TEMPLATE} разный. Так же можно ветвить по языку
— {*LANG==ru} … {LANG*}. Синтаксис условий — в разделе
«Синтаксис шаблонов».
Наследование касается только .htm: статика
(.js/.css) собирается по своей группе (см.
«Сборка статики»). Общий скрипт обычно держат один и ветвят внутри по
версии, отдав её из шаблона —
<script>var TEMPLATE = "{TEMPLATE}";</script>.
TemplateSet($mTemplate) и
TemplateGet() переключают и возвращают
активную группу шаблонов,
LanguageSet($mLang) и
LanguageGet() — язык страницы. Умолчания
для обоих берутся из config.json
(MELBIS_TEMPLATE и MELBIS_LANG).
Переключать имеет смысл в корневом скрипте, до вызова
Run — тогда выбор подействует на все модули
страницы:
MELBIS()->TemplateSet('mobile');
MELBIS()->LanguageSet('en');
MELBIS()->Run($entry_point, $entry_param);Типичный случай — выбор мобильной группы по устройству посетителя или
языка по сегменту URL. Устройство и предпочитаемый язык отдают методы
AgentDevice и AgentLanguage — см.
«Посетитель».
Читающая пара нужна в коде модуля, когда логика зависит от версии витрины или языка:
$is_mobile = ( MELBIS()->TemplateGet() == 'mobile' );
$lang = MELBIS()->LanguageGet();От текущего языка зависят и мультиязычные модификаторы
inum, inums, idate (см.
«Модификаторы»). В самих шаблонах оба значения доступны без PHP —
системными тегами {TEMPLATE} и {LANG}.
Кеш разложен по группам физически: у каждой группы свои каталоги базового и Trick-кеша. Поэтому один и тот же адрес, отданный в разных группах, в кеше не пересекается — две версии витрины могут жить на одном домене.