Любой интерактивный сайт нуждается в формах: обратная связь, заказ, подписка. В Битрикс вы можете легко создать свою собственную логику обработки форм внутри компонента. Это дает полный контроль над процессом.
Процесс состоит из двух частей: HTML-форма в шаблоне и PHP-логика в component.php.
Шаг 1: Создание HTML-формы в template.php
Форма должна отправлять данные на ту же страницу, где расположен компонент. Для этого в атрибуте action используется $APPLICATION->GetCurPage().
Ключевой момент безопасности — защита от CSRF. Битрикс предоставляет для этого специальную функцию bitrix_sessid_post(), которая выводит скрытое поле с уникальным ID сессии.
// /path/to/component/templates/.default/template.php
<? if (!empty($arResult['ERROR_MESSAGE'])): ?>
<div style="color: red;"><?= implode('<br>', $arResult['ERROR_MESSAGE']) ?></div>
<? endif; ?>
<? if (!empty($arResult['SUCCESS_MESSAGE'])): ?>
<div style="color: green;"><?= $arResult['SUCCESS_MESSAGE'] ?></div>
<? endif; ?>
<form action="<?= $APPLICATION->GetCurPage() ?>" method="POST">
<?= bitrix_sessid_post() // Обязательное поле для защиты от CSRF ?>
<div>
<label>Ваше имя:</label><br>
<input type="text" name="USER_NAME" value="<?= $arResult['SAVED_VALUES']['USER_NAME'] ?? '' ?>">
</div>
<div>
<label>Ваш Email:</label><br>
<input type="email" name="USER_EMAIL" value="<?= $arResult['SAVED_VALUES']['USER_EMAIL'] ?? '' ?>">
</div>
<div>
<input type="submit" name="submit_form" value="Отправить">
</div>
</form>
- Мы сразу предусмотрели блоки для вывода ошибок и сообщения об успехе.
- Мы также сохраняем введенные значения в $arResult на случай ошибки, чтобы пользователю не пришлось вводить все заново.
Шаг 2: Обработка данных в component.php
Вся логика находится в файле component.php.
// /path/to/component/component.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
use Bitrix\Main\Application;
$request = Application::getInstance()->getContext()->getRequest();
$arResult['ERROR_MESSAGE'] = [];
$arResult['SAVED_VALUES'] = [];
// 1. Проверяем, была ли отправлена форма
if ($request->isPost() && $request->getPost('submit_form')) {
// 2. Проверяем сессию (защита от CSRF)
if (!check_bitrix_sessid()) {
$arResult['ERROR_MESSAGE'][] = 'Ошибка безопасности. Обновите страницу и попробуйте снова.';
} else {
// 3. Собираем и валидируем данные
$userName = trim($request->getPost('USER_NAME'));
$userEmail = trim($request->getPost('USER_EMAIL'));
$arResult['SAVED_VALUES']['USER_NAME'] = htmlspecialchars($userName);
$arResult['SAVED_VALUES']['USER_EMAIL'] = htmlspecialchars($userEmail);
if (empty($userName)) {
$arResult['ERROR_MESSAGE'][] = 'Пожалуйста, укажите ваше имя.';
}
if (empty($userEmail) || !check_email($userEmail)) {
$arResult['ERROR_MESSAGE'][] = 'Пожалуйста, укажите корректный Email.';
}
// 4. Если ошибок нет, выполняем действие
if (empty($arResult['ERROR_MESSAGE'])) {
// Например, отправляем почтовое событие
$arEventFields = [
"USER_NAME" => $userName,
"USER_EMAIL" => $userEmail,
];
CEvent::Send("MY_FEEDBACK_FORM", "s1", $arEventFields);
$arResult['SUCCESS_MESSAGE'] = 'Спасибо! Ваше сообщение отправлено.';
}
}
}
$this->includeComponentTemplate();
Разбор логики:
- Получаем объект запроса: Application::getInstance()->getContext()->getRequest() — это современный D7-способ получить доступ к данным запроса ($_POST, $_GET и т.д.).
- Проверяем отправку: $request->isPost() проверяет, что метод запроса — POST. $request->getPost(‘submit_form’) проверяет наличие нашей кнопки.
- check_bitrix_sessid(): Эта функция — обязательный шаг. Она сравнивает sessid из формы с sessid текущей сессии пользователя. Если они не совпадают, значит, форма отправлена со стороны (CSRF-атака).
- Валидация: Проверяем поля на заполненность и корректность (например, email с помощью check_email()). Все ошибки складываем в $arResult[‘ERROR_MESSAGE’].
- Действие: Если массив ошибок пуст, выполняем основное действие (отправляем почту, создаем элемент инфоблока и т.д.) и записываем сообщение об успехе в $arResult[‘SUCCESS_MESSAGE’].
Вывод:
Создание собственных обработчиков форм дает вам безграничную гибкость. Главное — всегда следовать циклу: проверка отправки -> проверка sessid -> валидация -> действие. Такой подход гарантирует безопасность и надежность ваших форм.
обработка форм Битрикс, POST-запрос, component.php, $request, check_bitrix_sessid, валидация данных, main.feedback.