Встала задача прикрутить reCaptcha к eForm. И уже после того как подружил, нашел на другом сайте решение… Они похожи, но мое мне нравится больше, ибо телодвижений меньше)
Итак, для начала идем на гуглю и получаем ключики для нашего сайта. Там все достаточно просто, поэтому этот процесс описывать не буду. Запоминаем два ключа: SITEKEY и SECRET.
Далее создаем сниппет с произвольным названием, пусть это будет googleReCaptcha, вставляем нижеследующий код, а на 2-ой и 3-ой строчке подставляем значения которые мы получили от детища Сережи Брина.
<?php
define('SITEKEY', '6Ld7HAoUAAAAAARKqbv60b3LAK_v_xxxxxxxx');
define ('SECRET', '6Ld7HAoUAAAAAL25fccZBlx4nu0wVIZxxxxxxxx');
function ReCaptchaDiv(&$fields)
{
$fields['reCaptcha'] = '<div class="g-recaptcha" id="g-recaptcha" data-sitekey="'.SITEKEY.'"></div>';
return $fields;
}
if (function_exists('ReCaptcha')) return;
$lang = isset($lang) ? $lang : 'ru';
$script = '<script src="https://www.google.com/recaptcha/api.js?hl='.$lang.'"></script>';
$modx->regClientStartupScript($script);
function getCurlData($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16");
$curlData = curl_exec($curl);
curl_close($curl);
return $curlData;
}
function ReCaptcha(&$fields, &$vMsg, &$rMsg) {
global $modx;
session_start();
$recaptcha=$_POST['g-recaptcha-response'];
if(!empty($recaptcha))
{
$google_url="https://www.google.com/recaptcha/api/siteverify";
$ip=$_SERVER['REMOTE_ADDR'];
$url=$google_url."?secret=".SECRET."&response=".$recaptcha."&remoteip=".$ip;
$res=getCurlData($url);
$res= json_decode($res, true);
if(!$res['success']) $vMsg[3] = 'Please re-enter your reCAPTCHA.';
}
else $vMsg[3] = 'Please re-enter your reCAPTCHA.';
return $vMsg;
}
?>
Далее. Перед вызовом eForm вставляем вызов нашего сниппета, а в вызов eForm добавляем два параметра: &eFormOnValidate=`ReCaptcha`
&eFormOnBeforeFormMerge=`ReCaptchaDiv`
Итого, у нас должен получиться вывод сродни этому:
[!googleReCaptcha!]
[!eForm?
&formid=`feedbackForm`
&eFormOnValidate=`ReCaptcha`
&eFormOnBeforeFormMerge=`ReCaptchaDiv`
&subject=`Сообщение с сайта`
&tpl=`eFeedbackForm`
&report=`eFeedbackReport`
&gotoid=`[*id*]`
&vericode=`0`
&thankyou=`thankyou`
&to=`info@site.com`
!]
И последне два штриха:
Для вывоа непосредственно каптчи в форму необходимо добавить плейсхолдер [+reCaptcha+]
А если вы используете ajax отправку, то после перезагрузки контента необходимо добавить строчку (для перезагрузки каптчи):
grecaptcha.render(document.getElementById('g-recaptcha'), {'sitekey' : 'Здесь_ваш_sitekey'});
С двумя формами не проверял, но, возможно и сработает)
Dmi3yy 26.10.2016 12:22 #
Хотя я уже и забыл когда сам ставил капчу предпочитаю пару скрытых полей с проверкой на пустоту и вкусными для бота именами
firstname lastname. Задерживает 99,9% спама. И пользователям не нужно напрягать извилины)
Алексей Либер 26.10.2016 12:36 #
DOM 14.11.2017 17:33 #
Что-то типа eform=«input_name:blank:1»
Dmi3yy 15.11.2017 11:32 #
DOM 15.11.2017 16:07 #
Думаю, что лучше style=«display:none;» вынести в файл стилей. Боты тоже «умнеют»