Иногда встречаются сайты, когда, например, в каталоге изображения товаров добавляются то в анонс, то в деталку, то ресайзятся анонсы из деталки, о серьезных проблемах при смене дизайна мало кто задумывается.
Чтобы ресайзить изображения в списке товаров при выводе и когда неизвестно, детальная прилетит картинка или аноса, поможет вот этот код в шаблоне компонента в файле result_modifier.php
, всю логику максимально пишем в нем, для этого он и создан.
if($arResult['ITEMS']) {
foreach($arResult['ITEMS'] as $key => &$arItem) {
$arItem['PICTURE'] = array();
$picture = $arItem['DETAIL_PICTURE'] ? $arItem['DETAIL_PICTURE'] : $arItem['PREVIEW_PICTURE'];
if($picture) {
$arFileTmp = \CFile::ResizeImageGet(
$picture,
array('width' => 250, 'height' => 250),
BX_RESIZE_IMAGE_PROPORTIONAL,
true
);
if($arFileTmp['src'])
$arFileTmp['src'] = \CUtil::GetAdditionalFileURL($arFileTmp['src'], true);
$arItem['PICTURE'] = array_change_key_case($arFileTmp, CASE_UPPER);
}
}
}
Изображение товара выводим в template.php
<? if($arPicture = $arItem['PICTURE']): ?> <a href="<?=$arItem['DETAIL_PAGE_URL']?>"><img src="<?=$arPicture['SRC']?>" width="<?=$arPicture['WIDTH']?>" height="<?=$arPicture['HEIGHT']?>" alt="<?=$arItem['NAME']?>" title="<?=$arItem['NAME']?>"></a> <? endif ?>
Пояснения по коду
Здесь мы делаем ресайз изображений Битрикс до заданных размеров
CFile::ResizeImageGet();
Здесь добавляем к адресу файла метку версии файла, иначе хэш, для кэширования картинки в браузере клиента, проверьте, при повторном обновлении страницы список товаров будет заметно быстрее загружаться, практически моментально, т.к. все картинки закэшируются в вашем бразере на компьютере и при повторном запросе браузер их будет брать именно с ПК, а не с сервера, это самый простой и действенный вариант, когда нет возможности и знаний настраивать сам сервер и различные заголовки.
CUtil::GetAdditionalFileURL();
Результат в самом конце ?14778338342044
/upload/resize_cache/iblock/e00/64_64_190cf9bfc02c81ba0a02cc940d6445018/3pic.png?14778338342044
А эта php-функция преобразует в верхний регистр ключи массива, чтобы в едином стиле все было
array_change_key_case();