Из названия темы и вопрос. Стандартные формы из компонента, есть поле отправки файла. Но приходят файлы ссылкой. Чтобы скачать, нужно логиниться.
Как реализовать, чтобы приложенные файлы приходили вложением?
Из костылей найденных в инете, один не работает, второй (который идеально подходит возможностью подключения нескольких форм) выдаёт ошибку.
Оба скрипта добавляются в 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'];
}
} |