ReCaptchaV2 и несколько форм на одной странице

Особенности использования ReCaptchaV2 в MODX, если у вас на странице более чем одна форма.

Отличный компонент ReCaptchaV2 обеспечивает хорошую защиту от ботов и в целом простую установку на сайт, некоторые трудности могут возникнуть, если на вашей странице присутствует более чем одна форма, например «Обратный звонок» + «Оставить комментарий». Проблема в том, что простой сниппет recaptchav2_render, предназначенный непосредственно для вывода капчи, каждый раз будет подключать API от google и использует один и тот же идентификатор для блока, в котором нужно выводить капчу.

Поэтому нужно подключить все в ручную:

Шаг 1. Подключаем  в секции head нашей страницы api recaptcha:

<script src="https://www.google.com/recaptcha/api.js?onload=onloadCaptchaCallback&render=explicit&hl=[[++cultureKey]]" async defer></script>

Обращаем внимание, что для указания языка мы можем использовать системную настройку cultureKey. Кроме того, мы используем параметр onload, который всплывет в шаге 3.

Шаг 2. В тех местах форм, где нам нужны «I`m not Robot», добавляем слои для помещения в них капчи:

<div class="captcha-item" id="captcha_callback"></div>

Здесь важно! Атрибут class — оставляем единым, а вот id — делаем различным и уникальным, например captcha_callback, captcha_comment и т.д.

Шаг 3. Отображаем капчу, при помощи небольшого скрипта, размещенного или в конце страницы или в вашем js файле:

<script type="text/javascript">
var onloadCaptchaCallback = function() {
  var siteKey = '[[++recaptchav2.site_key]]';
  $('.captcha-item').each(function(index) {
    grecaptcha.render($(this).attr('id'), {
      'sitekey' : siteKey
    });
  });
};
</script>

Что происходит? Да просто ищем наши слои (используя css класс captcha-item), а затем вызываем метод render, указывая ему в качестве параметра id этого слоя.

На этом клиентская часть готова и капча должна отображаться в нужных местах.

Вся серверная часть остается стандартной, т.е. мы используем hook recaptchav2 (не забывая его ставить до иных хуков, например email). Если капча не проходит — то у нас будет установлена ошибка recaptchav2_error, доступная в плейсхолдере 

[[!+fi.error.recaptchav2_error]]