Разработка административного интерфейса модуля в Bitrix
Основные техники администрирования модулей Bitrix
Как создать страницу настроек модуля с использованием современного D7 UI?
Наиболее эффективный способ - применение компонента ui.form из Bitrix D7. Этот подход обеспечивает единообразный дизайн, поддержку валидации и работу с Ajax. Пример реализации:
class CAdminSettingsPage extends CBitrixComponent
{
public function executeComponent()
{
$this->arResult['FIELDS'] = [
'site_name' => [
'label' => 'Название сайта',
'type' => 'text',
'required' => true
],
'site_email' => [
'label' => 'Email для уведомлений',
'type' => 'email'
]
];
$this->includeComponentTemplate();
}
}Bitrix admin module admin php (администрирование модулей bitrix на php)
В шаблоне компонента подключается расширение ui.forms и выводится форма. Важно правильно указать путь к файлам модуля.
Типичная ошибка:
Страница не отображает форму. Решение: убедиться, что в методе OnBuildGlobalMenu модуля правильно задан путь к скрипту admin/settings.php и что файл содержит вызов require_once $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php";.
Как сделать простую форму без подключения внешних библиотек?
Можно использовать класс CAdminForm (устаревший, но до сих пор работающий).
$tabControl = new CAdminForm("tabControl", [[
"DIV" => "edit1",
"TAB" => "Основные",
"ICON" => "main_user_edit",
"TITLE" => "Настройки модуля"
]]);
$tabControl->Begin(["FORM_ACTION" => $APPLICATION->GetCurPage() . "?mid=my.module"]);
$tabControl->BeginNextFormTab();
$tabControl->AddTextArea("description", "Описание:", "");
$tabControl->Buttons(["btnapply" => false]);
$tabControl->End();
Проблема:
При сохранении данные не записываются. Решение: проверять вызов COption::SetOptionString внутри обработчика if ($_POST["save"]).
Как организовать многостраничную форму с вкладками?
Используется CAdminTabControl вместе с сериализацией данных в сессии.
$tabControl = new CAdminTabControl("tabControl", [
["DIV" => "tab1", "TAB" => "Основное", "TITLE" => "Основные настройки"],
["DIV" => "tab2", "TAB" => "Дополнительно", "TITLE" => "Расширенные опции"]
]);
if ($_SERVER["REQUEST_METHOD"] == "POST" && strlen($_POST["save"])>0) {
// сохранение
}
$tabControl->Begin();
$tabControl->BeginNextTab();
// поля первой вкладки
$tabControl->End();
Сложность:
Необходимость вручную управлять состоянием вкладок через GET-параметры, что может вызывать потерю данных. Рекомендуется хранить временные данные в таблице b_option или сессии.
Как использовать Vue.js в административной части для создания динамического интерфейса?
Подключается расширение ui.vue3 и ui.vue.components.hint. Пример:
\Bitrix\Main\UI\Extension::load("ui.vue3");
$APPLICATION->IncludeComponent("bitrix:ui.vue", "", [
"CONTENT" => '{{ message }}'
]);
Ограничение:
Не все стандартные обработчики Bitrix (кнопки сохранить) корректно работают с динамическими формами. Требуется дополнительный код для отправки данных через Ajax.
Подробные примеры реализации администрирования модулей
Пример 1. Страница настроек с валидацией и сохранением (современный UI)
Создаётся файл /local/modules/my.module/admin/settings.php. В нём подключаются пролог, получается объект запроса и обрабатываются POST-данные.
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php";
\Bitrix\Main\Loader::includeModule("my.module");
use Bitrix\Main\Context;
use Bitrix\Main\Localization\Loc;
$request = Context::getCurrent()->getRequest();
$errors = [];
if ($request->isPost() && check_bitrix_sessid()) {
$siteName = $request->getPost("site_name");
if (empty($siteName)) {
$errors[] = "Поле 'Название сайта' обязательно";
} else {
\Bitrix\Main\Config\Option::set("my.module", "SITE_NAME", $siteName);
}
}
$currentValue = \Bitrix\Main\Config\Option::get("my.module", "SITE_NAME", "");
$APPLICATION->SetTitle(Loc::getMessage("MY_MODULE_SETTINGS"));
require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php";
?>
<form method="post">
<?= bitrix_sessid_post() ?>
<label>Название сайта:<br><input type="text" name="site_name" value="<?= htmlspecialcharsbx($currentValue) ?>"></label>
<?php if (!empty($errors)): ?>
<p style="color:red"><?= implode("<br>", $errors) ?></p>
<?php endif; ?>
<input type="submit" value="Сохранить" name="save">
</form>
<?php require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php";?>
Результат:
Страница с полем ввода и кнопкой. При пустом значении отображается ошибка.
Пример 2. Обработка событий установки/удаления модуля
В файле /local/modules/my.module/include.php регистрируются обработчики:
<?php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
"main",
"OnBeforeModuleUninstall",
function ($moduleId) {
if ($moduleId === "my.module") {
// Удаление созданных таблиц
$connection = \Bitrix\Main\Application::getConnection();
$connection->queryExecute("DROP TABLE IF EXISTS my_table");
}
}
);
?>
Результат:
При удалении модуля таблица my_table автоматически удаляется.
Пример 3. Добавление агента при установке модуля
Метод в классе, вызываемом при установке:
public function installDB() {
\Bitrix\Main\Config\Option::set("my.module", "VERSION", "1.0");
\CAgent::AddAgent(
"\MyModule\Agent::cleanOldData();",
"my.module",
"N",
86400,
"",
"Y",
date("d.m.Y H:i:s", time() + 86400),
30
);
}
Результат:
Агент MyModule\Agent::cleanOldData() будет выполняться раз в сутки.
Пример 4. Работа с правами доступа к модулю
Создание операции и привязка к странице:
\Bitrix\Main\Access\AccessCode::add(
"my.module",
"settings",
["title" => "Доступ к настройкам"]
);
// Проверка в коде страницы:
if (!\Bitrix\Main\Access\AccessController::can(
$USER->GetID(),
"my.module",
"settings"
)) {
$APPLICATION->AuthForm("Доступ запрещен");
}
Результат:
Пользователи без права доступа не смогут увидеть страницу настроек.