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

Файл theme.json і налаштування теми

Як описати налаштування, які власник магазину побачить у панелі, і як прочитати їхні значення в шаблоні.

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

theme.json — єдиний обов'язковий файл теми. Він каже магазину, як тема називається, якої версії магазину потребує і які налаштування власник побачить у панелі.

Мінімальний файл

{
    "id": "my-theme",
    "name": "Моя тема",
    "version": "1.0.0",
    "requires": { "core": "2.0.0" }
}
Поле Обов'язково Що означає
id так ідентифікатор теми; зобов'язаний збігатися з іменем теки
name так назва, яку бачить власник магазину
version так версія теми
requires.core ні, але потрібно з якої версії магазину тема працює
settings ні налаштування теми: панель будує форму за цим описом

Поля author, preview і locales записати можна, але магазин їх зараз ніде не показує — на роботу теми вони не впливають.

Якщо theme.json зіпсований і не читається як JSON, магазин усе одно вважає теку темою, але без імені та версії: у списку вона називається за іменем теки. Вітрина при цьому працює. А от без самого файлу тека темою не вважається, і вітрина, призначена на неї, падає.

Сумісність із версією магазину

"requires": { "core": "2.0.0" }                            ця версія і новіші
"requires": { "core": ">=2.0.0" }                          те саме, зі знаком
"requires": { "core": { "min": "2.0.0", "max": "3.0" } }   з верхньою межею

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

Ставте ту версію, можливостями якої тема справді користується, і переконайтеся, що ця версія магазину вже вийшла. Тема, розрахована на магазин новіший за встановлений, звернеться до того, чого ще немає, і покупець зустріне помилку замість сторінки.

Перевірка йде до підміни теки, тому відмова безпечна: попередня тема залишається на місці, магазин продовжує працювати. Власник побачить зрозуміле повідомлення: «Це доповнення розраховане на CartiX 3.1.0 і новіші, а у вас встановлена версія 2.5.0. Спочатку оновіть магазин».

Що тема веде сама

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

"runtime": {
    "sku": "theme",
    "catalog": "theme",
    "accessories_popup": "theme"
}
Ключ Що перестане підключати магазин
sku вибір варіанта товару на картці
catalog добір товарів у розділі (галочки, ціна, «показати ще»)
accessories_popup вікно «візьміть до цього» після покупки з каталогу

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

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

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

"settings": {
    "groups": [
        {
            "id": "colors",
            "name": "Кольори",
            "fields": [
                { "key": "primary", "type": "color", "label": "Основний", "default": "#4f46e5" },
                { "key": "accent", "type": "color", "label": "Акцент",
                  "hint": "Колір зірок рейтингу і кнопки передзамовлення.", "default": "#f59e0b" }
            ]
        },
        {
            "id": "catalog",
            "name": "Каталог",
            "fields": [
                { "key": "per_page", "type": "number", "label": "Товарів на сторінці", "default": 24 },
                { "key": "products_per_row", "type": "select", "label": "Товарів у ряд",
                  "options": [2, 3, 4, 5], "default": 4 },
                { "key": "show_sku_on_card", "type": "boolean",
                  "label": "Показувати артикул на картці", "default": true }
            ]
        }
    ]
}

Поля групи

Ключ Що задає
id ідентифікатор групи; за ним налаштування доступне як {$theme.colors.primary}
name заголовок групи у формі
fields список полів

Поля налаштування

Ключ Що задає
key ім'я налаштування; за ним значення доступне як {$theme.primary}
type вид поля
label підпис поля
default значення за замовчуванням
hint пояснення під полем
placeholder підказка всередині порожнього поля
options список варіантів — тільки для select

Види полів

type Що малює панель
text однорядкове поле
textarea багаторядкове поле
number число
boolean перемикач
color вибір кольору
select вибір зі списку options
font вибір шрифту з готового списку
image посилання на файл картинки

image поки малюється звичайним текстовим полем: власник вставляє туди адресу файлу, вибору картинки з галереї немає.

Як прочитати налаштування в шаблоні

Два способи, обидва працюють завжди:

{$theme.primary}          плоско, за іменем налаштування
{$theme.colors.primary}   через групу

Плюс два набори є в темі завжди, навіть якщо ви їх не оголошували:

{$theme.assets}           /theme-assets/ім'я-теми — адреса теки статики
{$theme.colors.primary}   {$theme.colors.accent} {$theme.colors.bg} {$theme.colors.text}

Усі поля схеми присутні в $theme, навіть незаповнені — вони приходять порожніми. Шаблон на них не падає, перевірка виду {if $theme.logo} безпечна.

⚠️ Налаштування, не оголошеного в theme.json, для магазину не існує. Написати {$theme.my_setting} і чекати значення безглуздо: поки поля немає в схемі, значення в нього немає і бути не може. Схема — джерело правди.

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

{ "key": "card_variants", "type": "boolean", "label": "Варіанти купівлі на картці", "default": true }

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

Де зберігаються значення

Значення налаштувань лежать у вітрини, а не в теми. Звідси три наслідки, про які потрібно знати.

Налаштування переживають оновлення теми. Файли замінюються повністю, значення залишаються в базі — за збіжними ключами нова версія побачить усе, що власник налаштував.

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

Набір значень один на вітрину, а не окремий на кожну тему. Збіжні ключі (primary, per_page, container_width) переїжджають з теми в тему, а ключі, яких у нової теми немає, просто лежать далі. Але збереження налаштувань нової теми перезаписує весь набір своїми полями — тобто перемкнулися на іншу тему, натиснули «Зберегти» — значення попередньої теми втрачені. Власнику, який збирається повернутися, варто спочатку виписати їх або завантажити архів теми.

Коли вітрин кілька, кожна налаштовується окремо: одна й та сама тема може бути синьою на одній вітрині і зеленою на іншій.

Налаштування зобов'язане щось робити

Поле, яке зберігається і ні на що не впливає, — обман власника магазину. Оголосили в схемі container_width — читайте його в розмітці:

<style>:root { --container: {$theme.container_width}px; }</style>

Хороша звичка: писати hint там, де назва поля не пояснює наслідок, і placeholder у кожному полі введення.

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