Блог Горошко Андрея 1C-Битрикс Обработка форм и POST-запросов в Битрикс: От HTML до component.php

Обработка форм и POST-запросов в Битрикс: От HTML до component.php

Средний рейтинг
Еще нет оценок

Любой интерактивный сайт нуждается в формах: обратная связь, заказ, подписка. В Битрикс вы можете легко создать свою собственную логику обработки форм внутри компонента. Это дает полный контроль над процессом.

Процесс состоит из двух частей: 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();

Разбор логики:

  1. Получаем объект запроса: Application::getInstance()->getContext()->getRequest() — это современный D7-способ получить доступ к данным запроса ($_POST, $_GET и т.д.).
  2. Проверяем отправку: $request->isPost() проверяет, что метод запроса — POST. $request->getPost(‘submit_form’) проверяет наличие нашей кнопки.
  3. check_bitrix_sessid(): Эта функция — обязательный шаг. Она сравнивает sessid из формы с sessid текущей сессии пользователя. Если они не совпадают, значит, форма отправлена со стороны (CSRF-атака).
  4. Валидация: Проверяем поля на заполненность и корректность (например, email с помощью check_email()). Все ошибки складываем в $arResult[‘ERROR_MESSAGE’].
  5. Действие: Если массив ошибок пуст, выполняем основное действие (отправляем почту, создаем элемент инфоблока и т.д.) и записываем сообщение об успехе в $arResult[‘SUCCESS_MESSAGE’].

Вывод:
Создание собственных обработчиков форм дает вам безграничную гибкость. Главное — всегда следовать циклу: проверка отправки -> проверка sessid -> валидация -> действие. Такой подход гарантирует безопасность и надежность ваших форм.

обработка форм Битрикс, POST-запрос, component.php, $request, check_bitrix_sessid, валидация данных, main.feedback.

Мой рейтинг:

Добавить комментарий

Related Post

Управление правами доступа через API: GetGroupRight, GetUserGroupArrayУправление правами доступа через API: GetGroupRight, GetUserGroupArray

Средний рейтинг Еще нет оценок Проверка прав доступа — критически важная часть любого веб-приложения. Она позволяет скрывать или показывать определенные кнопки, блокировать доступ к страницам или разрешать выполнение специфических действий.

Работа с пользователями в Битрикс: CUser::GetList, Add, UpdateРабота с пользователями в Битрикс: CUser::GetList, Add, Update

Средний рейтинг Еще нет оценок Управление пользователями — одна из ключевых задач любой CMS. В Битрикс для этого предназначен класс CUser. Глобальный объект $USER (экземпляр этого класса) доступен на каждой странице и содержит

Современные компоненты Битрикс: Переходим на class.phpСовременные компоненты Битрикс: Переходим на class.php

Средний рейтинг Еще нет оценок Традиционно вся логика компонента Битрикс размещалась в файле component.php. Это простой и понятный подход, но для сложных компонентов он приводит к «лапше» из кода. Современный стандарт