К содержимому
Интеграции

Интеграция панели темы

Обновлено

Область работы

Эта статья для разработчика панели темы. Все изменяющие маршруты работают с темой приложения «Сайт», даже если панель открыта из другого приложения. Передать другое приложение параметром запроса нельзя. Идентификатор темы в панели должен соответствовать установленной теме «Сайта».

URL формируйте через маршрутизацию Webasyst, без жёстко заданного домена или каталога установки:

{$preview_url = $wa->getUrl('themesettings/frontend/default')}
{$save_url = $wa->getUrl('themesettings/frontend/save')}
{$reset_url = $wa->getUrl('themesettings/frontend/reset')}
{$token_url = $wa->getUrl('themesettings/frontend/token')}

Публичный маршрут приложения должен быть доступен на нужном домене. Конкретный URL зависит от правил маршрутизации установки.

Маршруты и права

Маршрут Метод Назначение Доступ
token/ GET Инициализировать сессию и CSRF-cookie, получить data._csrf Администратор «Сайта» или посетитель при включённом демо
default/ POST Заменить собственный черновик Те же права
reset/ POST Удалить собственный черновик и загрузки указанной темы Те же права
save/ POST Применить присланные изменения к рабочей теме «Сайта» Только администратор «Сайта»

Запросы выполняются с cookies той же сессии. Для POST обязательна CSRF-cookie и совпадающий токен: поле _csrf либо заголовок X-CSRF-Token. Отсутствующие токены не принимаются. CORS приложением не включается.

Для анонимной панели сначала вызовите хелпер до {$wa->csrf()} либо выполните GET к token/. При выключенном демо посетителю этот маршрут вернёт отказ доступа. Ответ инициализации помечается Cache-Control: no-store.

Поля запроса

Поле Где используется Содержание
theme_id Все POST-маршруты Идентификатор темы «Сайта»: 1–128 латинских букв, цифр, _ или -
settings[ключ] default/, save/ Непустой набор значений по реальным ключам theme.xml
image[ключ] default/, save/, при загрузке Файл для настройки с типом image; соответствующий ключ должен присутствовать и в settings
_csrf Все POST-маршруты Токен, совпадающий с cookie; вместо поля можно передать заголовок

При загрузке файлов используйте multipart/form-data. Идентификатор сессии в полях не передаётся: приложение определяет её на сервере.

save/ применяет значения из запроса, а не автоматически берёт весь черновик из базы. Передавайте все изменения, которые требуется сохранить. Сессионный URL изображения передавайте в соответствующем поле image-настройки внутри settings: приложение проверяет принадлежность файла своей сессии и теме, копирует файл в тему и сохраняет относительное имя.

Валидация настроек

Панель может отправлять полную форму или отличия от сохранённой темы. Неизвестные, скрытые, наследуемые и неподдерживаемые поля отфильтровываются. Настройки непосредственного родителя доступны только для чтения; попытка загрузить изображение родителя отклоняется.

Тип Проверка
text, textarea Скалярное значение, UTF-8, ограничение размера
checkbox 0 или 1; пустое значение приводится к 0
select, radio, image_select Значение должно быть ключом допустимого варианта
color #RGB, #RRGGBB или пустое значение
number Число с учётом заданных min, max, step; пустое значение допускается
image Отдельная проверка относительного пути или URL собственного изображения; загрузка JPEG/PNG/GIF

Зависимость show_if обрабатывается как ключ=значение с учётом текущих и присланных значений. Изменения зависимого обычного поля исключаются, если условие не выполнено. Неподдерживаемое выражение show_if скрывает поле для записи. Произвольные выражения не исполняются.

Для посетителя изменённые значения с HTML или исполняемыми протоколами запрещены. Неизменённые сохранённые значения не проходят эту проверку заново. Переводы строк CRLF/LF и регистр шестнадцатеричных цветов не считаются изменением, значимые пробелы сохраняются.

Ограничения изображений и черновиков перечислены в статье «Черновики».

Ответы и ошибки

При успешном запросе Webasyst возвращает status: "ok" и объект data.

Маршрут Полезные поля data
token/ _csrf — токен
default/ settings — принятые изменения и URL загруженных изображений; error — пустая строка
save/ settings — применённые значения, для новых изображений относительные имена; error — пустой массив
reset/ resetAction: true

Ответ default/ содержит дельту, а не полный черновик. Полный черновик читает getSettings($theme_id).

Безопасные ошибки ввода в default/ и save/ дают HTTP 400 и status: "fail" с массивом errors. Неожиданные исключения дают HTTP 500 и общее сообщение; подробности пишутся в themesettings.log. Превышение некоторых квот также может попасть в общий обработчик ошибок, поэтому не полагайтесь на один HTTP-код для всех отказов.

Код Типичная причина
403 Нет прав или отсутствует/не совпадает CSRF-токен
405 Неподходящий HTTP-метод
429 Превышен общий лимит запросов предпросмотра и сброса

Проверяйте HTTP-код, status, errors и ожидаемые поля data. Перезагружайте страницу только после подтверждённого успеха. При сетевой ошибке или неожиданном ответе покажите ошибку пользователю.

Большая форма и max_input_vars

Перед обработкой проверяется рекурсивное количество полей POST и метаданных файлов. При достижении порога max_input_vars - 10 запрос отклоняется без записи. Подсчёт консервативный: отказ возможен раньше фактического лимита PHP.

Сообщение: «Форма отправлена не полностью: превышен max_input_vars (N). Увеличьте max_input_vars или отправляйте только изменённые настройки.» Здесь N — текущее значение лимита PHP.

Увеличьте серверный лимит с запасом либо отправляйте только изменения относительно рабочей темы, включая все актуальные изменения предпросмотра. Повторный default/ заменяет прежний черновик.

Сохранение рабочей темы

Приложение объединяет разрешённые присланные изменения с текущими значениями темы; отсутствующие настройки сохраняются. Перед записью используются блокировка и внутренняя защищённая резервная копия. При ошибке приложение пытается восстановить файлы. Это механизм обработки неудачной записи, без пользовательского интерфейса истории и восстановления.

Изменения общей темы действуют на все витрины, использующие эту тему «Сайта». Учитывайте это при проверке результата.