Форма обратной связи FormIt MODx

Короткий ответ: если нужна форма обратной связи на MODX, в большинстве случаев достаточно FormIt. Он закрывает валидацию, хуки, отправку писем и дружит с AjaxForm, если хочется отправку без перезагрузки страницы. Главное не пытаться лечить все проблемы правкой ядра: так обычно становится не лучше, а просто интереснее жить.

Ниже рабочая база, от которой уже можно плясать: имя, телефон, email, сообщение, простая валидация и письмо на почту.

Что установить

  • FormIt - обязателен;
  • AjaxForm - опционально, если нужна AJAX-отправка;
  • антиспам вроде FormItSaveForm, honeypot или reCaptcha - по ситуации.

Базовый вызов FormIt

[ [!FormIt?
&hooks=`email,redirect`
&emailSubject=`Сообщение с сайта`
&emailTo=`mail@example.com`
&emailTpl=`contactEmailTpl`
&validate=`name:required,minLength=2,phone:required,email:email:required,text:required:minLength=10`
&validationErrorMessage=`Проверьте поля формы, где-то посетитель снова победил разметку.`
&successMessage=`Сообщение отправлено. Можно выдохнуть.`
&redirectTo=`123`
]]

Разметка формы

<form action="[ [~[ [*id]]]]" method="post" class="contact-form">
  <input type="text" name="name" value="[ [+fi.name]]" placeholder="Ваше имя" />
  [ [!+fi.error.name]]

  <input type="text" name="phone" value="[ [+fi.phone]]" placeholder="Телефон" />
  [ [!+fi.error.phone]]

  <input type="email" name="email" value="[ [+fi.email]]" placeholder="Email" />
  [ [!+fi.error.email]]

  <textarea name="text" placeholder="Сообщение">[ [+fi.text]]</textarea>
  [ [!+fi.error.text]]

  <input type="text" name="company" value="" class="hidden" />
  <button type="submit">Отправить</button>
</form>

[ [!+fi.validation_error_message]]
[ [!+fi.successMessage]]

Чанк письма contactEmailTpl

Имя: [ [+name]]
Телефон: [ [+phone]]
Email: [ [+email]]
Сообщение:
[ [+text]]

Антиспам без цирка

Для простой защиты часто хватает скрытого поля и серверной проверки. Бот его заполняет, человек обычно нет.

[ [!FormIt?
&hooks=`spam,email`
&validate=`name:required,phone:required,text:required`
&emailTpl=`contactEmailTpl`
]]

Поле company из примера выше можно использовать как honeypot. Если у вас летит много мусора, подключайте reCaptcha или отдельную антиспам-проверку. Спамер, как известно, тоже старается, но не для нас.

Если нужна AJAX-отправка

Тогда обычно проще обернуть ту же форму в AjaxForm, а саму обработку оставить на FormIt.

[ [!AjaxForm?
&snippet=`FormIt`
&form=`contactFormTpl`
&hooks=`email`
&emailTpl=`contactEmailTpl`
&emailTo=`mail@example.com`
&validate=`name:required,phone:required,text:required`
&successMessage=`Форма отправлена без перезагрузки.`
]]

Подводные камни

  • Не правьте ядро MODX и файлы самого FormIt. Если чего-то не хватает, делайте свой хук или отдельный сниппет.
  • Не храните адреса получателей и сложную логику прямо в куче шаблонов. Лучше вынести в свойства вызова, чанки или настройки.
  • Если используете AJAX, проверяйте не только фронт, но и обычную отправку без JavaScript.
  • Плейсхолдеры ошибок выводите рядом с полями, иначе посетитель видит только загадочное "где-то ошибка" и начинает подозревать всех.

Современный вариант

Для типовой формы связка FormIt + AjaxForm все еще нормальна. Если нужен сложный сценарий: файлы, CRM, webhooks, очереди, валидация в несколько этапов, тогда лучше выносить логику в собственный сниппет или отдельный backend-обработчик. FormIt хорош, пока вы используете его как инструмент, а не как религию.

Связанные статьи

Актуально для: MODX Revolution 2.8+, MODX 3.x, PHP 8.1+, FormIt для классических форм, AjaxForm для AJAX-отправки.

Комментарии


Комментарии (0)



Разрешённые теги: <b><i><br>Добавить новый комментарий: