Документація

Дані сторінок: що доступне шаблону

Змінні, що є на кожній сторінці, та те, що приходить своє на кожен розділ вітрини.

На цій сторінці

Шаблон не звертається до бази даних — магазин віддає йому готові дані. Частина з них є на кожній сторінці, частина приходить своя на кожен розділ вітрини.

Є на кожній сторінці

Змінна Що всередині
$storefront вітрина: назва, домен, мова, валюта, значок вкладки
$theme значення налаштувань теми
$action назва поточного розділу
$seo заголовок, опис і мета-теги для пошукової системи
$shop помічник зі списками магазину
$contacts контакти магазину
$customer покупець або порожньо, якщо він не увійшов
$errors помилки форми після повернення назад
$status повідомлення про успіх
$old введені значення форми після повернення назад

$storefront

{$storefront.name}            назва магазину
{$storefront.storefront_name} службова назва вітрини
{$storefront.domain}
{$storefront.locale}          поточна мова: ru
{$storefront.locales}         мови вітрини
{$storefront.default_locale}
{$storefront.currency}        валюта вітрини: UAH
{$storefront.favicon}

name — це назва магазину із загальних налаштувань, її й показують покупцеві. Службова назва вітрини лежить окремо і потрібна лише магазинам із кількома вітринами.

$theme

Значення налаштувань теми — плоско і за групами:

{$theme.copyright}          {$theme.footer.copyright}
{$theme.per_page}           {$theme.catalog.per_page}
{$theme.assets}             /theme-assets/ім'я-теми
{$theme.colors.primary}     {$theme.colors.accent}
{$theme.colors.bg}          {$theme.colors.text}

Усі поля схеми присутні, навіть незаповнені — вони приходять порожніми, і шаблон на них не падає. Подробиці — на сторінці Файл theme.json.

$action

Назва поточного розділу: default на головній, далі category, product, search, page, checkout/cart. Зручно для класу на <body> і для підсвічування активного пункту меню.

$seo

{$seo.title}        {$seo.h1}          {$seo.description}
{$seo.keywords}     {$seo.robots}      {$seo.indexable}
{$seo.canonical}    {$seo.hreflang}    {$seo.page_type}
{$seo.og.title}     {$seo.og.description} {$seo.og.type}
{$seo.og.url}       {$seo.og.image}    {$seo.og.site_name}
{$seo.og.locale}    {$seo.og.locale_alternates}
{$seo.twitter.card} {$seo.twitter.title} {$seo.twitter.description}
{$seo.twitter.image} {$seo.twitter.site}

Усі ключі присутні завжди, тому {if $seo.og.image} безпечний. Магазин рахує ці значення сам, темі залишається вивести їх у <head> — готовий шматок розмітки є на сторінці Каркас сторінки.

$contacts

{if $contacts.phone}<a href="tel:{$contacts.phone_link}">{$contacts.phone}</a>{/if}
{$contacts.name}  {$contacts.email}  {$contacts.address}

phone_link — телефон, очищений до цифр і +, готовий для href="tel:". Незаповнене поле приходить порожнім рядком, ключ на місці завжди.

$customer

Для гостя — порожньо, тому {if $customer} достатньо.

{$customer.id}          {$customer.name}       {$customer.initial}
{$customer.first_name}  {$customer.last_name}  {$customer.middle_name}
{$customer.company}     {$customer.email}      {$customer.phone}
{$customer.member_since}

$errors, $status, $old

Після форми, яку надіслали звичайним POST і яка повернулася з помилкою:

{if $status}<p class="ok">{$status}</p>{/if}

<input name="email" value="{$old.email|default:''}">
{if $errors.email}<span class="err">{$errors.email}</span>{/if}

Помилок немає — $errors порожній список. Подробиці — на сторінці Форми вітрини.

Посторінково

Дані сторінки кладуться поверх загальних і можуть перекрити будь-яку з них — не називайте свої змінні product, якщо на сторінці вже є товар.

Сторінка Шаблон Змінні
Головна home.html лише загальні: вміст збирається через $shop
Категорія category.html category, breadcrumbs, landing + набір лістингу
Товар product.html product, breadcrumbs, rec_cross, rec_up, reviews, questions
Сторінка власника page.html page, breadcrumbs
Пошук search.html query, category_id, has_query, corrected + набір лістингу
Бренд brand.html brand, breadcrumbs + набір лістингу
Усі бренди brands.html brands
Мітка tag.html tag, breadcrumbs + набір лістингу
Усі мітки tags.html tags
Кошик checkout/cart.html items, cart, min_order, below_min, free_shipping_left
Оформлення checkout/layout.html checkout
Замовлення прийнято checkout/success.html order, is_authenticated
Оплата замовлення checkout/pay.html order, order_id, is_paid, is_online
Помилка оплати checkout/pay-error.html order_id
Обране favorites.html products
Порівняння compare.html колонки товарів і рядки характеристик
Вхід account/login.html auth, captcha
Реєстрація account/register.html auth, captcha, reg_types
Огляд кабінету account/dashboard.html orders, orders_count, bonus
Замовлення account/orders.html orders, pagination, filters
Одне замовлення account/order.html order
Профіль account/profile.html profile
Не знайдено 404.html лише загальні
Магазин зачинено maintenance.html message

