Дані сторінок: що доступне шаблону
Змінні, що є на кожній сторінці, та те, що приходить своє на кожен розділ вітрини.
На цій сторінці
- Є на кожній сторінці
- $storefront
- $theme
- $action
- $seo
- $contacts
- $customer
- $errors, $status, $old
- Посторінково
- Набір лістингу
- pagination
- filters
- active_filters
- Що приходить на окремі сторінки
- Замовлення покупця в кабінеті
- Рядок замовлення
- Що додається на сторінці замовлення
- items — склад замовлення
- customer і recipient — поля замовлення
- address — куди везти
- timeline — історія замовлення
- Як подивитися дані на власні очі
Шаблон не звертається до бази даних — магазин віддає йому готові дані. Частина з них є на кожній сторінці, частина приходить своя на кожен розділ вітрини.
Є на кожній сторінці
| Змінна | Що всередині |
|---|---|
$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} те саме в консоль браузера
Бачить лише співробітник магазину — покупцеві блок не покажеться. Це найшвидший спосіб зрозуміти, що приходить на конкретну сторінку, і він завжди актуальніший за будь-яку таблицю.