DEV Community

Андрей Викулов (VProger)
Андрей Викулов (VProger)

Posted on • Originally published at viku-lov.ru on

1С-Битрикс: кастомная страница настроек темы через Option API

1С-Битрикс: кастомная страница настроек темы через Option API

Задача: сделать свою страницу настроек темы и сохранить параметры так, чтобы они стабильно применялись в шаблоне сайта. В новой документации Битрикс для этой задачи есть все базовые элементы: работа с административной панелью, API опций модуля и стандартная защита формы от CSRF.

Официальные источники:

В чем проблема

Частая ситуация: параметры темы хранят в файлах или случайных таблицах, а затем сложно понять, где именно меняется цвет, телефон, логотип или поведение блока. В итоге:

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

Для устойчивой схемы в Битрикс достаточно:

  • хранить настройки в Option;
  • отправлять форму только с CSRF-токеном;
  • читать настройки в шаблоне сайта в одном месте.

Рабочее решение

Ниже минимальный рабочий сценарий без недокументированных зависимостей.

Шаг 1. Добавляем кнопку открытия страницы настройки

Документация по панели администрирования показывает, что можно добавить свою кнопку через AddPanelButton.

<?php
// Например, в шаблоне после подключения пролога
$APPLICATION->AddPanelButton([
"ID" => "theme_settings",
"TEXT" => "Настройки темы",
"TYPE" => "BIG",
"SORT" => 100,
"HREF" => "/local/admin/theme_settings.php",
]);
Enter fullscreen mode Exit fullscreen mode

API:

Если хотите открыть страницу в popup, используйте GetPopupLink:

https://docs.1c-bitrix.ru/api/classes/CAllMain.html#method\_GetPopupLink

Шаг 2. Делаем форму с CSRF-токеном

В новой документации по безопасности явно указаны bitrixsessidpost() и checkbitrixsessid().

<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php");
use Bitrix\Main\Config\Option;
$moduleId = "main";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!check_bitrix_sessid()) {
die("Invalid session");
}
$phone = trim((string)($_POST["theme_phone"] ?? ""));
$accent = trim((string)($_POST["theme_accent"] ?? ""));
Option::set($moduleId, "theme_phone", $phone);
Option::set($moduleId, "theme_accent", $accent);
}
$savedPhone = Option::get($moduleId, "theme_phone", "");
$savedAccent = Option::get($moduleId, "theme_accent", "#0a7c66");
?>
<form method="post">
<?= bitrix_sessid_post(); ?>
<label>Телефон в шапке</label><br>
<input type="text" name="theme_phone" value="<?= htmlspecialchars($savedPhone, ENT_QUOTES, "UTF-8"); ?>"><br><br>
<label>Акцентный цвет</label><br>
<input type="text" name="theme_accent" value="<?= htmlspecialchars($savedAccent, ENT_QUOTES, "UTF-8"); ?>"><br><br>
<button type="submit">Сохранить</button>
</form>
Enter fullscreen mode Exit fullscreen mode

Документация:

Шаг 3. Читаем настройки в шаблоне темы

Дальше используем те же ключи Option в шаблоне:

<?php
use Bitrix\Main\Config\Option;
$moduleId = "main";
$themePhone = Option::get($moduleId, "theme_phone", "+7 (000) 000-00-00");
$themeAccent = Option::get($moduleId, "theme_accent", "#0a7c66");
?>
<style>
:root { --theme-accent: <?= htmlspecialchars($themeAccent, ENT_QUOTES, "UTF-8"); ?>; }
</style>
<a href="tel:<?= htmlspecialchars($themePhone, ENT_QUOTES, "UTF-8"); ?>">
<?= htmlspecialchars($themePhone, ENT_QUOTES, "UTF-8"); ?>
</a>
Enter fullscreen mode Exit fullscreen mode

Идея простая: одна точка сохранения и одна точка чтения. Это упрощает поддержку и перенос.

Проверка результата

Проверяем по шагам:

  1. Открыть страницу настроек через кнопку панели.
  2. Сохранить значения.
  3. Обновить публичную страницу и убедиться, что новые данные применились.

Быстрая проверка из HTML:

curl -s https://example.ru/ | grep -E "theme-accent|tel:"
Enter fullscreen mode Exit fullscreen mode

Ожидаемый признак: в ответе видны обновленные значения цвета и телефона.

Типичные ошибки

❌ Ошибка: сохраняют POST без проверки токена.

Причина: нет checkbitrixsessid().

Как исправить: добавить проверку и bitrixsessidpost() в форму.

❌ Ошибка: ключи в Option::set() и Option::get() не совпадают.

Причина: опечатки вроде themephone vs themetel.

Как исправить: вынести ключи в константы или использовать одинаковые литералы.

❌ Ошибка: выводят значение без экранирования.

Причина: прямой вывод пользовательского текста в HTML.

Как исправить: использовать htmlspecialchars(..., ENT_QUOTES, &quot;UTF-8&quot;).

❌ Ошибка: ожидают, что кнопка панели появится для всех пользователей.

Причина: права и настройки панели зависят от пользователя/группы.

Как исправить: проверить доступы и настройки панели администрирования:

https://docs.1c-bitrix.ru/pages/cms-basics/admin-panel.html

Где применять

  • В темах, где нужно управлять контактами, цветами и переключателями блоков.
  • В проектах с контент-редакторами, которым нужен простой интерфейс без правок кода.
  • В production, где важно централизованное хранение параметров.

Дополнительно по структуре проекта:

Read more on Viku-Lov Studio

Top comments (0)