Набір лістингу

Однаковий у категорії, пошуку, бренда і мітки — тому список товарів, фільтри і посторінкова навігація пишуться один раз і підключаються до всіх чотирьох сторінок.

Змінна Що всередині
products картки товарів поточної сторінки
pagination посторінкова навігація
total скільки товарів знайшлося всього
filters доступні фільтри
active_filters чипси вибраних умов, у кожного адреса «зняти»
filter_chips чи показувати чипси
selected що вибрано зараз
sort, sort_options поточне сортування і його варіанти
action_url адреса, на яку надсилається форма фільтра
reset_url адреса «скинути все»
keep_params параметри, які потрібно зберегти під час переходу
has_filters, show_filters чи є фільтри і чи показувати панель
lazy_load підвантажувати товари кнопкою «Показати ще»
filter_mode ajax — застосовувати одразу, button — після натискання кнопки
filter_show_counts показувати лічильники біля значень фільтра
image_lazy підвантажувати картинки під час прокручування

pagination

{if $pagination.has_pages}
    {if $pagination.prev_url}<a href="{$pagination.prev_url}">Назад</a>{/if}
    {foreach $pagination.pages as $p}
        {if $p.ellipsis}<span>…</span>
        {else}<a href="{$p.url}"{if $p.active} class="is-active"{/if}>{$p.num}</a>{/if}
    {/foreach}
    {if $pagination.next_url}<a href="{$pagination.next_url}">Вперед</a>{/if}
{/if}

Ще є current, last, from, to, total — для підпису «Показано 1–24 з 137».

filters

Ключ Що всередині
price min, max, from, to, active
in_stock count, selected, disabled — або порожньо, якщо фільтр вимкнено
discount те саме
warehouses фільтр за складами
features словникові характеристики: колір, матеріал, бренд
ranges розмірні характеристики: довжина, вага, потужність
booleans характеристики «так/ні»

Малюйте фільтри списком за даними, а не за іменами. Набір характеристик у кожного магазину свій: жорстко прописаний перелік «колір, розмір, бренд» у чужому магазині покаже порожнечу.

Значення, за яким при поточному виборі товарів немає, приходить з ознакою disabled — його показують приглушеним, а не ховають: інакше покупець не розуміє, куди подівся варіант.

active_filters

Чипси вибраних умов. У кожного своя адреса без цієї умови, тому зняття фільтра працює і без скриптів:

{foreach $active_filters as $chip}
    <a href="{$chip.url}" class="chip">{$chip.label} ✕</a>
{/foreach}

Що приходить на окремі сторінки

Категорія завжди отримує landing, навіть на звичайній категорії — там це порожні text_top, text_bottom і related. Зроблено, щоб шаблон писався один раз, без перевірки «а чи є посадкова сторінка».

Пошук при запиті коротшому за дві літери отримує лише query, category_id, has_query (порожньо) і total (нуль) — ні лістингу, ні фільтрів. Окрема гілка «введіть хоча б два символи» в шаблоні потрібна.

Кошик: items — позиції, cart — підсумки, min_order і below_min — мінімальна сума замовлення, free_shipping_left — скільки додати до безкоштовної доставки (порожньо, якщо додавати не потрібно або порога немає).

Оформлення отримує checkout. У порожнього кошика там лише ознака «порожньо» і сам кошик; інакше — settings (які поля увімкнено), prefill, contact_types, recipient_fields, recipient_company_fields, saved_addresses, location_fields, cart, calc і те, що додали доповнення.

Відгуки можуть прийти одним ключем: якщо власник вимкнув відгуки, у $reviews буде лише ознака «вимкнено». Звертатися до $reviews.items без перевірки не можна.

Замовлення покупця в кабінеті

Список замовлень (account/orders.html) отримує orders — рядки замовлень, pagination — сторінки та filters — з чого покупцеві обирати у відборі (shipping, payment, statuses і current — що обрано зараз). Список перемальовується на місці, тому саму таблицю виносять у account/partials/orders-table.html: магазин просить у теми цей самий шматок розмітки і підставляє його назад.

