Прикрепить файл из веб-формы к письму в Bitrix

Последнее время жизнь меня сталкивает с bitrix… и я встречаю на своем пути разного вида трудности. И вот буквально вчера мне необходимо было реализовать прикрепление к файла из формы к письму, облазил форумы интернеты, проблеме овер дофига лет, в методе отправки письма это все не так давно было реализовано, но в функционале битры нет.



Добавляем в init.php следующий код:
class Feedback
{
    public static $events = [
        'FORM_FILLING_SIMPLE_FORM_14',
        'FORM_FILLING_SIMPLE_FORM_15'
    ];
 
    public static function onBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files)
    {
        if (in_array($event, static::$events)) {
            if (!is_array($files)) $files = [];
            foreach ($arFields as $key => $field) {
                if ($link = self::getLinkFromField($field)) {
                    if ($arFile = self::getFileFromLink($link)) {
                        $files[] = $arFile['FILE_ID'];
                    }
                }
            }
        }
    }
 
    public static function getLinkFromField($field)
    {
        preg_match("/(https?\:.*form_show_file.*action\=download)/", $field, $out);
        return ($out[1] ?: false);
    }
 
    public static function getFileFromLink($link)
    {
        $uri = new \Bitrix\Main\Web\Uri($link);
        parse_str($uri->getQuery(), $query);
        return static::GetFileByHash($query["rid"], $query["hash"]);
    }
 
    /**
     * Копия метода CFormResult без проверки доступа
     * TODO: replace sql with d7
     * @param $RESULT_ID
     * @param $HASH
     * @return array|bool|void
     */
    protected static function GetFileByHash($RESULT_ID, $HASH)
    {
        global $DB, $APPLICATION, $strError, $USER;
 
        $err_mess = (\CAllFormResult::err_mess()) . "
Function: GetAnswerFile
Line: ";
 
        $RESULT_ID = intval($RESULT_ID);
        if ($RESULT_ID <= 0 || strlen(trim($HASH)) <= 0) return;
 
        $strSql = "
SELECT
    F.ID as FILE_ID,
    F.FILE_NAME,
    F.SUBDIR,
    F.CONTENT_TYPE,
    F.HANDLER_ID,
    F.FILE_SIZE,
    RA.USER_FILE_NAME ORIGINAL_NAME,
    RA.USER_FILE_IS_IMAGE,
    RA.FORM_ID, R.USER_ID
FROM b_form_result R
LEFT JOIN b_form_result_answer RA ON RA.RESULT_ID=R.ID
INNER JOIN b_file F ON (F.ID = RA.USER_FILE_ID)
WHERE R.ID = '" . $RESULT_ID . "'
AND RA.USER_FILE_HASH = '" . $DB->ForSql($HASH, 255) . "'
";
 
        $z = $DB->Query($strSql, false, $err_mess . __LINE__);
        if ($zr = $z->Fetch()) {
            return $zr;
        } else {
            return false;
        }
    }
}
AddEventHandler("main", "OnBeforeEventAdd",[Feedback::class,"onBeforeEventAddHandler"]);
Все легко и просто… если бы я так мог сказать… битрикс… за что… кары…

Комментарии ()

  1. Игорь 22 января 2021, 18:37(Комментарий был изменён) # 0
    Немного модифицировал на случай когда прикрепляется не один файл:

    <?
    class Feedback
    {
        public static $events = [
            'FORM_FILLING_SIMPLE_FORM_1',
        ];
     
        public static function onBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files)
        {
            if (in_array($event, static::$events)) {
                if (!is_array($files)) $files = [];
                foreach ($arFields as $key => $field) {
                    if ($arLink = self::getLinkFromField($field)) {
                        if ($arFiles = self::getFileFromLink($arLink)) {
                            $files[] = $arFiles;
                        }
                    }
                }
            }
        }
     
        public static function getLinkFromField($field)
        {
            //preg_match("/(https?\:.*form_show_file.*action\=download)/", $field, $out);
            preg_match_all("/(https?\:.*form_show_file.*action\=download)/", $field, $out);
    		return ($out[1] ?: false);
        }
     
        public static function getFileFromLink($arLink)
        {
            $arFiles = [];
    		foreach($arLink as $link)
    		{
    			$uri = new \Bitrix\Main\Web\Uri($link);
    			parse_str($uri->getQuery(), $query);
    			$arFile = static::GetFileByHash($query["rid"], $query["hash"]);
    			$arFiles[] = $arFile["FILE_ID"];
    		}
    		return $arFiles;
        }
     
        
        protected static function GetFileByHash($RESULT_ID, $HASH)
        {
            global $DB, $APPLICATION, $strError, $USER;
     
            $err_mess = (\CAllFormResult::err_mess()) . "
    Function: GetAnswerFile
    Line: ";
     
            $RESULT_ID = intval($RESULT_ID);
            if ($RESULT_ID <= 0 || strlen(trim($HASH)) <= 0) return;
     
            $strSql = "
    		SELECT
    			F.ID as FILE_ID,
    			F.FILE_NAME,
    			F.SUBDIR,
    			F.CONTENT_TYPE,
    			F.HANDLER_ID,
    			F.FILE_SIZE,
    			RA.USER_FILE_NAME ORIGINAL_NAME,
    			RA.USER_FILE_IS_IMAGE,
    			RA.FORM_ID, R.USER_ID
    		FROM b_form_result R
    		LEFT JOIN b_form_result_answer RA ON RA.RESULT_ID=R.ID
    		INNER JOIN b_file F ON (F.ID = RA.USER_FILE_ID)
    		WHERE R.ID = '" . $RESULT_ID . "'
    		AND RA.USER_FILE_HASH = '" . $DB->ForSql($HASH, 255) . "'
    		";
     
            $z = $DB->Query($strSql, false, $err_mess . __LINE__);
            if ($zr = $z->Fetch()) {
                return $zr;
            } else {
                return false;
            }
        }
    }
    AddEventHandler("main", "OnBeforeEventAdd",[Feedback::class,"onBeforeEventAddHandler"]);
    

    Авторизация

    GitHubGoogleVkontakteYandex
    Есть вопрос или предложение пиши в Telegram @cloudsv

    MTProto прokси для Telegram

    Прямой эфир

    Diego mont 25 мая 2023, 07:04
    Полезные боты в Telegram 2
    cloudsv 24 апреля 2023, 17:56
    Обновление Scala Rider G4 52
    cloudsv 12 ноября 2022, 19:16
    Установка и настройка minidlna 3
    cloudsv 03 ноября 2022, 03:42
    Настройка прокси mtproto для Telegram 52
    cloudsv 03 января 2022, 10:50
    Let's Encrypt это легко и просто 4
    cloudsv 10 сентября 2020, 13:17
    MySQL Workbench падает при подключении 2
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    cloudsv 07 августа 2023, 22:56
    Linux Asus ROG x13 flow 2022 GV301RE и Linux 0
    cloudsv 15 апреля 2023, 16:23
    Linux Уведомление о смены workspace в X11 Linux 0
    cloudsv 17 октября 2020, 09:55
    Linux Отключить DHCP IPv6 в systemd 0
    cloudsv 30 июля 2020, 21:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 15:45
    Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 08:00
    Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 16:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 30 июля 2019, 21:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 18:29
    Telegram Полезные боты в Telegram 2