Блог Горошко Андрея 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

Создание своего модуля в Битрикс: Структура, install/index.php и version.phpСоздание своего модуля в Битрикс: Структура, install/index.php и version.php

Средний рейтинг Еще нет оценок Модуль — это основной способ расширения функциональности Битрикс. Создание собственного модуля позволяет инкапсулировать бизнес-логику, компоненты, классы и административные страницы в единый, легко устанавливаемый пакет. Шаг

Программное создание пользовательских полей (UF): CUserTypeEntity и CUserFieldEnumПрограммное создание пользовательских полей (UF): CUserTypeEntity и CUserFieldEnum

Средний рейтинг Еще нет оценок Создавать пользовательские поля («кликая» в админке) удобно только на этапе прототипирования. Когда проект переходит в стадию поддержки и деплоя, все изменения структуры БД должны выполняться

Добавление и обновление элементов в Битрикс: CIBlockElement::Add и UpdateДобавление и обновление элементов в Битрикс: CIBlockElement::Add и Update

Средний рейтинг Еще нет оценок Создание и редактирование контента — базовые операции для любого сайта. В 1С-Битрикс за это отвечают методы CIBlockElement::Add и CIBlockElement::Update. Они являются частью старого API, но до сих пор