Ну если делать стандартным способом то можно сделать только много ответов типа файл. и на форме это будет отображаться отдельными полями и по отдельности цеплять в них файлы.
В моем случае сработал такой способ:
Насоздавал в вопросе множество ответов типа файл.
А при выводе формы не отображаю их. Вместо этих инпутов отображаю свой с name="files"
<input type="file" id="files" name="files[]" multiple>
Далее подписываюсь на событие form onBeforeResultAdd
и вручную распихиваю все файлы.
AddEventHandler("form", "onBeforeResultAdd", ['FormResultAdd', 'before']);
class FormResultAdd
{
/**
* Вернет input name для ответов типа file вопроса fieldCode
* @param $formId
* @param string $fieldCode
* @return array
*/
public static function getFilesInputNames($formId, $fieldCode = 'FILES'){
$res = [];
if($question = \CFormField::GetBySID($fieldCode, $formId)->Fetch()){
$by = 's_id';
$order = 'asc';
$filter = false;
if(intval($question['ID'])){
$rsAnswers = \CFormAnswer::GetList($question['ID'], $by,$order,["FIELD_TYPE"=>'file'], $filter );
while ($arAnswer = $rsAnswers->Fetch())
{
$res[]='form_file_'.$arAnswer['ID'];
}
}
}
return $res;
}
/**
* Осуществляем загрузку множества файлов через один input type="file" multiple
* так как стандартными средствами Битрикс можно сделать только через множество input type="file"
* @param $WEB_FORM_ID
* @param $arFields
* @param $arrVALUES
* @throws Main\SystemException
*/
public static function loadMultiple($WEB_FORM_ID, &$arFields, &$arrVALUES) {
global $_FILES;
if($_FILES['files']){
$files = [];
if(is_array($_FILES['files']['name'])){
foreach ($_FILES['files'] as $key => $val){
foreach ($val as $k => $v){
$files[$k][$key]= $v;
}
}
}else{
$files = [$_FILES['files']];
}
unset($_FILES['files']);
$err = [];
if($inputsName = self::getFilesInputNames($WEB_FORM_ID)){
foreach ($files as $f){
if($inputName = array_shift($inputsName)){
$_FILES[$inputName] = $f;
}else{
$err[] = $f;
}
}
if($err){
$firelds = [
'TITLE' => 'Не хватило полей в форме для подгрузки файлов '.__FUNCTION__,
'MESSAGE' => print_r($err, true),
];
\CEvent::Send('DEBUG_SEND', SITE_ID, $firelds);
}
}
}
return true;
}
public static function before($WEB_FORM_ID, &$arFields, &$arrVALUES) {
self::loadMultiple($WEB_FORM_ID, $arFields, $arrVALUES);
}
}
Из минусов это все таки полей должно хватать на прикрепленные файлы, если нет - лишние файлы удалятся.