Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Множественное свойство инфоблока типа Файл

00 голосов
14
Здравствуйте.

У меня в инфоблоке есть свойство. Множественное. Тип - файл.
А админке все нормально работает.
А как с этим работать в пользовательской части?
Как добавлять, удалять, редактировать МНОЖЕСТВЕННЫЕ свойства типа ФАЙЛ?
спросил 12 Фев, 13 от ufoman (390 баллов)
Текст вопроса никак не соотносится с ответами. Почему вы не редактируете вопрос?

14 Ответы

00 голосов
 
Лучший ответ
например так
Код
      
$arFils=array();//сюда перечисляете ваши картинки
//......
//добавление очередной картинки:
$arTmpFile = CFile::MakeFileArray("ADRES_KARTINKI/.jpg");
$arTmpFile['name']='novoe_imya_fayla.jpg';//это напрмер чтобы делать имена вида 1.jpg 2.jpg итд
$arFils[]=array(
   'VALUE'=>$arTmpFile,
   'DESCRIPTION'=>utf2w($item['descr']),
);
//.......
//когда массив заполнен всеми картинками делаете так
CIBlockElement::SetPropertyValues($ELEMENT_ID,$IBLOCK_ID,$arFils,$ID_POLYA);

и вуаля - всё срабатывает!
важное замечание - массив $arFils должен содержать все картинки которые будут в поле то есть если вам нужно добавить то сперва туда надо прописать заранее те которые были.
ответил 05 Ноя, 13 от Selian (440 баллов)
выбран 28 Апр, 14 от root
00 голосов
Напиши, пожалуйста, подробнее, как удалять файл из какого-либо свойства, чтобы при этом и из таблицы все данные потёрлись?
Имеется следующая схема:
Код
$db_props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields['ID'], "sort", "asc", Array("CODE"=>"PHOTO_SM"));

   while($ar_props = $db_props->Fetch())
   {
   print_r ($ar_props);
   if ($ar_props["VALUE"])
      {
      $ar_val = $ar_props["VALUE"];
      $ar_val_id = $ar_props["PROPERTY_VALUE_ID"];
      // формируем путь к файлу картинки путем сложения адреса сайта и внутреннего пути к картинке
      $img_path2 = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar_props["VALUE"]);
       $new_make_file = CFile::MakeFileArray($img_path2);
// Добавляем (как и написано выше) в массив описания файла ["del"]="Y"
       $new_make_file["del"]="Y";
              CIBlockElement::SetPropertyValueCode($arFields["ID"], "PHOTO", Array ($ar_val_id => $new_make_file) );
   }
   } 

в целом, назначение этой части - потереть все дополнительные изображения перед тем, как записать туда абсолютно новый набор данных. Мучаюсь уже давно, ничего придумать не могу...
ответил 13 Янв, 13 от CeBep (300 баллов)
показан 28 Апр, 14 от root
00 голосов
попробуй так
CIBlockElement::SetPropertyValueCode($arFields["ID­"], "PHOTO_SM", Array ($ar_val_id => Array("VALUE"=>$new_make_file) ) );
по идее все должно работать
ответил 13 Янв, 13 от MoonASS (140 баллов)
показан 28 Апр, 14 от root
00 голосов
Спасибо, отчасти помогло, только появилось побочное действие: при сохранении изменений остается пустым ровно то количество полей, сколько у меня вообще элементов. То есть, добавляю 3 картинки - у меня 3 поля пустые, а дальше - 3 картинки
ответил 13 Янв, 13 от CeBep (300 баллов)
показан 28 Апр, 14 от root
00 голосов
Привожу весь текст скрипта.
Назначение его такого. У нас имеется множественное свойство MORE_PHOTO. Скрипт должен сгенерировать привьюшки для всех изображений этого свойства, а затем эти привьюшки записать в свойство PHOTO_SM.
Скрипт удалось заставить заработать, но не без маленького глюка. Первый раз отрабатывает прекрасно. Но вот при повторном сохранении элемента инфоблока в полях PHOTO_SM вылазят пустые поля, причем, количество их в точности совпадает с количеством элементов в MORE_PHOTO.

Если сможете помочь это исправить - буду очень благодарен.
Код
<?
function BXIBlockAfterSave($arFields)
{
// Вначале ПОЛНОСТЬЮ очищаем свойство PHOTO_SM
$db_props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields['ID'], "sort", "asc", Array("CODE"=>"PHOTO_SM"));
//print_r ($db_props);die();
   while($ar_props = $db_props->Fetch())
   {

   if ($ar_props["VALUE"])
      {
     $ar_val = $ar_props["VALUE"];
      $ar_val_id = $ar_props["PROPERTY_VALUE_ID"];

      // формируем путь к файлу картинки путем сложения адреса сайта и внутреннего пути к картинке
      $img_path2 = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar_props["VALUE"]);
     $new_make_file = CFile::MakeFileArray($img_path2);
     $new_make_file["del"]="Y";
      CIBlockElement::SetPropertyValueCode($arFields["ID"], "PHOTO_SM", Array ($ar_val_id => Array("VALUE"=>$new_make_file) ) );
      @unlink($new_make_file);

      }      
   }
   


