Схема контента
Сайт CMS хранится в JSON. Одни и те же данные используют редактор кабинета, сборщик и API. Схема проверяет поля и связи перед сохранением; при ошибке API возвращает путь до поля. Для готовых сайтов из архива или Git действуют отдельные настройки развёртывания.
Верхний уровень
| Поле | Что внутри |
|---|---|
schema_version | версия формата, сейчас 1 |
meta | служебные site_id и version, если заданы |
business | название, отрасль, телефон, адрес, часовой пояс, часы работы и реквизиты |
service_categories, services | категории и услуги с ценами |
promos | акции с датами действия |
reviews | отзывы и их источники |
faq, staff, gallery | вопросы, сотрудники и фотографии |
posts, sections | публикации и настройки разделов акций, новостей и блога |
booking | включение страницы онлайн-записи и подписи её элементов |
pages | страницы со списками блоков |
extensions | свои коллекции, записи и компоненты |
seo | суффикс заголовка, картинка для соцсетей и подтверждение поисковиков |
theme | тема, шаблон, цвета, шрифты и скругления |
integrations | настройки подключений, например номер счётчика Метрики |
Страницы
В pages от 1 до 30 страниц, на каждой от 1 до 30 блоков. slug задаёт адрес без слешей; пустая строка обозначает главную. nav_label задаёт подпись в меню, in_nav: false скрывает страницу из навигации. Адреса системных разделов, например zapis, blog и api, занять нельзя.
Это элемент массива pages, а не полный файл сайта:
{
"slug": "",
"nav_label": "Главная",
"in_nav": true,
"seo": {
"title": "Ремонт автомобиля и шиномонтаж на Северной, 12",
"description": "Шиномонтаж, ремонт подвески и техническое обслуживание автомобиля. Посмотрите услуги и цены, оставьте заявку на сайте."
},
"blocks": [
{ "type": "hero", "title": "Ремонт автомобиля и шиномонтаж" },
{ "type": "services", "title": "Услуги и цены" },
{ "type": "cta_form", "title": "Оставьте заявку" }
]
}
19 типов блоков
type | Содержимое |
|---|---|
hero | первый экран с заголовком, изображением и кнопкой |
services | выбранные услуги или категории; необязательные service_ids и category_ids |
prices | таблица цен по категориям |
promo | действующие акции из promos |
about | текст о компании, изображение и факты |
gallery | фотографии из gallery |
reviews | отзывы из reviews |
faq | вопросы и ответы из faq |
staff | сотрудники из staff |
contacts | контакты и часы работы бизнеса |
map | ссылка на карту |
cta_form | форма заявки, текст после отправки и желаемое время звонка |
quiz | расчёт цены по ответам, включая условные вопросы |
posts | публикации выбранного kind: news или blog |
booking | виджет онлайн-записи |
packages | от 2 до 4 вариантов услуги с составом и ценой |
process | от 2 до 6 шагов работы |
case_study | задача, выполненная работа и результат |
before_after | изображения до и после с подписями |
У каждого блока можно задать anchor для ссылки внутри страницы и hidden: true, чтобы временно скрыть блок. Блоки услуг и списков ссылаются на записи по id; общую цену услуги достаточно изменить один раз. Блоки packages, process, case_study, before_after и quiz хранят свои данные внутри блока.
Для условного кейса или демонстрации до/после задайте demo: true. Квиз показывает расчёт по заданным правилам; желаемое время звонка в форме не резервирует слот записи.
Свои коллекции и компоненты
В extensions.collections описываются поля и записи: например, проекты, специалисты или объекты недвижимости. Поле имеет тип text, long_text, number, boolean, date, select, image или reference. У select нужен список options, у reference имя целевой collection. multiple: true разрешает массив значений. Ссылка указывает на id существующей записи целевой коллекции.
extensions.components связывает коллекцию с разделом сайта. Сейчас доступны отображения cards и list: компонент задаёт адрес раздела и поля заголовка, описания и изображения. Это декларативные настройки, без загрузки исполняемого кода в CMS. Для своего фронтенда используйте SDK.
Ниже значение поля extensions. После публикации компонент создаст раздел /projects/:
{
"collections": [
{
"id": "projects",
"label": "Проекты",
"version": 1,
"fields": [
{ "id": "title", "label": "Название", "type": "text", "required": true },
{ "id": "summary", "label": "Описание", "type": "long_text" },
{ "id": "editor_note", "label": "Заметка редактора", "type": "text", "private": true }
],
"records": [
{
"id": "workshop",
"values": {
"title": "Сайт мастерской",
"summary": "Каталог услуг и форма заявки.",
"editor_note": "Проверить описание перед публикацией."
}
}
]
}
],
"components": [
{
"id": "project-list",
"label": "Проекты",
"slug": "projects",
"collection": "projects",
"renderer": "cards",
"title_field": "title",
"summary_field": "summary",
"description": "Проекты мастерской: описание задач и выполненной работы."
}
]
}
Лимиты: до 20 коллекций, 40 полей и 500 записей на коллекцию, до 30 компонентов. Адрес компонента не должен совпадать с адресом страницы или системного раздела. Для отображения можно привязать только публичные одиночные поля подходящего типа.
Поле с private: true исключается из опубликованных данных. Запись с hidden: true и компонент с hidden: true скрываются из публичного представления. Пользователь или агент с доступом к чтению черновика по-прежнему видит его полные данные.
Изменение через API
Все пути ниже начинаются с /api/v1:
GET /sites/{site_id}/contentвозвращаетversion_id, номер версии иcontent.PUT /sites/{site_id}/contentпринимаетcontent,expected_version_idи необязательныйnote. Передавайте прочитанныйversion_id, чтобы не затереть чужую правку.- Для отдельных коллекций используйте
GET /sites/{site_id}/extensionsиPUT /sites/{site_id}/extensions. Тело сохранения содержитexpected_version_idиextensions; ответ содержит новыйversion_idиextensions. - Сохранение создаёт черновик. Превью и публикация выполняются отдельно, для выбранной версии.
При 409 draft_changed прочитайте текущую версию и совместите изменения. Автоматически повторять старую запись поверх нового черновика нельзя. Доступ через ключ ограничен выбранными сайтами и операциями; настройка описана в инструкции MCP.
Правила формата
- Деньги в контенте задаются в рублях целыми числами, поля заканчиваются на
_rub. - Даты имеют формат
ГГГГ-ММ-ДД, часовой пояс бизнеса хранится вbusiness.timezone. - Телефон имеет формат
+7XXXXXXXXXX. - Картинки задаются относительным путём без
..:jpg,png,webpилиavif. У каждой обязателенalt. - Идентификаторы записей стандартных разделов содержат строчные латинские буквы, цифры и дефис, до 48 символов.
- В коллекциях
idначинается с буквы; разрешены строчные латинские буквы, цифры, дефис и подчёркивание, до 40 символов. seo.titleсодержит от 10 до 70 знаков,seo.descriptionот 50 до 170.