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

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

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

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

Более наглядно: перед запуском сайта был произведен обмен с 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-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Вывести разделы инфоблока в которых находится элемент Битрикс Просмотров: 16018 Если нужно в карточке товара или новости, вывести структуру разделов в котором находится э... Вывести все разделы в которых находится элемент инфоблока Просмотров: 13027 Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоб... Добавить свойство в административную форму заказа Просмотров: 2809 Задача, кастомизировать административную форму заказа: добавить свойство заказа в шапку фо... Получить и вывести пользовательские свойства склада в 1С-Битрикс Просмотров: 1322 Задача: вывести пользовательские свойства в подробном описании склада. При этом, есть и мн... Регистрация пользователя в определенную группу сайта на Битрикс Просмотров: 22094 Достаточно часто требуется регистрировать пользователя в определенную группу, в зависимост... Показать только один тип цены в каталоге Битрикс Просмотров: 13742 Достаточно часто, при создании сайта на битрикс, можно столкнуться с такой проблемой: на с... Информация о заказах и содержимое корзины текущего пользователя. Просмотров: 11776 В процессе разработки сайта могут понадобиться рецепты приведенные ниже. Использовать можн... Картинка торгового предложения вместо иконки цвета, в выборе SKU Просмотров: 270 Задача: вместо не информативных иконок цветов нужно вывести детальную картинку торгового п... Данные о заказе текущего пользователя Просмотров: 12901 Иногда нужно получить данные о заказе текущего пользователя. Не через компонент, а непосре... Вывести имя пользователя добавившего элемент инфоблока в Битрикс Просмотров: 16040 Иногда, необходимо вывести имя пользователя добавившего элемент инфоблока. Например, автор... Минимальная сумма заказа в корзине и оформлении заказа в 1С-Битрикс Просмотров: 8484 В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне кор... Сортировка элементов по индексу сортировки значений типа список Просмотров: 10545 Внутри любого компонента есть заранее заложенные поля для сортировки элементов. МОжно сорт... Увидеть файл заказов который передаст Битрикс в 1С Просмотров: 23306 Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей,... Открытие мобильного приложения Apache Cordova по ссылке Просмотров: 683 Достаточно часто нужно реализовывать открытие мобильного приложения по ссылке. Например: п... Пункты меню из разделов инфоблока Битрикс Просмотров: 90688 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Фиксированная корзина с обновлением, без перезагрузки страницы. Просмотров: 17499 Иногда нужно сделать так, чтобы корзина в интернет магазине, созданном на Битрикс, была по... Вывести товары из того же раздела в карточке товара Просмотров: 17947 Немножко топорный, но все же вполне действенный способ по выводу внутри подробной карточки... Ajax форма обратной связи, реализация в битрикс Просмотров: 7577 Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в... Как вывести картинки к разделам на базе _ext меню Просмотров: 7085 Просто для эстетической красоты, нужно вывести в меню разделов сайта картинки или иконки. ... Denwer c PHP 7.1.8 и MYSQL 5.7 оптимизированный для Битрикс Просмотров: 29517 В последнее время, все чаще приходиться работать на Windows, хотя и не люблю эту ОС- с точ...