Задать вопрос
  • Как в bitrix:form реализовать множественную загрузку файлов?

    randomizex
    @randomizex
    http://resume.web-ivan.ru
    Ну если делать стандартным способом то можно сделать только много ответов типа файл. и на форме это будет отображаться отдельными полями и по отдельности цеплять в них файлы.

    В моем случае сработал такой способ:
    Насоздавал в вопросе множество ответов типа файл.
    А при выводе формы не отображаю их. Вместо этих инпутов отображаю свой с 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);
        }
    
    }


    Из минусов это все таки полей должно хватать на прикрепленные файлы, если нет - лишние файлы удалятся.
    Ответ написан
    Комментировать