10  /  10

Автоматическое создание картинки для анонса и детальной картинки товара из дополнительных изображений

Наверное, всем известна опция в настройках инфоблока Создавать картинку анонса из детальной (если не задана). Но как быть, если PREVIEW_PICTURE или DETAIL_PICTURE нужно создавать из дополнительных изображений MORE_PHOTO?

Существует различное варианты реализации. Предлагаем во внимание способ решения через механизм коллекций модуля Инструменты, коллекции, групповые действия.
Преимуществом данного подходя является возможность записи превью и детальных картинок как автоматом при изменении дополнительных картинок. так и массовое редактирование для уже существующих элементов инфоблока. Кроме того можно использовать оба варианта, так и по отдельности.
Приведенная в данном материале информация не является каким то обязательным правилом. Это один из вариантов решения.

Суть метода состоит в следующем:

  • Используется произвольное PHP-действие механизма коллекций.
  • Настраивается коллекция с действием Произвольное PHP выражение, программируется функция обработки картинок.


Настроенная коллекция:

PREVIEW_PICTURE и DETAIL_PICTURE из MORE_PHOTO.jpg

Функцию необходимо определить в init.php. Назовём его, например, __set_picture(). Для начала как выглядит сама функция в нашем исполнении:

function __set_picture($arFields,$arUserFields = array(),$is_preview,$is_detail)
{
	if ($arFields['ID'] >0
		&&	$arFields['IBLOCK_ID'] > 0)
	{
		$property_code = "MORE_PHOTO";		//КОД свойства Изображения [MORE_PHOTO] - указывать свой
		$property_id = 45;					//ИД свойства Изображения [MORE_PHOTO] - указывать свой
		
		$btrue = false;
		$file = false;
		if (is_array($arUserFields['PROPERTY'][$property_code]['VALUE'])
			&& count($arUserFields['PROPERTY'][$property_code]['VALUE'])>0)
		{
			$first_file_id = $arUserFields['PROPERTY'][$property_code]['VALUE'][0];
		}
		if (is_array($arUserFields['PROPERTY_VALUES'][$property_id])
			&& count($arUserFields['PROPERTY_VALUES'][$property_id])>0)
		{
			if (is_array($arUserFields['PROPERTY_VALUES'][$property_id]['n0']['VALUE']))		//если грузятся картинки через админку
			{
				if ($arUserFields['PROPERTY_VALUES'][$property_id]['n0']['VALUE']['error']==0)
					$btrue = true;
			}
			elseif (is_array($arUserFields['PROPERTY_VALUES'][$property_id]) 					//если грузятся картинки через апи с указанием ИД свойства
				&& isset($arUserFields['PROPERTY_VALUES'][$property_id]['name']))
			{
				if ($arUserFields['PROPERTY_VALUES'][$property_id]['error']==0)
					$btrue = true;
			}
			elseif (is_array($arUserFields['PROPERTY_VALUES'][$property_code]) 					//если грузятся картинки через апи с указанием КОДА свойства
				&& isset($arUserFields['PROPERTY_VALUES'][$property_code]['name']))
			{
				if ($arUserFields['PROPERTY_VALUES'][$property_code]['error']==0)
					$btrue = true;
			}
		}
		
		//если меняются Изображения
		if ($btrue)
		{
			if (!is_array($file))
			{
				$db_props = CIBlockElement::GetProperty($arFields['IBLOCK_ID'], $arFields['ID'], array("sort" => "asc"), Array("CODE"=>$property_code));
				if($ar_props = $db_props->Fetch())
				{
					$first_file_id = $ar_props['VALUE'];
				}
				
			}
			if ($first_file_id>0)
			{
				if ($first_file_id>0)
					$file = CFile::MakeFileArray($first_file_id);
				
				$el = new CIBlockElement;
				$arload = Array();
				if ($is_preview)
					$arload["PREVIEW_PICTURE"] = $file;
				if ($is_detail)
					$arload["DETAIL_PICTURE"] = $file;
				
				$res = $el->Update($arFields['ID'], $arload);
			}
			
		}
	}
}


Параметры функции:

  • $arFields - массив, описывающий элемент инфоблока. (доступен в функции из механизма коллекций)
  • $arUserFields - массив, описывающий элемент инфоблока в обработчике событий добавления/редактирования элемента. При ручной индексации равен $arFields. При индексации с помощью обработчиков событий, возвращает массив полей элемента информационного блока. (доступен в функции из механизма коллекций)
  • $is_preview и $is_detail - самостоятельно определяемые параметры, указывают редактировать или нет анонсовую или детальную картинку соответственно.