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

Граблі, на які наступають

Помилки, які не видно на тестовому магазині й спливають у покупця: валюта, порожній кошик, кеш і залишки.

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

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

Гроші

Сума без валюти друкується доларами. У тега {money} значення за замовчуванням — долар. Забули currency — у гривневому магазині ціна поїде з доларовим знаком. На тестовому магазині з валютою за замовчуванням помилки не видно зовсім.

{money amount=$product.price currency=$storefront.currency}

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

Замовлення не переоцінюється. У нього своя валюта і свій курс. Суми замовлення виводять з $order.currency, а не з валютою вітрини.

Порожні стани

Порожній кошик віддає неповний набір ключів. Коли кошика ще немає, у $cart немає items_total і catalog_savings. Блок підсумків загортають у {if $items}, інакше шаблон полізе за неіснуючим ключем.

Відгуки можуть прийти одним ключем. Власник вимкнув відгуки — у $reviews тільки ознака «вимкнено». Звертатися до $reviews.items без перевірки {if $reviews.enabled} не можна.

Порожній залишок і нульовий залишок — різні речі. count і sku_count приходять порожніми, коли залишок у товару не рахують зовсім — послуги, товари під замовлення. Написати «залишилося 0 шт.» у цьому випадку не можна, а залишилося {$product.count} надрукує порожнечу замість числа.

Товар без фотографії — звична річ. Гілку із заглушкою пишуть одразу, інакше сітка роз'їдеться на першому ж магазині, де фотографії ще не завантажили.

Кеш

«Поправив шаблон — на вітрині старе». Сторінки вітрини кешуються на добу. Правка файлу теми в редакторі кеш не скидає — файл пишеться повз базу.

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

«Поправив CSS — браузер тримає старий файл». Файли теми віддаються з довгим кешем на місяць. Позначку версії отримують тільки ті, що підключені тегами {asset_css} і {asset_js}.

⚠️ Файл, підключений вручну, позначки не отримує зовсім і залипає в покупця на місяць:

{* не можна *}  <link rel="stylesheet" href="{$theme.assets}/css/my.css">
{* потрібно *}  {asset_css file="css/my.css"}

Кошик не можна вдруковувати в розмітку сторінки каталогу. Сторінки каталогу лежать у спільному кеші: одна й та сама йде всім покупцям, і наступний побачить чужий кошик. Тому кількість проставляє магазин уже в браузері, а тема тільки розмічає картку атрибутом data-in-cart.

Якщо без розмітки на сервері не обійтися, є {$shop->inCart()} — але він вимикає кеш для цієї сторінки.

Розмітка і атрибути

Забутий мета-тег з ключем захисту ламає все. Без <meta name="csrf-token"> не працює ні додавання в кошик, ні перерахунок оформлення, ні надсилання відгуку. Помилка тиха: покупець натискає кнопку, і нічого не відбувається.

Імена полів оформлення міняти не можна. Перерахунок запускається за іменами — shipping, payment, coupon, bonus і все, що починається з address[. Перейменували coupon на promo — промокод перестав перераховувати замовлення.

data-recalc і data-required магазин не читає — він проставляє їх сам у тій розмітці, яку малює. Ставити їх у шаблоні безглуздо.

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

Не повідомили про свою зміну кошика — лічильник завмер. Будь-яка ділянка, що змінює кошик, зобов'язана надіслати подію cartix:cart-updated.

Без JavaScript оформлення замовлення не працює. І перерахунок, і створення замовлення відповідають даними, а не сторінкою. Заглушки в базовій темі немає.

Шаблони

nofilter там, де виводиться готова розмітка. Екранування увімкнено завжди. Опис товару, вміст інформаційної сторінки і карта варіантів без nofilter виведуться текстом з &lt;.

Одруківка в парному тегу роняє сторінку. Одиничний невідомий тег безпечний — він виводить порожнечу, тому тег вимкненого доповнення не ламає вітрину. А невідомий парний ({foo}…{/foo}) дає помилку збірки шаблону.

Незнайомий обробник значення безпечний, але тихий. Значення проходить наскрізь, ім'я йде в журнал. Перед викладенням у журнал варто заглянути.

Ключі та імена — тільки латиницею. {$theme.чого_нет} — це помилка розбору і білий екран, а не порожній рядок.

Відсутній шаблон — єдина помилка, через яку покупець бачить помилку замість сторінки. Те саме за {extends} і {include} на неіснуючий файл. Після перейменування шаблону пройдіться по вітрині очима.

Пагінатор Laravel у шаблон не віддається. Користуйтеся готовим pagination.

Налаштування теми

Налаштування, не оголошеного в theme.json, не існує. Поки поля немає в схемі, значення в нього немає і бути не може — правка шаблону нічого не змінить. Так і з card_variants: у базової теми її в схемі немає, тому базова тема не показує варіанти купівлі на картках.

Ім'я налаштування не повинно збігатися з іменем групи. Налаштування лежать у $theme і плоско, і за групами: поле colors усередині групи catalog затре всю групу colors.

Переключилися на іншу тему, натиснули «Зберегти» — налаштування попередньої втрачені. Значення лежать одним набором на вітрину, а не окремо на кожну тему, і форма перезаписує весь набір своїми полями.

З того самого випливає, що нова тема може показати чужі значення: збіжні ключі (primary, per_page, container_width) переїжджають з теми в тему.

Перейменований між версіями ключ налаштування виглядає як зламане оновлення. Власник отримає значення за замовчуванням замість свого.

Мови

Ключ, якого немає ні в темі, ні в магазині, виводиться сам. Сторінка не падає, але у верстці висить storefront.cart. Перед викладенням кожну мову потрібно пройти очима.

Написи, що їдуть у браузер, передає тема. Не передали data-text-* живому пошуку або data-l-* оформленню — на місці повідомлення буде порожнеча.

Довжина напису — частина верстки. Кнопка фіксованої ширини, зібрана на російському тексті, українською порветься.

Відмінювання перевіряють числами, а не на око. 21 товар і 22 товари — найчастіша помилка.

Файли і пакет

Три файли магазин просить на кожній сторінці: assets/css/theme.css, assets/js/theme.js, assets/vendor/fontawesome/all.min.css. Їх немає — три помилки 404 в консолі.

Немає 404.html — покупець побачить стандартну сторінку без вашої шапки і підвалу.

Порожня папка в пакет не потрапляє — складається перелік файлів.

Файли за межами assets/ браузеру не віддаються — це захист, а не недоробка.

У базовій темі

Дві речі, об які спотикаються, читаючи її як зразок.

Файли checkout/delivery.html, checkout/payment.html і checkout/confirm.html — мертві заготовки. Оформлення односторінкове, усе малює checkout/layout.html, а ці три файли ніхто не підключає. У своїй темі їх можна видалити.

README.md базової теми застарів. Він згадує тег {getList}, шаблон list.html і точки вбудовування header.end, home.after.lists, product.after.buy, checkout.fields — нічого цього не існує. Написаний у шаблоні {getList} мовчки виведе порожнечу. Орієнтуйтеся на цей довідник, а не на той файл.

Оновлено 24 серпня 2026