Единственный минус этого способа в том, что ответ от сервера приходит с ошибкой валидации — по ответу сразу видно, что письмо не отправлено и нужно робота перенастроить.
В итоге такой способ задерживает меньше спама, чем мог бы.
Обычно на сайтах я использую связку FormIt + AjaxForm. Вот небольшое решение для фильтрации спама на этой связке. Оно похоже на стандартную валидацию с одним лишь условием — если поле заполнено и письмо решено не отправлять, спамеру сервер ответит сообщением с успехом отправки. В итоге спам-робот и его хозяин будут считать, что отправка работает, а у клиента на почте спама не будет.
Добавляем в форму поле, по которому будем фильтровать
<input type="text" name="surname" class="form-input" placeholder="Фамилия">
Прячем её стилями
input[name="surname"] { display: block; width: 2px; height: 3px; margin-bottom: -3px; opacity: 0.01; }
Создаём сниппет checkSpam
<?php if ($_POST['surname']) { // проверяем наше поле на пустоту echo $AjaxForm->success('Ваше сообщение отправлено'); die(); } else { return true; }
Добавляем наш сниппет в качестве хука перед email
'hooks' => 'checkSpam,email',
Теперь если письмо не отправлено, спамеру всё равно будет показано сообщение об успехе.
И юзаю
Я меняю стили…
Заранее спасибо.
JS при загрузке его очищаю
и проверяю если поле НЕ пустое — значит это спамер (ну или JS налажал)))
Пробую Ваш способ.
При попытке отправки формы со страницы с заполненным полем «surname» (имитирую заполнение ботом) браузер выдает следующее:
Fatal error: Call to a member function success() on a non-object in /путь_к_сайту/core/cache/includes/elements/modsnippet/35.include.cache.php on line 3
Захожу в этот файл и вижу, что это полностью сниппет checkSpam, 3-я строка, соответственно:
echo $AjaxForm->success('Ваше сообщение отправлено');
Означает ли это, что AjaxForm не отрабатывает и сообщение отправителю не ушло?
p.s. Я не разработчик, поэтому прошу прощение за возможное непонимание элементарных процессов)
p.p.s. AjaxForm установлен.
Однако, это не всегда может помочь, т.к. автозаполнение отключается в браузере сейчас.