Короткий ответ: если нужна форма обратной связи на 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)