Разработка административного интерфейса в 1С-Битрикс на PHP
Административная панель 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.