Артём Мáлков

Массовый ресайз (изменение размеров) изображений в 1C-Bitrix

28 фев0 коммАртём Мáлков

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.

Массовый ресайз (изменение размеров) изображений в 1C-Bitrix

А все доступные параметры для настройки второго участка подробно описаны в этой статье.

Код, описанный выше, вы выполняете в командной PHP-строке по пути «Настройки» (левое меню), «Инструмент» - «Командная PHP-строка» (адрес в админке – /bitrix/admin/php_command_line.php?lang=ru):

Массовый ресайз (изменение размеров) изображений в 1C-Bitrix

Вставляете (не забывая внести необходимые изменения) и жмете кнопку «Выполнить». Время выполнения скрипта разное, напрямую зависит от количества материалов на вашем сайте и может колебаться от нескольких до 40–50 секунд. В некоторых случаях время выполнения может быть и больше.

Рекомендуем к просмотру
Исправление ошибки «Class 'CIBlockElement' not found» в 1C-Bitrix
Статьи и советы
Выводим изображения товара в результатах поиска в 1C-Bitrix
Хаки
ResizeImageGet: быстрое создание превью (ресайз) изображений в 1C-Bitrix
Статьи и советы
0
комментариев
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
Подняться наверх
Регистрация на сайте
Pandoge - уникальный проект, который собрал на своих страницах большой опыт многих людей в сфере сайтостроения.Присоединяйся и ты к сообществу, получай неограниченные знания и начинай творить свою мечту!Нажимая кнопку «Регистрация» вы даете согласие на обработку своих персональных данных.
Имя и фамилия
E-mail
Логин
Пароль
Регистрация
Pandoge