Как автоматически установить картинку раздела на основе товара из этого раздела в CMS 1С-Битрикс. Разбор кода

В этой статье мы рассмотрим, как автоматически установить картинку раздела на основе товара в CMS 1С-Битрикс. Это полезно, если нужно связать разделы с изображениями товаров и автоматически их обновлять.

Как автоматически установить картинку раздела на основе товара в Битрикс

Код:


\Bitrix\Main\Loader::includeModule('iblock');

$arRes = CIBlockSection::GetList(
    ['SORT' => 'ASC'],
    [
        'IBLOCK_ID' => 17,
        'PICTURE' => false,
    ],
    true,
    [
        'ID',
        'IBLOCK_ID',
        'NAME',
    ]
);

while ($arSection = $arRes->GetNext()) {
    var_dump($arSection);

    $res = CIBlockElement::getlist(
        ["SORT" => "ASC"],
        [
            "IBLOCK_ID" => 17,
            'ACTIVE' => 'Y',
            '!PREVIEW_PICTURE' => false,
            'SECTION_ID' => $arSection['ID'],
            'INCLUDE_SUBSECTIONS' => 'Y'
        ],
        false,
        false,
        ["ID", "NAME", "PREVIEW_PICTURE"]
    );

    $arElement = $res->GetNext();
    var_dump($arElement);

    $arFile = CFile::MakeFileArray($arElement["PREVIEW_PICTURE"]);
    var_dump($arFile);

    $sec = new CIBlockSection;
    $sec->Update($arSection['ID'], ['PICTURE' => $arFile]);
}
    

Описание работы кода:

Этот скрипт предназначен для того, чтобы автоматически установить картинку для раздела в 1С-Битрикс на основе картинки первого товара в этом разделе или его подразделах. Рассмотрим каждый шаг этого кода.

1. Подключение модуля "iblock":


\Bitrix\Main\Loader::includeModule('iblock');
    

Этот код подключает необходимый модуль `iblock`, который предоставляет функции для работы с инфоблоками в Битрикс. Без этого модуля функции для работы с инфоблоками (такие как `CIBlockSection` и `CIBlockElement`) не будут доступны.

2. Получение разделов инфоблока без картинок:


$arRes = CIBlockSection::GetList(
    ['SORT' => 'ASC'],
    [
        'IBLOCK_ID' => 17,
        'PICTURE' => false,
    ],
    true,
    [
        'ID',
        'IBLOCK_ID',
        'NAME',
    ]
);
    

Здесь происходит выборка всех разделов из инфоблока с ID `17`, у которых еще не установлена картинка (параметр `PICTURE` равен `false`). Сортировка разделов идет по полю `SORT` в порядке возрастания. В результате переменная `$arRes` будет содержать все разделы, которые необходимо обработать.

3. Перебор разделов и поиск товаров:


while ($arSection = $arRes->GetNext()) {
    var_dump($arSection);
    

Мы начинаем цикл, который перебирает каждый раздел, возвращаемый запросом. На каждой итерации переменная `$arSection` будет содержать информацию о текущем разделе.

4. Поиск товаров в разделе:


$res = CIBlockElement::getlist(
    ["SORT" => "ASC"],
    [
        "IBLOCK_ID" => 17,
        'ACTIVE' => 'Y',
        '!PREVIEW_PICTURE' => false,
        'SECTION_ID' => $arSection['ID'],
        'INCLUDE_SUBSECTIONS' => 'Y'
    ],
    false,
    false,
    ["ID", "NAME", "PREVIEW_PICTURE"]
);
    

Для каждого раздела выполняется запрос на поиск товаров (элементов инфоблока) в этом разделе и его подразделах. Параметр `'INCLUDE_SUBSECTIONS' => 'Y'` позволяет искать товары и в подразделах текущего раздела. Также фильтруются товары, у которых нет картинки (по полю `PREVIEW_PICTURE`).

5. Получение первого найденного товара:


$arElement = $res->GetNext();
var_dump($arElement);
    

Из всех товаров, которые были найдены, мы берем первый (через `GetNext()`), и в переменной `$arElement` будет содержаться информация о товаре, включая его картинку (`PREVIEW_PICTURE`).

6. Подготовка картинки:


$arFile = CFile::MakeFileArray($arElement["PREVIEW_PICTURE"]);
var_dump($arFile);
    

Если у товара есть картинка, то с помощью функции `CFile::MakeFileArray` эта картинка преобразуется в формат, который можно использовать для установки в раздел. В переменной `$arFile` будет храниться готовый массив, содержащий данные о файле изображения.

7. Обновление картинки раздела:


$sec = new CIBlockSection;
$sec->Update($arSection['ID'], ['PICTURE' => $arFile]);
    

В этом шаге мы создаем объект класса `CIBlockSection` и с помощью метода `Update` устанавливаем картинку раздела (`PICTURE`) на картинку товара, найденного в предыдущем шаге.

Заключение:

Этот код позволяет автоматически обновить картинку раздела инфоблока в 1С-Битрикс, присвоив ее изображению одного из товаров, который находится в этом разделе или его подразделах. Это полезно, если нужно связать разделы с изображениями товаров и автоматически их обновлять. Такой подход также сокращает время на ручное обновление картинок, что особенно важно при большом количестве разделов и товаров.

Теги:  рецепты, разбор кода

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр