Задать вопрос
  • Как в 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);
        }
    
    }


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

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Можно:
    <?php
    $commands = [
    	'hi' => fn($name) => 'hi, ' . $name, 
    	'hello' => fn($name) => 'hello , ' . $name,
    	'etc' =>fn($name) => 'etc...',
    ];
    
    echo $commands['hi']('John');


    php code online
    Ответ написан
    Комментировать
  • Как добавить класс по клику на кнопку внутри карточки товара?

    mizutsune
    @mizutsune
    I will live forever in the flame of your eyes.
    const container = document.querySelector('.box');
    
    container.addEventListener("click", ({ target: t }) => {
       if(t.classList.contains("btn")) {
           const card = t.closest(".item");
           card && card.classList.add("active");
       }
    })


    А так касательно кода из вопроса, то тут всё достаточно просто. Чтобы решить задачу, вам нужно добавлять обработчик клика кнопке которая является дочерним элементом карточки, плюс можно заменить цикл for на forEach, что сделает код более читабельным.

    document.querySelectorAll('.item').forEach(v => {
       v.querySelector(".btn").addEventListener('click', () => {
          v.classList.add('active');
       });
    });


    Однако в целом такой подход не очень. То есть я хочу сказать что добавление обработчиков в цикле, имеет свои подводные камни, про которые можно найти достаточно информации.
    Ответ написан
    1 комментарий
  • Регистрация события срабатывающего при восстановлении пароля в Битрикс?

    Событие OnBeforeUserChangePassword поддерживается и вызывается в методе \CAllUser::ChangePassword(). Эта функция вызывается когда пользователь уже ввёл контрольную строку и новый пароль, т.е. непосредственно перед сменой. Ещё есть событие OnBeforeUserSendPassword - оно вызывается в методе \CAllUser::SendPassword() перед отправкой сообщения с контрольной строкой.
    Ответ написан
    Комментировать
  • Как удалить невидимые пробелы из строки в php?

    Sanovskiy
    @Sanovskiy
    Веб-разработчик с 2005 года
    ak_wi,
    Многие программы добавляют байты 0xEF, 0xBB, 0xBF в начале любого документа, сохраняемого как UTF-8. Это метка порядка байтов Юникода (англ. Byte Order Mark, BOM), также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature).
    /**
     * Удалить BOM из строки
     * @param string $str - исходная строка
     * @return string $str - строка без BOM
     */
    function removeBOM($str="") {
        if(substr($str, 0, 3) == pack('CCC', 0xef, 0xbb, 0xbf)) {
            $str = substr($str, 3);
        }
        return $str;
    }
    
    // Строка, например, полученная при помощи file_get_contents()
    $str = 'Строка с BOM';
     
    // Строка без BOM
    $str = removeBOM($str);
     
    echo $str;


    Решений множество
    Ответ написан
    Комментировать