Кастомизация элементов инфоблоков через PHP
Основные подходы к изменению списка инфоблоков в административной части
В CMS 1С-Битрикс административный список элементов инфоблоков (файл iblock_list_admin.php) предоставляет базовый функционал. Однако часто требуется добавить пользовательские колонки, фильтры или действия. В этой части рассмотрены несколько решений, от самых современных до устаревших. Наиболее эффективным способом является использование событий модуля iblock.
Как добавить произвольную колонку через событие OnGetList?
Событие OnGetList модуля iblock позволяет модифицировать список элементов перед его отображением. Для этого необходимо зарегистрировать обработчик в файле init.php и определить функцию, которая получает массив данных и добавляет новые поля.
// Файл init.php
AddEventHandler("iblock", "OnGetList", "addCustomColumnHandler");
function addCustomColumnHandler(&$arResult, $arParams) {
// $arResult - массив с данными списка
// $arParams - параметры вызова
if ($arParams["IBLOCK_ID"] == 17) { // ID инфоблока "Товары"
// Добавляем колонку "Остаток"
$arResult["columns"]["STOCK_QUANTITY"] = "Остаток на складе";
// Наполняем значения для каждого элемента
foreach ($arResult["rows"] as &$row) {
$elementId = $row["ID"];
// Получаем количество из пользовательского поля или отдельного запроса
$stock = \Bitrix\Iblock\ElementTable::getList([
"filter" => ["ID" => $elementId],
"select" => ["PROPERTY_STOCK"]
])->fetch();
$row["STOCK_QUANTITY"] = $stock["PROPERTY_STOCK_VALUE"] ?? 0;
}
unset($row);
}
}
Iblock list admin php (администрирование списка инфоблоков php)
// В результате в списке появится колонка "Остаток на складе" с соответствующими значениями.
Вариант 1. Создание собственной страницы на основе CAdminList
Класс CAdminList позволяет полностью контролировать отображение списка. Можно создать отдельную страницу в /bitrix/admin/my_list.php, унаследовать функционал и добавить нужные колонки и действия.
// my_list.php
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php");
$IBLOCK_ID = 17;
$iblock = new CIBlock;
$rsIBlock = $iblock->GetByID($IBLOCK_ID);
$arIBlock = $rsIBlock->Fetch();
$sTableID = "tbl_iblock_list_custom";
$oList = new CAdminList($sTableID, $arIBlock["NAME"]);
// Добавляем колонку
$oList->AddHeaders([
["id" => "ID", "content" => "ID", "sort" => "ID", "default" => true],
["id" => "NAME", "content" => "Название", "sort" => "NAME", "default" => true],
["id" => "CUSTOM", "content" => "Мое поле", "default" => true],
]);
// Получаем данные
$arFilter = [];
$rsElements = CIBlockElement::GetList([], ["IBLOCK_ID" => $IBLOCK_ID]);
while ($arElement = $rsElements->Fetch()) {
$arElement["CUSTOM"] = "Значение " . $arElement["ID"];
$oList->AddRow($arElement["ID"], $arElement);
}
$oList->CheckListMode();
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
$oList->DisplayList();
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
Вариант 2. Прямое редактирование iblock_list_admin.php
Можно внести изменения непосредственно в файл /bitrix/admin/iblock_list_admin.php. Этот метод не рекомендуется, так как при каждом обновлении ядра изменения будут потеряны. Однако для быстрой правки на одной копии сайта может быть использован.
// В файле iblock_list_admin.php после строки с определением колонок добавляем:
$arHeaders[] = array("id" => "CUSTOM_COLUMN", "content" => "Кастом", "sort" => false, "default" => true);
// В цикле вывода строк добавляем:
$arRes["CUSTOM_COLUMN"] = "Мое значение";
Вариант 3. Использование OnBeforeProlog для добавления действия
Событие OnBeforeProlog позволяет перехватить выполнение страницы административного раздела и добавить свои кнопки или обработать запрос.
AddEventHandler("main", "OnBeforeProlog", "addCustomButtonHandler");
function addCustomButtonHandler() {
if (strpos($_SERVER["REQUEST_URI"], "iblock_list_admin.php") === false) return;
// Добавляем кнопку в панель
$GLOBALS["APPLICATION"]->AddPanelButton([
"HREF" => "?custom_action=export",
"TEXT" => "Экспорт в CSV",
"ICON" => "btn_list",
]);
}
В верхней панели над списком появится кнопка "Экспорт в CSV".
Вариант 4. Использование модуля 'Управление структурой' для создания собственных страниц
Модуль 'Управление структурой' позволяет создавать кастомные административные страницы на основе компонентов. Это высокоуровневый подход, но требует настройки компонентов и шаблонов.
// Пример регистрации нового пункта меню в .settings.php или custom_menu.php
AddEventHandler("main", "OnBuildGlobalMenu", function(&$arGlobalMenu, &$arModuleMenu) {
$arGlobalMenu["my_menu"] = [
"menu_icon" => "iblock",
"page_icon" => "iblock",
"text" => "Мои списки",
"items_id" => "my_iblock_list",
"items" => [
[
"text" => "Кастомный список",
"url" => "my_iblock_list.php",
"more_url" => [],
"title" => "Просмотр кастомного списка",
]
]
];
});
Расширенные примеры кастомизации списка инфоблоков
В этом разделе представлены нестандартные примеры, которые могут потребоваться в реальных проектах.
Колонка с вычисляемым значением (цена с налогом)
Добавляем колонку, где цена умножается на коэффициент НДС.
AddEventHandler("iblock", "OnGetList", function(&$arResult, $arParams) {
if ($arParams["IBLOCK_ID"] != 17) return;
$arResult["columns"]["PRICE_WITH_TAX"] = "Цена с НДС";
foreach ($arResult["rows"] as &$row) {
$price = $row["CATALOG_PRICE_1"] ?? 0;
$taxRate = 0.20; // 20% НДС
$row["PRICE_WITH_TAX"] = round($price * (1 + $taxRate), 2);
}
unset($row);
});
В списке появится колонка, показывающая цену с налогом.
Колонка с ссылкой на редактирование элемента
Выводится HTML-ссылка в ячейке списка.
AddEventHandler("iblock", "OnGetList", function(&$arResult, $arParams) {
if ($arParams["IBLOCK_ID"] != 17) return;
$arResult["columns"]["DETAIL_LINK"] = "Ссылка";
foreach ($arResult["rows"] as &$row) {
$elementId = $row["ID"];
$row["DETAIL_LINK"] = "Редактировать";
}
unset($row);
});
В колонке отображается кликабельная ссылка на страницу редактирования.
Собственная страница с фильтром по свойству
Создаётся отдельная страница с расширенным фильтром, используя CAdminFilter.
// my_list_filtered.php
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/prolog.php");
$IBLOCK_ID = 17;
$oList = new CAdminList("tbl_my_filtered");
$oList->AddHeaders([
["id"=>"ID","content"=>"ID","sort"=>"ID","default"=>true],
["id"=>"NAME","content"=>"Название","sort"=>"NAME","default"=>true],
["id"=>"COLOR","content"=>"Цвет","default"=>true],
]);
$oFilter = new CAdminFilter($oList->table_id."_filter", [["id"=>"COLOR","name"=>"Цвет","type"=>"select","value"=>["Красный","Синий","Зеленый"]]]);
if ($_SERVER["REQUEST_METHOD"]=="GET" && isset($_GET["COLOR"])) {
$filter["PROPERTY_COLOR"] = $_GET["COLOR"];
}
$rs = CIBlockElement::GetList([], ["IBLOCK_ID"=>$IBLOCK_ID, "PROPERTY_COLOR"=>$filter["PROPERTY_COLOR"]]);
while($ar = $rs->Fetch()) {
$ar["COLOR"] = "Цвет из свойства";
$oList->AddRow($ar["ID"], $ar);
}
$oList->CheckListMode();
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
$oFilter->Display();
$oList->DisplayList();
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
Отображается форма фильтра и список отфильтрованных элементов.
Массовое действие через групповые операции
Добавляет собственное действие в выпадающий список групповых операций.
// В самодельной странице (my_list.php) после AddHeaders
$oList->AddGroupAction([
"action" => "set_stock_zero",
"id" => "set_stock_zero",
"value" => "set_stock_zero",
"name" => "Обнулить остаток",
]);
// Обработка в начале страницы
if ($_SERVER["REQUEST_METHOD"]=="POST" && isset($_POST["action"]) && $_POST["action"]=="set_stock_zero") {
foreach ($_POST["ID"] as $id) {
CIBlockElement::SetPropertyValuesEx($id, $IBLOCK_ID, ["STOCK" => 0]);
}
}
В списке появляется пункт "Обнулить остаток", при выборе элементов и нажатии "Применить" выполняется массовое обновление.