Skip to content
  1. Компоненты
  2. FetchIt
  3. Обработка своим сниппетом

Обработка своим сниппетом ​

Вместо FormIt можно указать свой сниппет в параметре snippet. Он получает поля формы и должен вернуть JSON с ключами:

КлючТипОписание
successboolУспех или ошибка
messagestringТекст для уведомления и блоков [data-success] / [data-validation-error]
dataobjectПри ошибке: имя поля → текст ошибки (для [data-error] и классов invalid). При успехе — любые данные для своего кода, например адрес для редиректа

Собрать такой ответ помогают методы error() и success() сервиса. Сам сервис возьмите через FetchIt::service() — он работает и на MODX 2, и на MODX 3:

php
<?php
/** @var modX $modx */
/** @var array $fields */
$FetchIt = FetchIt::service($modx);

if (empty($fields)) {
    // Вывод формы, а не отправка: сниппет вызывается и при каждом выводе.
    return '';
}

$name = trim((string) ($fields['name'] ?? ''));
if ($name === '') {
    return $FetchIt->error('Ошибки в форме', [
        'name' => 'Вы не заполнили имя',
    ]);
}

// ... сохранить, отправить письмо
return $FetchIt->success('Форма прошла проверку');

Внимание

Проверка empty($fields) обязательна: сниппет вызывается и при каждом выводе формы, с пустым $fields. Без неё он, например, отправит пустое письмо на каждый просмотр страницы.

Можно вернуть и массив вручную с теми же ключами.

Вызов ​

modx
[[!FetchIt?
  &snippet=`MySnippet`
  &form=`tpl.FetchIt.example`
]]
fenom
{'!FetchIt' | snippet : [
  'snippet' => 'MySnippet',
  'form' => 'tpl.FetchIt.example',
]}

Что приходит в сниппет ​

В $scriptProperties попадают сохранённые параметры вызова FetchIt и ключ fields — ассоциативный массив отправленных полей:

  • при отправке через FetchIt это $_POST, файлы лежат в $_FILES;
  • при обычной отправке формы без JavaScript — только $_POST.

Служебные поля защиты из fields убраны. GET-параметров и cookies в fields нет: до FetchIt 4 сниппет получал $_REQUEST.

Не кладите в параметры вызова объекты PHP: перед записью в сессию или кеш они отбрасываются.

Контекст страницы формы клиент передаёт как pageId в FormData.

Отправка без JavaScript ​

Ответ сниппета при обычной отправке не выводится: сообщение на странице покажется, только если сниппет сам поставит плейсхолдеры.

Прежние способы получить сервис ​

Работают и они — возвращают тот же объект:

php
// способ FetchIt 1.x — работает и на MODX 2, и на MODX 3
$FetchIt = $modx->getService('fetchit', 'FetchIt', MODX_CORE_PATH . 'components/fetchit/model/');

// способ FetchIt 3.x — только на MODX 3
$FetchIt = $modx->services->get('FetchIt');

Подробнее: Переход на FetchIt 4.