Перейти к содержимому

Коллекции витрины

Часть данных, нужных редактору, живёт не в 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.php
  • backend/src/Controller/Site/GetSiteThemesAction.php, GetSiteThemeCssAction.php, GetSiteRubricsAction.php, GetSiteVariationsAction.php
  • backend/src/Service/FourCms/FourCmsDomainResolver.php
  • backend/src/Publishing/Provider/FourCmsProvider.phprubric_ids, variation
  • front/src/lib/themeInject.ts, front/src/components/PageEditor/PageEditor.tsx
  • front/src/providers/fourcms/FourCmsPublishDialog.tsx