// Стандартный пример - создание изображения для PRIVIEW_PICTURE из DETAIL_PICTURE
if(1==1 || $_POST['MAKE_PREVIEW_PICTURE']=='Y')
    {
        $dbr = CIBlockElement::GetByID($arFields['ID']);
        if(($ar = $dbr->Fetch()) && $ar['DETAIL_PICTURE']>0)
        {
            $img_path = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar['DETAIL_PICTURE']);
            $width = 200;
            $height = 200;
            list($width_orig, $height_orig) = getimagesize($img_path);
            if($width && ($width_orig < $height_orig))
               $width = ($height / $height_orig) * $width_orig;
            else
               $height = ($width / $width_orig) * $height_orig;
            $image_p = imagecreatetruecolor($width, $height);
            $image = imagecreatefromjpeg($img_path);
            imagecopyresized($image_p, $image, 0, 0, 0, 0, 
                             $width, $height, $width_orig, $height_orig);
$tmpnm = mt_rand();
            $new_img_path = tempnam("/tmp", "FOO").$tmpnm.".jpg";

            imagejpeg($image_p, $new_img_path);
            $be = new CIBlockElement();
            $be->Update($arFields['ID'], 
                        Array('PREVIEW_PICTURE' => CFile::MakeFileArray($new_img_path)), 
                        false);
            @unlink($new_img_path);
        }
    }


// Самое интересное - берем элементы из MORE_PHOTO, ресайзим и добавляем в PHOTO_SM
$db_props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $arFields['ID'], "sort", "asc", Array("CODE"=>"MORE_PHOTO"));

$arFils=array();
while($ar_prop1 = $db_props->Fetch())
{
   $ar_prop=$ar_prop1["VALUE"];

    $k=CFile::GetPath($ar_prop);


    $img_path2 = $_SERVER['DOCUMENT_ROOT'].$k;
   $width  = 200;
      $height = 150;
      list($width_orig, $height_orig) = getimagesize($img_path2);

      if ($width_orig > $width || $height_orig > $height)
         {
         if($width && ($width_orig < $height_orig))
            $width = ($height / $height_orig) * $width_orig;
         else
            $height = ($width / $width_orig) * $height_orig;
         $image_p = imagecreatetruecolor($width, $height);
         $image = imagecreatefromjpeg($img_path2);
         imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
$tmpnm = mt_rand();
       $new_img_path = tempnam("/tmp", "FOO").$tmpnm.".jpg";;
         imagejpeg($image_p, $new_img_path);
       $new_make_file = CFile::MakeFileArray($new_img_path);
       echo "New path:".$new_img_path."<br>";
                 
       $arFils=array(
          'VALUE' => $new_make_file);
       CIBlockElement::SetPropertyValues( $arFields['ID'], $arFields["IBLOCK_ID"], $arFils, "PHOTO_SM");
            @unlink($new_img_path);
      }

}
}?>
ответил 13 Янв, 13 от CeBep (300 баллов)
показан 28 Апр, 14 от root
00 голосов
Никто не сталкивался?
ответил 12 Фев, 13 от ufoman (390 баллов)
00 голосов
Нет "пользовательской" части. Есть "публичная".
И в ней нельзя редактировать/удалять никакие свойства, вообще.

Я думаю, Вам никто не ответил, потому, что никто не понял, что Вы спросили smile:-)
ответил 11 Март, 13 от Siemka (1,020 баллов)
00 голосов
Извините, может быть я неправильно выразился.
Я хотел узнать, как работать с множественными свойствами типа ФАЙЛ из php-кода. Я разрабатываю небольшую надстроечку на сайт. И мне трабуется через ворму загрузки к некоторому инфоблоку прикреплять несколько файлов.
В админке это работает. Вот я и хотел узнать, как это сделать самому? Каким образом, например, удалять одно из значений списка? Полностью перезаписывать всё?
ответил 09 Апр, 13 от ufoman (390 баллов)
00 голосов
В общем, с самими файлами я разобрался.
Но никак не могу с множественными полями понять.
Как, например, удалить уже имеющийся элемент из поля?
Как добавить еще один? Причем, вместе с DESCRIPTION файла?
ответил 03 Авг, 13 от ufoman (390 баллов)
00 голосов
ой сорри проскочило к делу не относщееся 'DESCRIPTION'=>utf2w($item['descr']), иеется ввиду 'DESCRIPTION'=>'дескрипшн картинки',
ответил 11 Фев, 14 от Selian (440 баллов)

Похожие вопросы

0 голосов
2 ответов
спросил 22 Апр, 14 от KeiDen (400 баллов)
0 голосов
5 ответов
0 голосов
3 ответов
спросил 22 Дек, 13 от Rogarond (820 баллов)