Разработка административного интерфейса в 1С-Битрикс на PHP

Раздел: Администрирование веб-приложений -> Администрирование 1С-Битрикс

Административная панель Bitrix (bitrix admin php) представляет собой мощный инструмент для управления сайтом. Однако стандартная конфигурация не всегда покрывает все потребности. В этой статье рассматриваются способы расширения функциональности, добавления собственных пунктов меню и обработчиков, а также решение часто возникающих проблем.

Основные подходы к модификации админ-панели

Как добавить свой пункт в главное меню администратора?

Наиболее эффективное решение заключается в создании собственного модуля с регистрацией пункта меню через событие OnBuildGlobalMenu. Пример кода для файла /local/modules/example.module/install/index.php:


<?php
// регистрируем обработчик события
RegisterModuleDependences('main', 'OnBuildGlobalMenu', 'example.module', 'CExampleTools', 'HandleBuildMenu');
?>

Bitrix admin php (админ-панель bitrix)

Сам обработчик реализуется в классе CExampleTools:


<?php
class CExampleTools {
    public static function HandleBuildMenu(&$arGlobalMenu, &$arModuleMenu) {
        $arGlobalMenu['example_menu'] = array(
            'menu_id' => 'example_menu',
            'text' => 'Мой модуль',
            'title' => 'Собственный модуль',
            'sort' => 100,
            'items_id' => 'example_menu_items',
            'items' => array(
                array(
                    'text' => 'Список элементов',
                    'url' => 'example_list.php?lang=' . LANGUAGE_ID,
                    'more_url' => array(),
                    'title' => 'Управление элементами',
                ),
            ),
        );
    }
}
?>

После установки модуля в административной панели появляется новый раздел с пунктом. При переходе по ссылке нужно создать файл example_list.php в папке /bitrix/admin/ (или использовать роутинг через URL).

Типичные проблемы:

  • Пункт меню не отображается. Проверьте, зарегистрирован ли обработчик события в файле инсталлятора. Также необходимо очистить кэш административной панели (настройки -> инструменты -> очистка кэша).
  • Ошибка прав доступа. Убедитесь, что файл административного раздела (example_list.php) доступен только авторизованным пользователям с соответствующими правами.
  • Конфликт названий. Избегайте повторения идентификаторов строк меню, используйте уникальные префиксы.

Как изменить внешний вид шапки административной панели?

Вариант через переопределение шаблона. Скопируйте файл /bitrix/modules/main/install/admin/templates/bitrix24/header.php в /local/templates/.default/admin/header.php и измените необходимые блоки. Второй вариант – использовать стили CSS через глобальные настройки (Настройки -> Настройки продукта -> Оформление -> Дополнительные стили). Однако переопределение шаблона даёт больше гибкости, но требует внимательности при обновлении ядра.

Проблема: после обновления ядра изменения в файле header.php могут быть потеряны. Решение: хранить изменённый файл в локальном пространстве имен (/local/) или использовать обработчик события для динамической вставки кода.

Как добавить новую кнопку на страницу редактирования элемента инфоблока?

Через событие OnBeforeIBlockElementUpdate или OnIBlockElementAdd можно выполнить произвольный код. Но для добавления кнопки в интерфейс используется JavaScript API. Пример: в файле /bitrix/admin/iblock_element_edit.php можно вставить свой скрипт через обработчик OnAdminIBlockElementEdit. Однако рекомендуемый способ – через интеграцию в свой модуль с использованием CAdminTabControl и добавлением дополнительной вкладки.


// обработчик в init.php
AddEventHandler('iblock', 'OnAdminIBlockElementEdit', 'addCustomButton');
function addCustomButton(&$arJSButtons, &$arTabs) {
    $arJSButtons[] = array(
        'ID' => 'my_button',
        'TEXT' => 'Особая операция',
        'ONCLICK' => 'alert("Выполнено")',
    );
}

Ошибка: кнопка не появляется. Проверьте, что обработчик привязан к правильной странице (уточните ID события). Также возможно кэширование административных страниц – очистите кэш.

Как реализовать свою страницу настроек модуля в админ-панели?

Стандартный способ – создать PHP-файл в /bitrix/admin/ и использовать класс CAdminTabControl для вкладок. Пример структуры:


<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
$APPLICATION->SetTitle("Настройки модуля");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
?>
<form method="post">
<?=bitrix_sessid_post();?>
<?php
$tabControl = new CAdminTabControl("tabControl", array(
    array("DIV" => "edit1", "TAB" => "Основные", "ICON" => "", "TITLE" => "Основные настройки"),
));
$tabControl->Begin();
$tabControl->BeginNextTab();
?>
<tr>
    <td>Параметр 1:</td>
    <td><input type="text" name="param1" value=""></td>
</tr>
<?php
$tabControl->Buttons();
?>
<input type="submit" name="save" value="Сохранить" class="adm-btn-save">
<?php
$tabControl->End();
?>
</form>
<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
?>

После сохранения данных необходимо обработать POST-запрос в начале файла. Вариант с модулем: использовать метод COption::SetOptionString.

Типичная ошибка: сессия не прошла проверку. Убедитесь, что в форме есть bitrix_sessid_post() и в обработчике вызывается check_bitrix_sessid().

Рассмотренные методы позволяют гибко адаптировать административную панель Bitrix под конкретные задачи. При выборе варианта учитывайте версию ядра и наличие необходимых прав доступа.

