Метод работы: в форме создается поле, невидимое обычным пользователям, но доступное к заполнению программными средствами, которое проверяется перед отправкой сообщения. Если поле заполнено, то считаем, что письмо представляет собой спам и сразу редиректим такого пользователя на страницу с сообщением об успешной отправке, иначе передаем массив с данными отправленной формы системному макросу, который и совершит отправку письма.
Решение:
1) создадим в нашей форме специальное поле, которое будем проверять перед отправкой, допустим это будет поле с идентификатором hidden_pole и типом строка.
2) откроем шаблон по которому происходит отправка сообщения (в примере используется путь к демо-шаблону demodizzy): /templates/demodizzy/xslt/modules/webforms/add.xsl и заменем в форме путь в action на который отправляется форма с /webforms/send/ на /webforms/check/
3) создадим кастомный макрос %webforms check()% по новому формату, для этого по пути /templates/demodizzy/classes/modules/webforms/ создадим файл class.php со следующим содержимым:
Код:
<?php
class webforms_custom extends def_module {
public function check(){
$post_data = getRequest('data');
// Если скрытое поле заполнено, значит это СПАМ, сразу делаем редирект на страницу успешно отправленного сообщения
if(!empty($post_data['new']['hidden_pole'])) {
$ini = cmsController::getInstance()->getModule("content");
$url = getRequest('ref_onsuccess');
if (!$url) $url = $ini->pre_lang . "/webforms/posted/";
$ini->redirect($url);
}
// Если скрытое поле оказалось пустым, то вызываем системный макрос send() и передаем ему массив с отправленной формой
if ($oWebformsMdl = cmsController::getInstance()->getModule("webforms")) {
$oWebformsMdl->send($_POST);
}
}
};
?>
Здесь же создадим файл permissions.php
Код:
<?php
$permissions = Array(
'add' => array('check'),
);
?>
Всё, теперь макрос уже должен работать.
4) Не забудем отключить каптчу в настройках модуля Конфигурация.
5) Скрыть созданное поле вы можете либо средствами JavaScript либо CSS. Если использовать CSS, то удобнее всего открыть тип данных нужной формы и отредактировать добавленное специальное поле, сняв в его настройках флаг со свойства "Видимость". Поле станет невидимым и чтобы оно отправлялось наравне с другими полями формы, Вы можете явно прописать его в шаблоне, а также добавить к нему id:
<input type="text" name="data[new][hidden_pole]" id="secret" />
Теперь, по id поля мы можем его скрыть средствами CSS:
Код:
#secret {
display: none;
}
Скрытое содержимое доступно для зарегистрированных пользователей!