Прикрепить файл в письмо вебформы битрикс
Вариант 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
<?php
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"]);
?>
Вариант 3
Повесить на добавление результатов:
<?php
function onBeforeResultAddHandler($WEB_FORM_ID,&$arFields,&$arrVALUES){
$input_id = "";
switch($WEB_FORM_ID){//id вебформы
case 5:
$input_id = 62;//id ответа, где будут ссылки на файлы
break;
}
if(!empty($_FILES) && $input_id!=""){
$files = reset($_FILES);
foreach($files["name"] as $id=>$name){
$arFile = array(
"name" => $name,
"tmp_name" => $files["tmp_name"][$id],
"type" => $files["type"][$id],
"MODULE_ID"=>"form",
"size"=>$files["size"][$id]
);
$res = CFile::SaveFile($arFile,"form_result");//сохраняем файлы и создаем массив ссылок на них
if($res){
$arFiles[] = "https://www.bwt.ru".CFile::GetPath($res);
}
}
$arrVALUES["form_text_".$input_id] = implode("; ",$arFiles);
}
return true;
}
?>
Полезные ссылки
https://dev.1c-bitrix.ru/community/webdev/user/114106/blog/9787/