Головний шаблон сайту на тегах
Рамка кожної сторінки без PHP: звичайна розмітка й теги шапки, меню, вмісту, колонки та підвалу.
Головний шаблон — рамка кожної сторінки: шапка, меню, місце для вмісту, бічна колонка й підвал. Покладіть файл layouts/main.tpl.html у views/ своєї теми (themes/НАЗВА/views/layouts/main.tpl.html), і сторінка будується за ним. Файлу немає або він зламаний — працює звичайний вигляд, сайт не ламається. Голова сторінки, скрипти рушія й кнопка «нагору» лишаються від рушія: стилі та шрифти підключайте через theme.json і assets.
Готовий зразок: шапка, меню, колонка, підвал
<header class="site-head"><div class="wrap">
<a class="brand" href="{home}"><span class="brand-name">{site_name}</span></a>
{languages} {search}
[if:user.logged]<a href="{user.url}">{user.name}</a> {logout_button}[else]<a href="{user.login_url}">Увійти</a>[/if]
</div><div class="wrap"><nav class="nav">[each:menu]<a href="{item.url}">{item.title}</a>[/each]</nav></div></header>
<main id="content" class="wrap has-side">
<div>{content}</div>
<aside class="side-col region region--side">{region:sidebar}</aside>
</main>
<footer class="site-foot"><div class="wrap">© {year} {site_name}</div></footer>Класи site-head, wrap, brand, nav, has-side, side-col, site-foot — готові класи загального оформлення рушія: з ними зразок одразу виглядає як частина сайту й підлаштовується під кольори теми.
На телефоні. Колонка йде під вміст, пошук розкривається під шапкою. Меню розділів у рядку зразка на телефоні не показується; поставте в шапку тег {menu_toggle} замість рядка nav — на телефоні з’явиться кнопка «Меню», після натискання відкриється меню з розділами, а на комп’ютері меню стоїть у рядку шапки.
Що виводять теги
| Тег | Що виводить |
|---|---|
{site_name} | назва сайту з «Налаштування → Загальні» |
{home} | адреса головної |
{year} | поточний рік |
{locale} | код мови сторінки |
{canonical} | основна адреса цієї сторінки |
{theme} | адреса теки файлів теми (assets), наприклад {theme}/img/logo.svg |
{content} | вміст сторінки (запис, магазин, форум…) у контейнері рушія: не вилазить за ширину екрана, годиться для кабінету, форуму та форм |
{content_raw} | те саме без обгортки й без обмеження ширини: лише для власних повносторінкових розкладок; для кабінету, форуму та форм беріть {content} |
{languages} | вибір мови (готовий блок) |
{search} | рядок пошуку (готовий блок) |
{login} | блок «Увійти / Реєстрація» або ім’я того, хто увійшов (готовий) |
{poll} | поточне опитування сайту |
{logout_button} | кнопка «Вийти» з ключем захисту |
{menu_toggle} | кнопка «Меню» і меню розділів, що на телефоні відкривається кнопкою |
{user_menu} | меню учасника: профіль, повідомлення, панель, вихід |
{region:header} {region:before_content} {region:sidebar} {region:after_content} {region:footer} {region:head_actions} | блоки модулів, поставлені в це місце теми |
[each:menu]…[/each] | пункти меню сайту; всередині {item.title}, {item.url}, {item.active} |
Про відвідувача, що увійшов
| Тег | Що виводить |
|---|---|
[if:user.logged]…[else]…[/if] | різний текст гостю й тому, хто увійшов |
{user.name} {user.url} | ім’я та адреса профілю |
{user.avatar} | адреса аватара; порожньо, якщо аватара немає |
{user.role} | назва ролі |
{user.pm_unread} | кількість непрочитаних особистих повідомлень; порожньо, якщо модуль вимкнено |
{user.favorites_count} | кількість закладок |
{user.pm_url} {user.favorites_url} | адреси повідомлень і закладок |
{user.admin_url}, [if:user.can_admin]…[/if] | адреса панелі й умова «до панелі пускають» |
{user.login_url} {user.register_url} {user.forgot_url} | адреси входу, реєстрації, відновлення |
{user.field:ім’я} | власне поле профілю того, хто увійшов (поле заводить власник); гостю, вимкненому й неіснуючому полю — порожньо; значення екранується |
Де ми й хто прийшов
Рахуються лише ті теги, на які файл посилається: сторінка без них нічого не витрачає.
| Тег | Що виводить |
|---|---|
{page.title} {page.description} | назва й опис цієї сторінки (як у голові сторінки) |
{page.route}, [if:page.home] | ім’я маршруту сторінки й умова «це головна», наприклад [if:page.route=news.show]…[/if] |
{page.path} | адреса сторінки без домену |
[if:module.ім’я] | модуль увімкнено (будь-яке ім’я з теки modules), наприклад [if:module.shop]…[/if] |
{category.title} {category.url} {category.key} | поточна рубрика, якщо модуль її назвав |
[each:crumbs] {item.title} {item.url} [if:item.last] | хлібні крихти: «Головна» + ланцюжок модуля (або пункт меню цієї сторінки); останній пункт позначено last |
{visitor.country} | код країни відвідувача («UA»); із заголовка CDN або локальної бази адрес; порожньо, якщо невідома |
[if:visitor.mobile] [if:visitor.tablet] [if:visitor.desktop] {visitor.device} | тип пристрою за рядком браузера |
{propose_url} | посилання «Запропонувати запис»; порожньо, якщо модуль чи налаштування вимкнені |
{social_login} | готові кнопки «Увійти через …» (лише ввімкнені мережі; ключів застосунку на сторінці немає); порожньо, якщо мереж немає |
[if:social.google] {social.google.url} {social.google.title} | вхід через конкретну мережу (google, github, yandex, vk): чи ввімкнена, адреса початку входу й назва — кнопку можна поставити у власну розмітку |
[if:social.any] | чи ввімкнена хоч одна мережа |
{social_profile} | блок «Прив’язані сервіси» для кабінету: прив’язати й відв’язати за паролем; гостю порожньо |
Рубрику й ланцюжок розділів називає модуль: кладе в спільні дані вигляду ключ pageContext (category з title, url, key і crumbs — список із title та url) або додає їх фільтром theme.page_context. Береться лише власна адреса — від кореня.
Умови й повтори
[if:ім’я]…[/if] — показати, якщо значення є; [ifnot:ім’я]…[/ifnot] — якщо немає; [if:ім’я=значення]…[else]…[/if] — порівняння; [each:список]…[/each] — повтор за списком із {item}, {item.ключ}, {index}. Значення з даних сторінки доступні за ім’ям; у кожного вигляду свої.
Безпека
PHP, include і виклик функцій у файлі тегів не працюють; розмітка очищається за білим списком (без тегів script, style, iframe, обробників подій і data-*); адреси лише http(s)://, шлях від кореня й #; до посилань із шаблону рушій додає rel="noopener". Значення екрануються. Межі: 20000 знаків, 400 тегів, вкладеність 6, повторів 60.