Задать вопрос
@Antonio_Sk

Заполнение множественного свойства типа Файл в инфоблоках?

Имеется форма с полем выбора файлов:
<input type="file" data-not-required name="file" multiple title="Изображения">


Отправляются 2 файла (изображения jpg,png) методом POST асинхронно ( enctype=multipart/form-data):
606dae429ccae408895833.png

\CModule::IncludeModule("iblock");
$el = new \CIBlockElement;
if ($review_id = $el->Add( [
    'IBLOCK_SECTION_ID' => false,
    'IBLOCK_ID' => IBLOCK_content_reviews,
    'PROPERTY_VALUES' => [
"PICTURES" => $FILES['file'],
],
    'NAME' => 'test',
    'ACTIVE' => 'N', 
]))
    \AddMessage2Log(print_r($FILES['file'], true));


1С-Bitrix принимает и сохраняет в свойство только один из файлов (в var_dump аналогично присутствует только 1 элемент массива, причем в качестве значений name, size и т.п. не образуются массивы как для нескольких файлов):

Date: 2021-04-07 15:21:46
Module: 
Array
(
    [name] => Screenshot_1.png
    [type] => image/png
    [tmp_name] => /tmp/phpy1UseU
    [error] => 0
    [size] => 349258
)


array(5) {
  ["name"]=>
  string(27) "Без названия.png"
  ["type"]=>
  string(9) "image/png"
  ["tmp_name"]=>
  string(14) "/tmp/phpvX9khO"
  ["error"]=>
  int(0)
  ["size"]=>
  int(7308)
}


Каким образом можно отловить оба файла и заставить 1С-Bitrix записать их в множественное свойство типа файл?

UPD: по поводу name="file[]" битрикс ($el->LAST_ERROR) возвращает "Неверный тип файла" для любого разрешенного в свойстве типа (он не умеет работать с массивами?):
606ddf3a05f7e658641350.png
Хотя типы файла явно определены для свойства:
606ddf4575c01516948592.png
Если отключить валидацию типов файлов свойство не заполняется вообще (ни одного файла не прикрепляется). Понимаю, что вопрос скорее к поддержке битрикса на корректировку ядра / модуля загрузки файлов, но возможно существуют какие-либо более быстрые решения на модификацию данных валидных для битрикса?
  • Вопрос задан
  • 1543 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
@MKMatriX
В доке https://dev.1c-bitrix.ru/api_help/iblock/classes/c... в примерах пишут

При добавлении нового значения/значений множественного свойство типа "Файл" необходимо использовать ключи вида n0,n1,n2 ... nN .


Во-первых для пхп добавляем к имени поля []. Т.е. name="file" -> name="files[]"

Ну а дальше чуть преобразований массивов, для того чтобы битрикс это все съел.
function reArrayFiles(&$file_post)
{
	$file_ary = [];
	$file_count = count($file_post['name']);
	$file_keys = array_keys($file_post);

	for ($i=0; $i<$file_count; $i++) {
		foreach ($file_keys as $key) {
			$file_ary[$i][$key] = $file_post[$key][$i];
		}
	}

	return $file_ary;
}
$files = array_values(reArrayFiles($_FILES['files']));
$bitrixFiles = [];
foreach ($files as $i => $file) {
	$bitrixFiles["n" . $i] = ["VALUE" => $file];
}


И эти $bitrixFiles уже можно скармливать в $PRODUCT_ID = $el->Add($arLoadProductArray)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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