Полный цикл в digital

Форма обратной связи через API с капчей Bitrix

Для начала необходимо настроить вид капчи, сделать это можно перейдя в Настройки -> Настройки продукта -> CAPTCHA:

Для формы связи будем использовать API Битрикс по максимуму, создадим форму связи в HTML на странице. К форме можно прикрутить AJAX запрос:

<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php"); ?>
<?
// подключаем класс капчи
include_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/captcha.php");
// пространство имен для возврата значения параметра
use Bitrix\Main\Config\Option;
// обьект капчи
$cpt = new CCaptcha();
// получаем параметр captchaPass
$captchaPass = Option::get(
"main",
"captcha_password"
);
// проверка на пустоту, если пусто генерируем новый код капчи
if (strlen($captchaPass) <= 0) {
$captchaPass = randString(10);
COption::SetOptionString("main", "captcha_password", $captchaPass);
}
// кодируем полученную строку (создаем хеш)
$cpt->SetCodeCrypt($captchaPass);
?>
<form action="/send.php" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-12">
<input class="input" type="text" name="user_name" value="" placeholder="Имя" />
</div>
<div class="col-12">
<input class="input tel" type="tel" name="user_phone" value="" placeholder="+7 (ХХХ)-ХХХ-ХХ-ХХ" />
</div>
<div class="col-12">
<input class="input" type="text" name="user_sajt" value="" placeholder="Сайт">
</div>
<div class="col-12">
<textarea class="input" name="user_mess" placeholder="Вопрос специалисту"></textarea>
</div>
<div class="col-12">
<label class="d-none d-md-flex label_fail">
<!-- метод возвращает HTML код предназначенный для загрузки нового, либо замены существующего файла -->
<?= CFile::InputFile("IMAGE_ID", 20, $str_IMAGE_ID); ?>
</label>
</div>
<!-- генерируем капчу -->
<div class="col-12">
<input name="captcha_code" value="<?= htmlspecialchars($cpt->GetCodeCrypt()); ?>" type="hidden">
<input id="captcha_word" name="captcha_word" type="text">
<img src="/bitrix/tools/captcha.php?captcha_code=<?= htmlspecialchars($cpt->GetCodeCrypt()); ?>">
</div>
</div>
<div class="row">
<div class="col-12">
<button type="submit" class="btn submit_otpravit">Отправить</button>
</div>
<div class="col-12">
<div class="agreement">
<label class="main-user-consent-request">
<input class="privacy" type="checkbox" value="Y" checked="" name="">
<span class="tekst">Нажимая кнопку, Вы разрешаете обработку своих <a href="/privacy/"
target="_blank">персональных данных</a></span>
</label>
</div>
</div>
</div>
</form>
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>

Создадим исполнительный файл, который будет через API Bitrix запросом Post получать данные, обрабатывать их и генерировать отправку e-mail сообщения на почту, здесь можно реализовать логику отправки писем, исключить в случае ненадобности возможность аттача (загрузки файлов) установив в методе Event::send значение "FILE" => "" равное пустой строке:

<?
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
// пространсто имен для почтовых событий
use Bitrix\Main\Mail\Event;
// переменные отправленные методом POST преобразованные в безопасный вид
$USER_NAME = htmlspecialcharsbx($_POST["user_name"]);
$USER_PHONE = htmlspecialcharsbx($_POST["user_phone"]);
$USER_EMAIL = htmlspecialcharsbx($_POST["user_sajt"]);
$USER_MESS = htmlspecialcharsbx($_POST["user_mess"]);
// массив для предачи в метод Event::send
$arEventFields = array(
"USER_NAME" => $USER_NAME,
"USER_EMAIL" => $USER_EMAIL,
"USER_PHONE" => $USER_PHONE,
"USER_MESS" => $USER_MESS
);
// делаем проверку на введенное кодовое слово если код верный то возвращает TRUE
if (!$APPLICATION->CaptchaCheckCode($_POST["captcha_word"], $_POST["captcha_code"])) {
echo ("Вы не прошли проверку CAPTCHA");
return;
}
// ловим и проверяем вложение если оно есть
if (!empty($_FILES["IMAGE_ID"]["name"])) {
// записываем в переменную последние 4 символа
$name = substr($_FILES["IMAGE_ID"]["name"], -4, 4);
// записываем в переменную вес файла
$size = $_FILES["IMAGE_ID"]["size"];
// проверяем вес файла
if ($size <= 3145728) {
// проверяем расширение файла
if ($name == ".jpg" || $name == ".png" || $name == ".pdf" || $name == ".txt" || $name == "docx") {
// метод сохраняет файл и регистрирует его в таблице файлов (b_file), возвращая id который потребуется в методе Event::send
$id = CFile::SaveFile($_FILES["IMAGE_ID"], "fajlyform");
} else {
echo ("Можно прикреплять файлы с расширением jpg, png, pdf, txt, docx");
return;
}
} else {
echo ("Можно прикреплять файлы до 3 мегабайт");
return;
}
}
// ловим и проверяем значение переменных привязанных к обязательным полям формы
if (!empty($USER_NAME) && !empty($USER_PHONE)) {
// метод создает почтовое событие которое будет в дальнейшем отправлено в качестве E-Mail сообщения
$www = Event::send([
// тип почтового события
"EVENT_NAME" => "FORMA_SVYAZI",
// id почтового шаблона
'MESSAGE_ID' => 11,
// id сайта
"LID" => "s1",
// массив полей формы
"C_FIELDS" => $arEventFields,
// id файла
"FILE" => array($id)
]);
echo ("Ваша заявка будет обработанна в первый рабочий день до 12:00");
} else {
echo ("Заполните обязательные поля");
}

В админке сайта Настройки -> Настройки продукта -> Почтовые и СМС события -> Типы событий создаем почтовое событие, FORMA_SVYAZI которое мы укажем в методе Event::send:

К почтовому событию нужно создать почтовый шаблон, который будет приходить непосредственно на почту. В нём доступные переменные и значения которые были указаны в методе Event::send, так же нужно не забыть указать значение 'MESSAGE_ID' => 11, где цифра 11 обозначает ID почтового шаблона:

Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг