Редактируем админку 1С-Битрикс. Добавление и вывод значений в списке элементов инфоблока.

1С-Битрикс

Была поставлена задача: «для списка элементов в инфоблоке вывести рядом количество всего/активных/неактивных связанных элементов другого инфоблока»

Исходные данные в виде 2 инфоблока:

  1. Товары. Поле бренд (привязка к элементам инфоблока)
  2. Бренды. Те самые элементы привязки из пункта 1

Данная таблица генерируется в ядре Битрикса, и мы как разумные люди туда не полезем, поэтому будет кастомизировать.

Для этого в файле init.php необходимо добавить обработку события, отвечающую за вывод данного списка. В этом нам поможет событие «OnAdminListDisplay»

AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminListDisplay");
function MyOnAdminListDisplay(&$list)
{

}

Чтобы наши новые поля не вылезли там где им не следует, делаем проверку по условию:

if (strstr($list->table_id,"tbl_iblock_element") && $_REQUEST["IBLOCK_ID"] == 2)

$_REQUEST["IBLOCK_ID"] – у Вас может отличаться

Внутри условия необходимо для начала создать колонки (headers) с помощью следующей конструкции

$list->aVisibleHeaders["ALL_ITEM"] =
 array(
     "id" => "ALL_ITEM",
     "content" => 'Количество позиций (всего)',
 );

Тоже самое делается и для остальных необходимых полей.

На данный момент в списке появятся новые столбцы с нужными названиями.

Но значения в ячейка по-прежнему пусты. Для того чтобы заполнить их нужной информацией необходимо в цикле пройтись по каждой строке данных из выборке и добавить получение значений

foreach ($list->aRows as &$row){ 
   $all = CIBlockElement::GetList(
      array(),
      array('IBLOCK_ID' => 1,  "INCLUDE_SUBSECTIONS"=>"Y", "PROPERTY_brand"=>$row->id),
      array(),
      false,
      array('ID', 'NAME')
   ); 
   $active = CIBlockElement::GetList(
      array(),
      array('IBLOCK_ID' => 1, "ACTIVE"=>"Y", "INCLUDE_SUBSECTIONS"=>"Y", "PROPERTY_brand"=>$row->id),
      array(),
      false,
      array('ID', 'NAME')
   ); 
   
   $row->addField(
              'ALL_ITEM',
              (int)$all
          );
    $row->addField(
              'ACTIVE_ITEM',
              (int)$active
          );
    $row->addField(
              'DEACTIVE_ITEM',
              (int)$all - (int)$active
          );
}

заметьте, что первый параметр «$row->addField» это ключи заданные в «$list->aVisibleHeaders["ALL_ITEM"]» говорит о том, что там мы Битриксу даем понять какое значение в какую колонку выводить.

Итоговый код

AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminListDisplay");
function MyOnAdminListDisplay(&$list)
{
   
    if (strstr($list->table_id,"tbl_iblock_element") && $_REQUEST["IBLOCK_ID"] == 2) {
        
        $list->aVisibleHeaders["ALL_ITEM"] =
         array(
             "id" => "ALL_ITEM",
             "content" => 'Количество позиций (всего)',
         );        

      $list->aVisibleHeaders["ACTIVE_ITEM"] =
         array(
             "id" => "ACTIVE_ITEM",
             "content" => 'Количество позиций (активных)',
         );        

      $list->aVisibleHeaders["DEACTIVE_ITEM"] =
         array(
             "id" => "DEACTIVE_ITEM",
             "content" => 'Количество позиций (неактивных)',
         );        
      
        foreach ($list->aRows as &$row){ 
         $all = CIBlockElement::GetList(
            array(),
            array('IBLOCK_ID' => 1,  "INCLUDE_SUBSECTIONS"=>"Y", "PROPERTY_brand"=>$row->id),
            array(),
            false,
            array('ID', 'NAME')
         ); 
         $active = CIBlockElement::GetList(
            array(),
            array('IBLOCK_ID' => 1, "ACTIVE"=>"Y", "INCLUDE_SUBSECTIONS"=>"Y", "PROPERTY_brand"=>$row->id),
            array(),
            false,
            array('ID', 'NAME')
         ); 
         
         $row->addField(
                'ALL_ITEM',
                (int)$all
            );
          $row->addField(
                'ACTIVE_ITEM',
                (int)$active
            );
          $row->addField(
                'DEACTIVE_ITEM',
                (int)$all - (int)$active
            );
      }  
    }
} 

Результат выполнения, следующий:

Подобным образом можно настроить таблицу под свои нужды.

В следующей статье рассмотрим как теперь новые поля добавить в выгрузку Excel из этого же раздела.