N1 Nex1on

Головний шаблон сайту на тегах

Рамка кожної сторінки без PHP: звичайна розмітка й теги шапки, меню, вмісту, колонки та підвалу.

Оновлено 20.10.2026

Головний шаблон — рамка кожної сторінки: шапка, меню, місце для вмісту, бічна колонка й підвал. Покладіть файл layouts/main.tpl.html у views/ своєї теми (themes/НАЗВА/views/layouts/main.tpl.html), і сторінка будується за ним. Файлу немає або він зламаний — працює звичайний вигляд, сайт не ламається. Голова сторінки, скрипти рушія й кнопка «нагору» лишаються від рушія: стилі та шрифти підключайте через theme.json і assets.

Готовий зразок: шапка, меню, колонка, підвал

HTML
<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.

Чи допомогла ця стаття?
На цій сторінці