Последнее время жизнь меня сталкивает с
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"]);
Все легко и просто… если бы я так мог сказать… битрикс… за что… кары…
Комментарии ()