Сторінка одного замовлення (account/order.html) отримує order. Замовлення — знімок: суми, назви способів і дані покупця залишаться такими, якими були в день покупки, навіть якщо магазин потім усе це перейменує.

Рядок замовлення

Ці поля є і в рядка списку, і в картки — верстку можна писати один раз.

Поле Що всередині
number номер, яким його бачить покупець (з оформленням із налаштувань)
number_raw номер для адреси сторінки: в оформленні буває #, і посилання зламалося б
date дата оформлення
status, status_label, status_color код статусу, його назва та колір
total, currency сума та валюта замовлення
items_count скільки позицій
shipping_name, shipping_logo спосіб доставки та його логотип
payment_name, payment_logo спосіб оплати та його логотип
payment_status, payment_status_label стан оплати та його назва
is_paid чи оплачене замовлення повністю
paid_total, due скільки внесено і скільки залишилось заплатити
pay_url адреса сторінки оплати — або порожньо
comment коментар покупця
tracking номер накладної перевізника

Логотип приходить порожнім, якщо власник його не завантажував або спосіб уже видалено — тоді залишається назва, знята із замовлення при оформленні:

{if $order.shipping_logo}<img src="{$order.shipping_logo}" alt="">{/if}
{$order.shipping_name|default:'—'}

pay_url є лише в неоплаченого замовлення і лише у способу, який веде на сторінку банку. У оплати при отриманні та оплати за рахунком його немає і бути не повинно — кнопка вела б у нікуди:

{if $order.pay_url && $order.due > 0}
    <a href="{$order.pay_url}">Сплатити {money amount=$order.due currency=$order.currency}</a>
{/if}

Що додається на сторінці замовлення

Поле Що всередині
placed_at, paid_at коли замовлення оформлене і коли сплачене, з часом
items_total, services_total, discount_total товари, послуги, знижка
shipping_total, tax_total, bonus_total доставка, податок, оплата балами
extra_total усе, що доповнення додало до підсумку понад ці рядки
discounts які правила спрацювали і на скільки
promo_code промокод, якщо покупець його вводив
needs_callback покупець просив передзвонити
items склад замовлення
customer що покупець указав про себе
recipient інший отримувач — або порожньо
address адреса доставки
timeline історія змін статусу

Рядки зобов'язані складатися в підсумок. extra_total саме для цього: у суму замовлення міг увійти пункт, якого в інших рядках немає — наприклад надбавка за спосіб оплати від доповнення. Покажіть його окремим рядком, інакше покупець складе стовпчиком і отримає не ту суму.

items — склад замовлення

Поле Що всередині
name, sku_code назва та артикул на день покупки
image фотографія варіанта — або порожньо
url посилання на товар; порожньо, якщо товару в каталозі більше немає
qty, unit кількість та одиниця продажу
pack packs і rest, якщо товар брали упаковками
price, compare_price ціна та стара ціна
discount_total, total знижка на позицію та її сума
services послуги до цієї позиції: name, price, total

Фотографії може не бути — товар зняли з продажу або її взагалі не завантажували. Ставте на це місце значок, порожня рамка читається як зламане зображення.

customer і recipient — поля замовлення

Обидва приходять списком: code, name, value. Назви — ті самі, якими поля названі в магазині в розділі «Оформлення замовлення», тому малюйте їх циклом, а не за іменами: набір полів у кожного магазину свій, і замовлення компанії несе ще назву та податковий номер.

{foreach $order.customer as $field}
    <p><span>{$field.name|escape}</span> <span>{$field.value|escape}</span></p>
{/foreach}

recipient приходить порожнім, якщо замовлення оформлювали на себе.

address — куди везти

name, phone, email, country, region, city, zip, street (вулиця, будинок і квартира одним рядком), окремо street_name, building, apartment, а також point і point_number — обране відділення або пункт видачі. При доставці у відділення вулиці немає і не буде: магазин навмисно її не заповнює, щоб у документах не опинилися й адреса, й відділення одразу.

timeline — історія замовлення

Зміни статусу по порядку: date, status, status_label і comment менеджера. Внутрішніх позначок співробітників покупцеві не показують — їх у цьому списку немає.

Як подивитися дані на власні очі

{dump}                що взагалі доступне цьому шаблону
{dump var=$product}   одне значення цілком
{dumpc var=$product}  те саме в консоль браузера

Бачить лише співробітник магазину — покупцеві блок не покажеться. Це найшвидший спосіб зрозуміти, що приходить на конкретну сторінку, і він завжди актуальніший за будь-яку таблицю.

Оновлено 8 вересня 2026