Для тех, кто не любит вставлять для защиты от спама на сайт капчу существует альтернативное достаточно надежное решение в виде добавления скрытого поля ввода в форму. Когда его можно использовать? Изначально самым популярным плагином для форм заказа был FormIt. С популяризацией отправки заявок без перезагрузки страницы пальма первенства перешла к дополнению AjaxForm. Предлагаемое решение по запрету рассылки спама через сайт справедливо для обоих приложений MODX Revolution: как для FormIt, так и для AjaxForm.
Редактируем форму
Добавляем в структуру формы пустое поле, не hidden, скрываем его через CSS (display:none). В названии поля не используем слово spam.
<input type="text" name="site_message" value="" />
Редактируем сниппет
Добавляем в вызов сниппета проверку, что вставленное скрытое поле пусто. Рассчитано на то, что текстообильный спаммер-бот захочет заполнить все поля формы, а наше скрытое поле будет молчаливым пустым партизаном.
&validate=`site_message:blank`
Второй метод: генерируем ключ для гарантии посещения сайта
Второй метод должен гарантировать загрузку страницы и клик по нужным тригерным кнопкам для вызова отправки формы.
Для этого в hidden-поле формы мы записываем сгенерированный на сервере ключ, который кладем в сессию. Когда аякс с формой уйдет на сервер, мы сверим значение из hidden-поля с тем, что лежит в сессии. Если значения не равны - значит будем считать сообщение спамом и остановим отправку формы на почту.
Разобьем этот метод на 4 шага.
I Генерция ключа
Создаем сниппет для генерации уникального ключа и кладем его в сессию. Если значение уже хранится в сессии - просто его возвращаем.
Код сниппета getMessageKey:
if (!isset($_SESSION['spamProtectionMessageKey']) || empty($_SESSION['spamProtectionMessageKey'])){ $_SESSION['spamProtectionMessageKey'] = time(); } return $_SESSION['spamProtectionMessageKey'];
II Добавляем сгенерированный ключ в форму
<input type="hidden" name="message-key" value="[[!getMessageKey]]" />
III Hook для валидации
Пишем хук-сниппет chekSpamProtectionMessageKey для проверки ключа после отправки формы:
$messageKey = $hook->getValue('message-key'); if (!isset($_SESSION['spamProtectionMessageKey']) || empty($_SESSION['spamProtectionMessageKey']) || empty($messageKey) || (int)$messageKey !== (int)$_SESSION['spamProtectionMessageKey']){ return false; } return true;
IV Добавляем хук в вызов AjaxForm
Добавляем перед хуком email, чтобы если наш хук chekSpamProtectionMessageKey вернет false (проверка не прошла), то не осущствлялась отправка формы на почту получателя.
&hooks=`spam,chekSpamProtectionMessageKey,email`