Коллекции витрины
Часть данных, нужных редактору, живёт не в PageCraft, а в витрине 4CMS. Это три справочника — их удобно считать коллекциями сайта, хотя хранятся они на стороне магазина:
| Коллекция | Зачем нужна |
|---|---|
| Темы | показать страницу в реальных цветах магазина |
| Рубрики | без них статью не опубликовать — 4CMS требует хотя бы одну |
| Вариации | локаль/регион витрины, в который уходит публикация |
Общее для всех трёх
Заголовок раздела «Общее для всех трёх»Все три справочника берутся из API 4partners под токеном, который лежит
в настройках публикации сайта (provider_config.api_token). Отсюда два
следствия:
- пока провайдер публикации не настроен, коллекции недоступны — запрос
вернёт
400с сообщением, что токен не задан. Предпросмотр в этом случае останется в нейтральных цветах, а список рубрик — пустым; - браузер к 4CMS не ходит: запросы идут через PageCraft. Иначе их не пустил бы CORS, а токен пришлось бы отдавать в браузер, где он утечёт через инструменты разработчика или расширение.
Кеша нет: каждый запрос уходит в 4CMS. Если витрина недоступна, ответ будет
502, и редактор просто останется без тем и рубрик — на уже собранную страницу
это не влияет.
Все четыре эндпоинта — внутреннего контура, они обслуживают редактор, а не агента:
| Метод и путь | Что отдаёт |
|---|---|
GET /api/sites/{id}/themes |
список тем витрины |
GET /api/sites/{id}/themes/css?slug=... |
CSS выбранной темы |
GET /api/sites/{id}/rubrics?parent_id=...&level=... |
рубрики, по уровню |
GET /api/sites/{id}/variations |
вариации витрины |
Тема — цветовая схема магазина. В списке приходят id, name, slug,
cssUrl и признак isGlobal.
В редакторе страницы в панели предпросмотра есть выбор темы и тумблер
светлая/тёмная. Выбранная тема подключается в iframe отдельным <style>,
а на body ставится класс theme-light или theme-dark.
Смысл — не декоративный. Блок, нарисованный «по скриншоту», выглядит правильно ровно до первого переключения темы: собственные цвета не подхватят дизайн-токены витрины. Тумблер даёт проверить это сразу, а не после публикации.
Выбор темы нигде не сохраняется и на публикацию не влияет: это инструмент проверки, а не настройка страницы.
CSS темы приходит не по произвольному адресу: клиент передаёт только slug,
а сам адрес PageCraft берёт из ответа 4CMS, проверяет по форме и приклеивает
к домену витрины. Поэтому подсунуть свой URL в этот эндпоинт нельзя —
неизвестный slug даёт 404, неожиданный путь 400.
Рубрики
Заголовок раздела «Рубрики»Рубрики — дерево разделов каталога. Первый запрос без parent_id возвращает
только корневые узлы, следующий с parent_id и level — прямых детей
раскрытого узла. Так дерево грузится по мере раскрытия: каталог большой,
а при публикации нужны одна-две рубрики.
Рубрики выбираются в диалоге публикации и уходят провайдеру как rubric_ids.
Поле обязательное: публикация без единой рубрики отклоняется с ошибкой
rubric_ids is required ещё до обращения к витрине. Через API V1 это тот же
массив в теле POST /api/v1/pages/{id}/publish.
Вариации
Заголовок раздела «Вариации»Вариация — вариант витрины: язык, страна, валюта, href-lang. В диалоге
публикации селектор появляется, только если вариаций больше одной, — магазину
с единственной вариацией выбирать нечего.
Вариация участвует в адресе, по которому создаётся и обновляется статья
в 4CMS. Значение берётся из выбора в диалоге, иначе из provider_config.variation,
иначе default.
Что пойдёт не так
Заголовок раздела «Что пойдёт не так»| Симптом | Причина |
|---|---|
Список тем и рубрик пуст, в ответе 400 |
не настроен провайдер публикации или пустой api_token |
502 при запросе тем, рубрик, вариаций |
4CMS недоступна или вернула не то — токен просрочен, сеть, сбой витрины |
| Тема выбирается, но блок не перекрашивается | блок использует собственные цвета вместо токенов темы |
Публикация падает на rubric_ids is required |
не выбрана ни одна рубрика |
Источники
Заголовок раздела «Источники»backend/src/Service/Query/Site/SiteThemesQueryService.php,SiteThemeCssQueryService.php,SiteRubricsQueryService.php,SiteVariationsQueryService.phpbackend/src/Controller/Site/GetSiteThemesAction.php,GetSiteThemeCssAction.php,GetSiteRubricsAction.php,GetSiteVariationsAction.phpbackend/src/Service/FourCms/FourCmsDomainResolver.phpbackend/src/Publishing/Provider/FourCmsProvider.php—rubric_ids,variationfront/src/lib/themeInject.ts,front/src/components/PageEditor/PageEditor.tsxfront/src/providers/fourcms/FourCmsPublishDialog.tsx