Разработка административного интерфейса модуля в Bitrix

Раздел: Разработка на Bitrix Framework -> Администрирование модулей 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("Доступ запрещен");
}

Результат:

Пользователи без права доступа не смогут увидеть страницу настроек.

Администрирование модулей Bitrix на PHP - comments

En
Bitrix admin module admin php (php)