Из названия темы и вопрос. Стандартные формы из компонента, есть поле отправки файла. Но приходят файлы ссылкой. Чтобы скачать, нужно логиниться.
Как реализовать, чтобы приложенные файлы приходили вложением?
Из костылей найденных в инете, один не работает, второй (который идеально подходит возможностью подключения нескольких форм) выдаёт ошибку.
Оба скрипта добавляются в init.php
Может есть ещё решения, работающие?
Странно, что подобное до сих пор не является штатной функцией.
Или кто-то заметит явную ошибку в приведённых примерах?!
При тестировании, переменные переопределял на свои.
1-й неработающий вариант
2-й вариант выдающий ошибку
Как реализовать, чтобы приложенные файлы приходили вложением?
Из костылей найденных в инете, один не работает, второй (который идеально подходит возможностью подключения нескольких форм) выдаёт ошибку.
Оба скрипта добавляются в init.php
Может есть ещё решения, работающие?
Странно, что подобное до сих пор не является штатной функцией.
Или кто-то заметит явную ошибку в приведённых примерах?!
При тестировании, переменные переопределял на свои.
1-й неработающий вариант
Код |
---|
<? AddEventHandler("main", "OnBeforeEventAdd", array("MailEventHandler", "onBeforeEventAddHandler")); class MailEventHandler { static function onBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files) { if ($event === 'FORM_FILLING_SIMPLE_FORM_4' && $message_id === '119') { if (!is_array($files)) $files = []; foreach ($arFields as $key => $field) { if ($link = self::getLinkFromField($field)) { if ($arFile = self::getFileFromLink($link)) { $files[] = $arFile['FILE_ID']; } } } } } // Ищем ссылки на скачивания файлов в письме static function getLinkFromField($field) { // Укажите https или http, в зависимости от того, как работает ваш сайт preg_match("/(https\:.*form_show_file.*action\=download)/", $field, $out); return ($out[1] ?: false); } static function getFileFromLink($link) { $uri = new \Bitrix\Main\Web\Uri($link); parse_str($uri->getQuery(), $query); return CFormResult::GetFileByHash($query["rid"], $query["hash"]); } } ?> |
2-й вариант выдающий ошибку
Код |
---|
$eventManager = Main\EventManager::getInstance(); $eventManager->addEventHandler("main", "OnBeforeEventAdd", array("MailEventHandler", "onBeforeEventAddHandler")); class MailEventHandler{ static function onBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files){ // Названия типов почтовых событий и идентификаторы почтовых шаблонов, по которым будет проходить фильтрация при отлавливании события $events = array('FORM_FILLING_job', 'FORM_FILLING_cooperation', 'FORM_FILLING_cooperation_fiz', 'FORM_FILLING_tenders'); $messageIds = array('49', '57', '60', '61'); if (in_array($event, $events) && in_array($message_id, $messageIds)){ // Определяем массив прикрепляемых к письму идентификаторов файлов, если не задан if (!is_array($files)){ $files = []; } // Перебираем поля письма foreach ($arFields as $field){ // Если находим ссылку на файл, передаем ее дальше if ($link = self::getLinkFromField($field)){ // Если получаем идентификатор файла, сохраняем его в массив идентификаторов файлов письма if ($fileID = self::getFileFromLink($link)){ $files[] = $fileID; } } } } } // Метод возвращает ссылку на файл private static function getLinkFromField($field){ preg_match("/(https\:.*form_show_file.*action\=download)/", $field, $out); // Если поле соответствует маске пути к файлу, возвращаем путь return ($out[1] ?: false); } // Метод возвращает идентификатор файла private static function getFileFromLink($link){ // Создаем новый объект, в который записываем ссылку $uri = new \Bitrix\Main\Web\Uri($link); // Разбираем строку URI и создаем массив из параметров запроса parse_str($uri->getQuery(), $query); // Метод возвращает массив свойств файла по идентификатору результата веб-формы и хэшу $arFile = CFormResult::GetFileByHash($query["rid"], $query["hash"]); // Возвращаем идентификатор файла return $arFile['FILE_ID']; } } |