Сниппет кода для уменьшения изображений в Битрикс компонентах

Доработаем сниппет кода для уменьшения изображений предложенный в совете "Уменьшение изображений в result_modifier.php". В этом совете мы поставим цель разработать сниппет кода, который бы легко было использовать в шаблонах bitrix:news.list, bitrix:news.detail и так далее.

Для решения задачи мы будем использовать уже знакомый нам, по другим советам, файл result_modifier.php, а также файл .parameters.php. Файл .parameters.php используется для описания входных параметров компонента или для дополнения уникальными входными параметрами шаблона компонента. В нашем случае будет именно второй вариант.

Для удобного изменения размера изображений нам потребуется 2 входных параметра BXCERT_IMG_WIDTH и BXCERT_IMG_HEIGHT, как понятно из названия - это новая ширина и высота изображения. Для определения тип файла введем еще один параметр BXCERT_IMG_TYPE, ведь мы хотим иметь возможность использовать данный код как в компоненте bitrix:news.list, так и в bitrix:news.detail. Файл .parameters.php будет выглядеть следующим образом:

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
$arTemplateParameters = array(
    "BXCERT_IMG_TYPE" => Array(
        "NAME" => GetMessage("BXCERT_IMG_TYPE"),
        "TYPE" => "LIST",
        "VALUES" => array(
            'PREVIEW_PICTURE' => GetMessage('BXCERT_IMG_TYPE_PREVIEW'),
            'DETAIL_PICTURE' => GetMessage('BXCERT_IMG_TYPE_DETAIL')
        ),
    ),
    "BXCERT_IMG_WIDTH" => Array(
        "NAME" => GetMessage("BXCERT_IMG_WIDTH"),
        "TYPE" => "TEXT"
    ),
    "BXCERT_IMG_HEIGHT" => Array(
        "NAME" => GetMessage("BXCERT_IMG_HEIGHT"),
        "TYPE" => "TEXT"
    )
);

Также нам потребуется языковой файл lang/ru/.parameters.php со следующим содержимым:

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
$MESS['BXCERT_IMG_TYPE'] = 'Тип изображения';
$MESS['BXCERT_IMG_TYPE_PREVIEW'] = 'Изображение анонса';
$MESS['BXCERT_IMG_TYPE_DETAIL'] = 'Детальное изображение';
$MESS['BXCERT_IMG_WIDTH'] = 'Ширина изображения';
$MESS['BXCERT_IMG_HEIGHT'] = 'Высота изображения';

Теперь перейдем к коду по уменьшению изображения, файл result_modifier.php будет следующим:

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
if ($arParams['BXCERT_IMG_TYPE'] && ($arParams['BXCERT_IMG_WIDTH'] || $arParams['BXCERT_IMG_HEIGHT'])) {
    if (is_array($arResult["ITEMS"])) {
        foreach ($arResult["ITEMS"] as $i => $arItem) {
            if (is_array($arItem[$arParams['BXCERT_IMG_TYPE']])) {
                $ratio = $arItem[$arParams['BXCERT_IMG_TYPE']]["WIDTH"] / $arItem[$arParams['BXCERT_IMG_TYPE']]["HEIGHT"];
                if ($arParams['BXCERT_IMG_WIDTH'] && !$arParams['BXCERT_IMG_HEIGHT']) {
                    $arParams['BXCERT_IMG_HEIGHT'] = round($arParams['BXCERT_IMG_WIDTH'] / $ratio);
                } elseif (!$arParams['BXCERT_IMG_WIDTH'] && $arParams['BXCERT_IMG_HEIGHT']) {
                    $arParams['BXCERT_IMG_WIDTH'] = $arParams['BXCERT_IMG_HEIGHT'] * $ratio;
                }
                $img = CFile::ResizeImageGet($arItem[$arParams['BXCERT_IMG_TYPE']], array("width" => $arParams['BXCERT_IMG_WIDTH'], "height" => $arParams['BXCERT_IMG_HEIGHT']), BX_RESIZE_IMAGE_EXACT);
                $arResult["ITEMS"][$i][$arParams['BXCERT_IMG_TYPE']]["SRC"] = $img["src"];
                $arResult["ITEMS"][$i][$arParams['BXCERT_IMG_TYPE']]["WIDTH"] = $arParams['BXCERT_IMG_WIDTH'];
                $arResult["ITEMS"][$i][$arParams['BXCERT_IMG_TYPE']]["HEIGHT"] = $arParams['BXCERT_IMG_HEIGHT'];
            }
        }
    } elseif (is_array($arResult[$arParams['BXCERT_IMG_TYPE']])) {
        $ratio = $arResult[$arParams['BXCERT_IMG_TYPE']]["WIDTH"] / $arResult[$arParams['BXCERT_IMG_TYPE']]["HEIGHT"];
        if ($arParams['BXCERT_IMG_WIDTH'] && !$arParams['BXCERT_IMG_HEIGHT']) {
            $arParams['BXCERT_IMG_HEIGHT'] = round($arParams['BXCERT_IMG_WIDTH'] / $ratio);
        } elseif (!$arParams['BXCERT_IMG_WIDTH'] && $arParams['BXCERT_IMG_HEIGHT']) {
            $arParams['BXCERT_IMG_WIDTH'] = $arParams['BXCERT_IMG_HEIGHT'] * $ratio;
        }
        $img = CFile::ResizeImageGet($arResult[$arParams['BXCERT_IMG_TYPE']], array("width" => $arParams['BXCERT_IMG_WIDTH'], "height" => $arParams['BXCERT_IMG_HEIGHT']), BX_RESIZE_IMAGE_EXACT);
        $arResult[$arParams['BXCERT_IMG_TYPE']]["SRC"] = $img["src"];
        $arResult[$arParams['BXCERT_IMG_TYPE']]["WIDTH"] = $arParams['BXCERT_IMG_WIDTH'];
        $arResult[$arParams['BXCERT_IMG_TYPE']]["HEIGHT"] = $arParams['BXCERT_IMG_HEIGHT'];
    }
}

Данный код должен работать на компонентах bitrix:news.list и bitrix:news.detail, достаточно просто закинуть в шаблон компонента приведенные выше файлы, либо, если они уже определены - надо их просто дополнить простым копированием. Результат при настройке компонента будет примерно таким:

Сниппет кода для уменьшения изображений в Битрикс компонентах

Для упрощения использования кода, можно его скачать в виде архива: заготовка шаблона компонента с поддержкой уменьшения изображения.

Рады будем услышать замечания или пожелания по данному совету!

 1438 Битрикс, Разработка, Сниппет, result_modifier.php, .parameters.php
2 июня 2015
Команда BXCert

Наша команда разрабатывает портал BXCert, а также занимается разработкой сайтов на CMS 1С-Битрикс. Все участники являются сертифицированными специалистами Bitrix.

Возможно Вам будет интересно

Комментарии

Чтобы оставлять комментарии необходимо зарегистрироваться и пройти авторизацию.