@countZer0

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

Всем привет !

Есть веб-форма на битриксе, которая выводится с помощью bitrix:form. Нужно как то реализовать множественную загрузку файлов. В настройке формы такой возможности нет. Подскажите куда копать.
  • Вопрос задан
  • 2994 просмотра
Пригласить эксперта
Ответы на вопрос 2
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);
    }

}


Из минусов это все таки полей должно хватать на прикрепленные файлы, если нет - лишние файлы удалятся.
Ответ написан
Комментировать
@toorr2p
https://github.com/Cleverscript
тоже стала такая задача!
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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