Ниже приведены расширенные примеры с детальным пояснением кода и ожидаемым результатом.

Пример 1: Добавление пункта меню с подменю и обработкой прав

Пример

// /local/modules/my.tools/install/index.php
<?php
Class my_tools extends CModule {
    var $MODULE_ID = "my.tools";
    var $MODULE_NAME = "Мои инструменты";
    var $MODULE_DESCRIPTION = "Расширение админ-панели";
    function DoInstall() {
        RegisterModule("my.tools");
        RegisterModuleDependences('main', 'OnBuildGlobalMenu', 'my.tools', 'CMyTools', 'AddMenu');
    }
}
?>
Пример

// /local/modules/my.tools/include.php
<?php
class CMyTools {
    public static function AddMenu(&$arGlobalMenu, &$arModuleMenu) {
        $arGlobalMenu['my_tools'] = array(
            'menu_id' => 'my_tools',
            'text' => 'Мои инструменты',
            'title' => 'Утилиты',
            'sort' => 50,
            'items_id' => 'my_tools_items',
            'items' => array(
                array(
                    'text' => 'Список задач',
                    'url' => 'my_tools_task_list.php?lang=' . LANGUAGE_ID,
                    'more_url' => array('my_tools_task_edit.php'),
                    'title' => 'Управление задачами',
                    'icon' => 'sys_menu_icon',
                ),
            ),
        );
    }
}
?>
Результат: в левом меню администратора после установки модуля появляется раздел "Мои инструменты" с подпунктом "Список задач". При переходе открывается страница /bitrix/admin/my_tools_task_list.php.

Важно: для корректной работы прав доступа добавьте в файл my_tools_task_list.php проверку:

Пример

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_before.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/my.tools/include.php');
$APPLICATION->SetTitle('Список задач');
if (!$USER->IsAdmin()) {
    $APPLICATION->AuthForm('Недостаточно прав');
}
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_after.php');
// остальная логика

Пример 2: Создание AJAX-обработчика для админ-панели

Пример

// /bitrix/admin/my_tools_ajax.php
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_before.php');
define('STOP_STATISTICS', true);
define('NO_AGENT_CHECK', true);
define('DisableEventsCheck', true);
if (!$USER->IsAdmin()) {
    echo json_encode(['error' => 'Access denied']);
    die();
}
$action = $_REQUEST['action'] ?? '';
if ($action === 'get_data') {
    // имитация получения данных
    $result = ['status' => 'ok', 'data' => ['id' => 123, 'name' => 'Тест']];
    echo json_encode($result);
}
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_admin_after.php');
?>
Пример

// Пример вызова через JS на странице админ-панели
BX.ajax({
    url: '/bitrix/admin/my_tools_ajax.php',
    method: 'POST',
    data: {action: 'get_data'},
    onsuccess: function(response) {
        console.log(response);
    }
});
Результат: в консоли браузера отображается JSON-объект {"status":"ok","data":{"id":123,"name":"Тест"}}. Важно: в AJAX-ответе не должно быть лишнего вывода, поэтому используются константы STOP_STATISTICS и NO_AGENT_CHECK.

Пример 3: Добавление своей вкладки в настройки модуля (использование CAdminTabControl)

Пример

// /bitrix/admin/my_tools_settings.php
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_before.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/classes/general/admin_tabcontrol.php');
$APPLICATION->SetTitle('Настройки инструментов');
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_admin_after.php');
$tabControl = new CAdminTabControl('tabControl', array(
    array('DIV' => 'tab1', 'TAB' => 'Параметры', 'ICON' => '', 'TITLE' => 'Основные параметры'),
    array('DIV' => 'tab2', 'TAB' => 'Дополнительно', 'ICON' => '', 'TITLE' => 'Дополнительные настройки'),
));
if ($_SERVER['REQUEST_METHOD'] == 'POST' && check_bitrix_sessid()) {
    COption::SetOptionString('my.tools', 'param1', $_POST['param1']);
    COption::SetOptionString('my.tools', 'param2', $_POST['param2']);
    LocalRedirect($APPLICATION->GetCurPage().'?lang='.LANGUAGE_ID.'&tabControl_active_tab='.$_POST['tabControl_active_tab']);
}
$tabControl->Begin();
?>
<form method="post">
<?=bitrix_sessid_post();?>
<?php
$tabControl->BeginNextTab();
?>
<tr>
    <td width="40%">Параметр 1:</td>
    <td width="60%"><input type="text" name="param1" value="<?=htmlspecialcharsbx(COption::GetOptionString('my.tools', 'param1', ''))?>" size="50"></td>
</tr>
<?php
$tabControl->BeginNextTab();
?>
<tr>
    <td>Параметр 2:</td>
    <td><input type="text" name="param2" value="<?=htmlspecialcharsbx(COption::GetOptionString('my.tools', 'param2', ''))?>" size="50"></td>
</tr>
<?php
$tabControl->Buttons();
?>
<input type="submit" name="save" value="Сохранить" class="adm-btn-save">
<?php
$tabControl->End();
?>
</form>
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_admin.php');
?>
Результат: страница настроек с двумя вкладками, сохраняет параметры в базу через COption. При ошибке сессии появляется сообщение "Срок действия сессии истек".

Эти примеры покрывают наиболее востребованные сценарии кастомизации админ-панели Bitrix.

Админ-панель Bitrix - comments

En
Bitrix admin php (php)