четверг, 23 мая 2013 г.

Битрикс. Добавляем файлы в поле со свойством Множественное.

Быстренько о пугающем. Вернее, оно пугает ровно до тех пор, пока не понял, как это сделать. Дальше - проще некуда. Для элемента ИБ создаём свойство типа Файл и ставим на этом свойстве галочку Множественное. Тут и вопрос сразу назрел, а как туда добавить сразу несколько файлов?

Сегодня - быстрый разговор о добавлении файлов в поле типа Файл с включенным свойством Множественное.

 
function add_test_files()
{
 //для примера будем формировать нужный массивчик из списка тестовых файлов
 //дабы не городить форму.. мне лень, ага
 $arFiles = array(
  $_SERVER["DOCUMENT_ROOT"].'/upload/test/spare2.pdf',
  $_SERVER["DOCUMENT_ROOT"].'/upload/test/spare3.doc',
  $_SERVER["DOCUMENT_ROOT"].'/upload/test/spare5.jpg',
 );
 
 foreach ($arFiles as $f_key=>$f_path)
 {
  $ffile = CFile::MakeFileArray($f_path);
  $ffile['MODULE_ID'] = 'main';
  $arRet['n'.$f_key] = $ffile;
 }
}

API-шная функция MakeFileArray умеет работать с
1. ID файла (таковой например возвращается для поля PREVIEW_PICTURE)
2. абсолютный путь к файлу
3. полный URL к файлу, лежащему где угодно
То есть нас вообще практически не волнует, что делает эта функция. Главное, что она всасывает данные и отдаёт однообразный массив; так мясорубка выдаёт нам однообразную по консистенции массу как из мяса, так и из варёных макарон (если кому-то взбредёт в голову их прокрутить, как мне вот сейчас).
Не нарадуюсь на эту функцию, очень удобная.

Наша же функция add_test_files формирует массив, который можно уже отдавать при добавлении элемента инфоблока.
Array
(
 [n0] => Array
 (
  [name] => spare2.pdf
  [size] => 2407311
  [tmp_name] => ****/upload/test/spare2.pdf
  [type] => application/pdf
  [MODULE_ID] => main
 )

 [n1] => Array
 (
  [name] => spare3.doc
  [size] => 22457
  [tmp_name] => ****/upload/test/spare3.doc
  [type] => text/rtf
  [MODULE_ID] => main
 )

 [n2] => Array
 (
  [name] => spare5.jpg
  [size] => 123837
  [tmp_name] => ****/upload/test/spare5.jpg
  [type] => image/jpeg
  [MODULE_ID] => main
 )
)
Теперь можно и элемент добавить. Вообще, я надеюсь, вы тут и без меня должны справиться =) Навскидку получим что-нибудь вроде вот этого:
$arNeededFields = array(
 'ACTIVE'=>'Y',
 'IBLOCK_ID'=>$iblock_id, //айдишка ИБ
 'IBLOCK_SECTION_ID'=>$iblock_section_id, //айдишка раздела ИБ
 'NAME'=>$el_name, //название
 'PROPERTY_VALUES'=>array(
  'FILES'=>add_test_files(), //дополнительные файлы
 )
);

$c_element = new CIBlockElement;

$ID = $c_element->Add($arNeededFields);
if (intval($ID) > 0)
 echo $ID.": Задание ".$arNeededFields['NAME']."  - ОК";
else
 echo $c_element->LAST_ERROR;

4 комментария:

  1. А как добавить файлы к уже имеющимся?

    ОтветитьУдалить
    Ответы
    1. если честно, такое делать не приходилось. есть подозрение, что для этого надо знать список того, что уже лежит в свойстве.
      можно почитать например вот тут:
      https://dev.1c-bitrix.ru/community/forums/forum6/topic8535/

      Удалить