Михаил Базаров Разработка на 1С-Битрикс Михаил Базаров

Вывести изображения из свойства "Цвет" (HL блок) в дополнительных картинках торговых предложений

Внимание! Все сообщения на форуме проходят модерацию. Ваше сообщение появится после проверки.
Вывести изображения из свойства "Цвет" (HL блок) в дополнительных картинках торговых предложений

Задача: в SKU, у которых есть свойство "Цвет" нужно вывести картинку цвета в дополнительные
фотографии и в слайдер. Цвет хранится в Highload-блоке, каждому цвету соответствует изображение файла
(например, фото цвета или образца).
Вариант кода без использования функции, получение массива файлов до добавления в предложения.

С использованием функции: для каждого предложения вызывается getOfferColor(), которая выполняет запрос к базе, что увеличивает общее время обработки, особенно при большом количестве предложений.

Без функции (вариант с предварительной загрузкой): все данные загружаются один раз, и далее просто осуществляется поиск в массиве — быстрее и эффективнее.
Код
// Используем пространство имен для работы с Highload-блоками Bitrix
use Bitrix\Highloadblock as HL;

// Получаем объект класса DataClass для работы с конкретным Highload-блоком по его ID (здесь ID 2)
$entity_Data_Class = HL\HighloadBlockTable::compileEntity(
    HL\HighloadBlockTable::getById(2)->fetch()
)->getDataClass();

// Создаем массив для хранения соответствий XML_ID цвета и файла изображения
$colorFilesMap = [];

// Получаем все элементы Highload-блока для предварительной обработки
$rsColors = $entity_Data_Class::getList([
    'select' => ['UF_XML_ID', 'UF_FILE']
]);

// Заполняем массив соответствий: XML_ID => данные файла
while ($colorData = $rsColors->fetch()) {
    if (!empty($colorData['UF_FILE'])) {
        $colorFilesMap[$colorData['UF_XML_ID']] = CFile::GetFileArray($colorData['UF_FILE']);
    }
}

// Теперь обходим торговые предложения и добавляем изображения по необходимости
foreach ($arResult['OFFERS'] as $k => $offer) {
    if (!empty($offer['PROPERTIES']['COLOR_REF']['VALUE'])) {
        $xmlId = $offer['PROPERTIES']['COLOR_REF']['VALUE'];
        // Проверяем, есть ли изображение для этого цвета
        if (isset($colorFilesMap[$xmlId])) {
            $arColorFile = $colorFilesMap[$xmlId];
            // Добавляем изображение в массив фото
            $arResult['OFFERS'][$k]['MORE_PHOTO'][] = $arColorFile;
            // Добавляем изображение в массив для JS-обработчика
            $arResult['JS_OFFERS'][$k]['SLIDER'][] = $arColorFile;
        }
    }
}
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Загрузить файлы
 

Блог-note Заметки по 1С-Битрикс