АРАМА: Инструменты, коллекции, групповые действия / Перекрестные продажи / Аналогичные товары / Аксессуары

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

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

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

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

Приведенная в данном материале информация не является каким то обязательным правилом. Это один из вариантов решения.

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

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

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

общие параметры коллекции.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 - самостоятельно определяемые параметры, указывают редактировать или нет анонсовую или детальную картинку соответственно.