Решать задачу с уменьшением изображений приходится практически в любом проекте, так как это позволяет ускорить загрузку страницы и уменьшить передаваемый трафик. Решение такой задачи может потребоваться при выводе последних новостей, просмотренных товаров и во многих других случаях.
Один из вариантов решения - настройка информационного блока. Можно установить настройки изменения размера для загружаемых изображений. Но что если потребуется в одном месте выводить изображение, например, с шириной 100 пикселей, а в ленте с шириной 60 пикселей? В таком случае мы можем менять размер изображения в файле result_modifier.php компонента news.list или любого другого, работающего с выборкой из информационных блоков. Содержимое файла result_modifier.php для компонента bitrix:news.list будет следующим:
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); foreach($arResult["ITEMS"] as $i=>$arItem) { if (is_array($arItem["PREVIEW_PICTURE"])) { $ratio = $arItem["PREVIEW_PICTURE"]["WIDTH"] / $arItem["PREVIEW_PICTURE"]["HEIGHT"]; $width = 250; $height = round($width / $ratio); $img = CFile::ResizeImageGet($arItem["PREVIEW_PICTURE"], array("width" => $width, "height" => $height), BX_RESIZE_IMAGE_EXACT); $arResult["ITEMS"][$i]["PREVIEW_PICTURE"]["SRC"] = $img["src"]; $arResult["ITEMS"][$i]["PREVIEW_PICTURE"]["WIDTH"] = $width; $arResult["ITEMS"][$i]["PREVIEW_PICTURE"]["HEIGHT"] = $height; } }
Теперь все превью файлы будут уменьшаться до 250 пикселей в ширину. Высота высчитывается автоматически.
Функция CFile::ResizeImageGet
создает уменьшенную версию изображения всего 1 раз, при повторном обращении функция просто возвращает массив с путем до уменьшенной версии изображения. Данный сниппет можно доработать, например, вынести параметр $width
в настройки компонента (файл .parameters.php в папке шаблона).
Как видно файл result_modifier.php позволяет решить множество различных задач. В будущем мы рассмотрим связку файла result_modifier.php с .parameters.php, на примере доработки этого сниппета.