Интеграция
Защита форм, скрытие контента от ботов и типовые сценарии использования CrawlerDetect.
Защита форм от спама
Как это работает
- Пользователь отправляет форму.
- FormIt вызывает preHook
crawlerDetectBlockдо валидации и отправки. - Если User-Agent — бот → форма не обрабатывается, показывается сообщение из настройки.
- Если человек → форма обрабатывается как обычно.
Подробнее: crawlerDetectBlock.
Обычная форма (FormIt)
Добавьте crawlerDetectBlock в &preHooks вызова FormIt. Если уже есть другие preHooks — перечислите через запятую:
&preHooks=`crawlerDetectBlock,другойХук`'preHooks' => 'crawlerDetectBlock,другойХук'AJAX-форма (FetchIt)
FetchIt обрабатывает формы через FormIt на сервере. Чтобы защитить форму:
- В конфигурации FetchIt укажите URL/страницу, где вызывается FormIt.
- В вызов FormIt на этой странице добавьте
&preHooks=`crawlerDetectBlock`. - При блокировке ботом FetchIt получит ответ с ошибкой и покажет сообщение из настройки
crawlerdetect_block_message.
AJAX-форма (SendIt)
SendIt обрабатывает формы через FormIt; параметры вызова задаются в пресетах (файл из настройки si_path_to_presets). Чтобы защитить форму:
- Откройте файл пресетов (свою копию, не стандартный
core/components/sendit/presets/sendit.inc.php— при обновлении SendIt он перезаписывается). - Добавьте в нужный пресет
preHooksсcrawlerDetectBlock. - При блокировке ботом SendIt вернёт ошибку и покажет сообщение из настроек CrawlerDetect.
Пример пресета:
return [
'contact' => [
'preHooks' => 'crawlerDetectBlock',
'hooks' => 'email,FormItSaveForm',
'validate' => 'name:required,email:email:required',
'emailTo' => 'manager@site.ru',
'emailSubject' => 'Обратная связь',
// ...
],
];Если preHooks уже есть, перечислите через запятую: 'preHooks' => 'crawlerDetectBlock,другойХук'.
Скрытие контента от ботов
Сниппет isCrawler возвращает "1" (бот) или "0" (не бот). Вызывайте его без кэша и используйте для условного вывода.
Виджет только для людей
[[!isCrawler:eq=`0`:then=`[[$chatWidget]]`]]{if $modx->runSnippet('isCrawler', []) == '0'}
{$modx->getChunk('chatWidget')}
{/if}Аналитика только для людей
[[!isCrawler:eq=`0`:then=`[[$googleAnalytics]]`]]{if $modx->runSnippet('isCrawler', []) == '0'}
{$modx->getChunk('googleAnalytics')}
{/if}Подробнее: isCrawler.
Типовые сценарии
Контактная форма
Добавьте crawlerDetectBlock в preHooks FormIt. См. Быстрый старт.
Несколько форм на сайте
Один и тот же preHook можно использовать для всех форм. В каждом вызове FormIt добавьте crawlerDetectBlock в &preHooks.
Счётчик «N человек на сайте»
Вызывайте сниппет счётчика только когда посетитель не бот:
[[!isCrawler:eq=`0`:then=`[[!yourVisitorCounterSnippet]]`]]{if $modx->runSnippet('isCrawler', []) == '0'}
{$modx->runSnippet('yourVisitorCounterSnippet', [])}
{/if}Форма «Заказать звонок» (FetchIt)
- Убедитесь, что FetchIt настроен на вызов FormIt на сервере.
- В FormIt на странице назначения добавьте
&preHooks=`crawlerDetectBlock`. - При блокировке ботом FetchIt покажет сообщение из настроек CrawlerDetect.
E-commerce — «Смотрят этот товар»
Не учитывать ботов в счётчике просмотров товара:
[[!isCrawler:eq=`0`:then=`[[!msProductViews? &id=`[[*id]]`]]`]]{if $modx->runSnippet('isCrawler', []) == '0'}
{$modx->runSnippet('msProductViews', ['id' => $productId])}
{/if}