Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

Заполнить картинки разделов каталога из картинок товаров

Просмотров: 943

Задача: в каталоге, разделы и подразделы выводятся в виде плитки над товарами, с картинками разделов.
Так как разделов и подразделов очень много, необходимо использовать картинку любого товара из раздела.
При этом, сохранив возможность добавлять картинку в раздел, штатно, из свойства.

Более наглядно: перед запуском сайта был произведен обмен с 1С и каталоге более 3000 разделов и подразделов. Так как сайт нужно было запускать срочно, а времени и возможности добавить картинку к каждому разделу не было, но и запускать с "пустыми" картинками не хотелось:

Заполнить картинки разделов каталога из картинок товаров

Принято решение использовать картинку первого попавшегося товара из раздела. При этом сохранив возможность указания своей картинки для раздела.

Заполнить картинки разделов каталога из картинок товаров

Со временем, все картинки будут добавлены и можно будет удалить участок кода отвечающий за "выхватывание" картинки товара.

Получение товара раздела и его картинки

Собственно, все просто: открываем на редактирование шаблон catalog.section.list, который отвечает за отображение разделов плиткой и добавляем в него следующий код.

foreach ($arResult["SECTIONS"] as $arSection) {
	if (!empty($arSection["PICTURE"]['SRC'])) {
	    $sectImg = $arSection["PICTURE"]['SRC'];
	} else {
	    $elWithPicture = CIBlockElement::GetList(
		        array("ID" => "ASC"),
		        array(
		            "IBLOCK_ID" => $arSection['IBLOCK_ID'],
		            "SECTION_ID" => $arSection['ID'],
		            "!DETAIL_PICTURE" => false
		        ),
		        false,
		        array('nTopCount' => 1),
		        array('DETAIL_PICTURE')
	        );
	    while ($arPict = $elWithPicture->Fetch()) {
	        $renderImage2 = CFile::ResizeImageGet(
	           	$arPict["DETAIL_PICTURE"], array("width" => 200, "height" => 200), BX_RESIZE_IMAGE_EXACT, false
	        );
	        $sectImg = $renderImage2['src'];
	    }
	    if (empty($sectImg)) {
	        $sectImg = '/local/img/nophoto.jpg';
	    }
	}

	echo $sectImg; // Тут уже верстка
}

Если !empty($arSection["PICTURE"]['SRC']): если у раздела есть картинка, записываем ее в переменную $sectImg и больше ни чего не делаем.

Если картинки нет, с помощью CIBlockElement::GetList получаем товары этого раздела. В фильтре используем параметр "!DETAIL_PICTURE" => false который отберет товары с наличием детальной картинки (так как, не у всех товаров может быть эта картинка).

Так же используем 'nTopCount' => 1, что бы получить только один товар, дабы не вызывать нагрузку и большое количество запросов.

Так как, детальная картинка товара может быть очень большой, что бы не перегружать сеть и не портить производительность сайта используем CFile::ResizeImageGet, меняя размер картинки в 200 на 200 пикселей.

И в переменную $sectImg записываем эту отмасштабированную картинку. Если ни одного товара, с картинкой, нет в разделе- используем заглушку nophoto.jpg

На этом все. Далее используем $sectImg в качестве пути к картинке.

Михаил Базаров 29.10.2022
Если планируете использовать этот пример на постоянной основе и не планируете добавлять свою картинку для разделов: лучше вынесите логику в result_modifier.php расширив массив $arResult["SECTIONS"].

Если хотите, для прикола и красоты, показывать случайную картинку, используйте рандомную сортировку.
Вместо:
Код
array("ID" => "ASC"),

используйте
Код
array("RAND" => "ASC"),

Картинки будут меняться согласно настройкам кеширования

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Базовая защита "Битрикс виртуальная машина" от DDoS атак. Просмотров: 5856 Данный способ защиты не панацея, и скорее всего не спасет от профессиональной DDoS атаки, ... Вывести информацию, только на первом уровне раздела каталога, в 1С-Би... Просмотров: 5561 Задача: на сайте, в каталоге, выводится два фильтра - боковой и верхний. Оба компонента по... Адаптивное гамбургер меню для битрикс Просмотров: 15139 Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В а... Получение доступа к железу устройства из Битрикс мобильное приложение Просмотров: 6297 Документация к мобильному приложению 1С-Битрикс очень куцая. В основном описывает функцион... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 37972 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Индивидуальные цены в 1С-Битрикс: в каталоге и при оформлении заказа Просмотров: 6055 В этой заметке постараюсь описать процесс реализации индивидуальных цен, для пользователей... Автоматически отгрузить заказ и сменить статус отгрузки, при выполнен... Просмотров: 950 Проблема: Заказы, на сайте, обрабатываются только в 1С. При этом 1С не работает с отгрузка... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1608 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Создание мобильного приложения на cordova, для любого сайта. Просмотров: 15874 Если стоит задача разработки мобильного приложения для сайта, можете воспользоваться данно... Пункты меню из разделов инфоблока Битрикс Просмотров: 93234 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Вывести все товары, с постраничной навигацией, из всех разделов инфоб... Просмотров: 29884 По сути, эта заметка, небольшой лайфхак. Достаточно часто нужно, в корне каталога, в ТОП-е... Дополнительные параметры в меню Битрикс Просмотров: 20769 Иногда нужно присвоить какой-то функционал к конкретному пункту меню в битрикс. Например о... Если папка то применяем...в Битрикс Просмотров: 30407 Бывает, стоит задача применить какой-либо стиль или вывести конкретный кусочек кода для ди... Отфильтровать новости в Битрикс за заданный период Просмотров: 16690 Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компо... Если предложение SKU в корзине, поменять кнопку добавления на "В корз... Просмотров: 3881 Данная заметка является дополнением к ранее опубликованной: Есл... Установка веб-сервера LAMP на ubuntu 20.04 LTS, оптимизированный под ... Просмотров: 12750 В последнее время, плотно пересел c macOS на ubuntu, и решил настроить себе полноценное ра... Ленивая подгрузка картинок в компоненте, на vue js Битрикс Просмотров: 10348 Если на одну страницу сайта выводится большое количество картинок, которые могут долго под... XML в формате Commerce ML-2, города России и Мира, для выгрузки в инф... Просмотров: 6961 Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и... Увидеть файл заказов который передаст Битрикс в 1С Просмотров: 24492 Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей,... Умный фильтр только на последнем уровне разделов каталога. Просмотров: 11682 Если в разработаываемом магазине или в принципе в каталоге на Битрикс, вы выводите умный ф...