Массовый ресайз (изменение размеров) изображений в 1C-Bitrix
CMS 1C-Bitrix устроена так, что для ускорения загрузки страниц сайта есть возможность вывода не полного оригинального изображения материала, а его превью (анонса). Для каждого типа изображения выставляются свои значения размеров ширины и высоты (делается это в настройках инфоблоков). Вещица весьма полезная, но имеет один очень важный минус: если вы изменили размеры превью в настройках, то внесенные корректировки не коснутся тех материалов, у которых уже есть изображение анонса. То есть новый размер применится только для изображений новых материалов.
Если материалов на вашем сайте пара-тройка десятков, то, в принципе, можно потратить время и руками пересохранить все изображения. Но если их несколько сотен или тысяч, как это было у меня – делать такую работу руками не является лучшим решением.
Конечно, вы можете подправить код сайта (в этой статье мы описали способ программного создания превью на сайте в 1C-Bitrix), тем самым также добиться создания превью из полного изображения на вашем сайте. Но сегодня я покажу вам как с помощью одного небольшого скрипта максимально упростить решение поставленной задачи.
Итак, все, что вам нужно – это воспользоваться данным кодом:
CModule::IncludeModule('iblock');
$items_list = CIBlockElement::GetList(
array(
'NAME' => 'ASC'
),
array(
'IBLOCK_ID' => 100, // ID блока
'ACTIVE' => 'Y'
),
false,
false,
false
);
$element = new CIBlockElement;
while($item = $items_list->Fetch()) {
if($item['DETAIL_PICTURE'] == '') {
continue;
}
$resize_images = CFile::ResizeImageGet(
$item['DETAIL_PICTURE'],
array(
'width' => ШИРИНА,
'height' => ВЫСОТА
),
BX_RESIZE_IMAGE_EXACT,
false
);
$item_images = array(
'DETAIL_PICTURE' => CFile::MakeFileArray(CFile::GetPath($item['DETAIL_PICTURE'])),
'PREVIEW_PICTURE' => CFile::MakeFileArray($resize_images['src']),
);
$element->Update($item['ID'], $item_images);
}
Во всем этом нас интересуют участки:
'IBLOCK_ID' => 100, // ID блока
и
$resize_images = CFile::ResizeImageGet(
$item['DETAIL_PICTURE'],
array(
'width' => ШИРИНА,
'height' => ВЫСОТА
),
BX_RESIZE_IMAGE_EXACT,
false
);
ID блока вы можете узнать по URL, перейдя в корневой раздел. Например, на моем сайте каталог всех товаров имел ID=100.
А все доступные параметры для настройки второго участка подробно описаны в этой статье.
Код, описанный выше, вы выполняете в командной PHP-строке по пути «Настройки» (левое меню), «Инструмент» - «Командная PHP-строка» (адрес в админке – /bitrix/admin/php_command_line.php?lang=ru):
Вставляете (не забывая внести необходимые изменения) и жмете кнопку «Выполнить». Время выполнения скрипта разное, напрямую зависит от количества материалов на вашем сайте и может колебаться от нескольких до 40–50 секунд. В некоторых случаях время выполнения может быть и больше.