
Интеграция
FormIt, AJAX-обёртки, проверка номера в шаблоне и пара частых кейсов.
FormIt
Порядок работы
- Отправка формы.
- FormIt дергает
phoneSpamBlockдо validate и hooks. - libphonenumber смотрит номер из поля формы.
- Плохой номер или чужая страна — стоп, сообщение из настройки.
- Всё ок — FormIt идёт дальше как обычно.
Подробности по хуку: phoneSpamBlock.
Обычная форма
В &preHooks добавьте phoneSpamBlock. Несколько хуков — через запятую:
&preHooks=`phoneSpamBlock,другойХук`'preHooks' => 'phoneSpamBlock,другойХук'Поле не называется phone
По умолчанию читается phone. Переименовать можно глобально (phonespamdetect_phone_field) или только в этом вызове:
[[!FormIt?
&preHooks=`phoneSpamBlock`
&phoneField=`mobile`
&validate=`name:required,mobile:required,email:required:email`
]]{$modx->runSnippet('FormIt', [
'preHooks' => 'phoneSpamBlock',
'phoneField' => 'mobile',
'validate' => 'name:required,mobile:required,email:required:email'
])}FetchIt
FetchIt на сервере всё равно упирается в FormIt.
- Укажите в FetchIt страницу, где крутится FormIt.
- На этой странице в FormIt добавьте
&preHooks=`phoneSpamBlock`. - Имя поля телефона должно совпадать с
phonespamdetect_phone_fieldили сphoneField. - При отказе FetchIt покажет текст из
phonespamdetect_block_message.
SendIt
SendIt тоже ходит в FormIt. Параметры лежат в пресетах — файле из si_path_to_presets.
- Откройте свою копию пресетов, не
core/components/sendit/presets/sendit.inc.php(его SendIt затрёт при обновлении). - В нужный пресет добавьте
preHooksсphoneSpamBlock. - Если поле не
phone— пропишитеphoneField.
Пример:
return [
'contact' => [
'preHooks' => 'phoneSpamBlock',
'phoneField' => 'phone',
'hooks' => 'email,FormItSaveForm',
'validate' => 'name:required,phone:required,email:email:required',
'emailTo' => 'manager@site.ru',
'emailSubject' => 'Обратная связь',
// ...
],
];Несколько preHooks: 'preHooks' => 'phoneSpamBlock,другойХук'.
isSpamPhone в шаблоне
Возвращает "1" — блокировать, "0" — можно. Без кэша: [[!isSpamPhone]].
Проверка конкретного номера:
[[!isSpamPhone? &phone=`+7 (999) 123-45-67`]]{$modx->runSnippet('isSpamPhone', [
'phone' => '+7 (999) 123-45-67'
])}Нормализованный номер после проверки:
[[!isSpamPhone? &phone=`[[+fi.phone]]`]]
E.164: [[+phonespamdetect.e164]]{set $isBlocked = $modx->runSnippet('isSpamPhone', [
'phone' => $modx->getPlaceholder('fi.phone')
])}
{if $isBlocked == '1'}
Не прошёл: {$modx->getPlaceholder('phonespamdetect.reason')}
{else}
{$modx->getPlaceholder('phonespamdetect.e164')}
{/if}Ещё примеры: isSpamPhone.
Частые кейсы
Только РФ — дефолтные default_region и allowed_regions = RU, плюс phoneSpamBlock в FormIt. См. быстрый старт.
РФ + KZ + BY — в phonespamdetect_allowed_regions:
RU,KZ,BYЛюбая страна, но формат должен быть нормальный — очистите phonespamdetect_allowed_regions.
Разные имена поля в разных формах — глобально оставьте phone, локально переопределяйте phoneField.
Вместе с CrawlerDetect — оба preHook в одной строке, бота лучше резать первым:
&preHooks=`crawlerDetectBlock,phoneSpamBlock`'preHooks' => 'crawlerDetectBlock,phoneSpamBlock'С CAPTCHA — в конец цепочки:
&preHooks=`crawlerDetectBlock,phoneSpamBlock,recaptcha`'preHooks' => 'crawlerDetectBlock,phoneSpamBlock,recaptcha'«Заказать звонок» на FetchIt — на целевой странице FormIt с phoneSpamBlock в preHooks, FetchIt сам подхватит ошибку.
