Недавно читал здешний форум и наткнулся на тему где спрашивают как сделать обновление каптчи без без перезагрузки страницы. В одном из моих проектов я сталкивался с этой задачей. [spoiler]Нужно было создать регистрационную форму чтобы все поля проверялись "на лету", ну и естественно каптча тоже должна обновляться "на лету" без перезагрузки. По умолчанию в битриксе такой функции нет, поэтому ее пришлось реализовывать вручную.
Т.к. требуется получить новую картинку каптчи без перезагрузки страницы, значит нам потребуется использовать технологию AJAX. При этом необходимо создать java-скрипт для клиентской части и php-скрипт для сервера.
Для клиентского скрипта я использовал библиотеку JQuery
function cptRefresh() {
var countOfexec = 0;
var code = $("#sid").val();
return function() {
if(countOfexec < 5) {
var timestamp = new Date();
$('#code').attr("src", "/bitrix/tools/captcha.php?captcha_sid="+code+"×tamp="+timestamp.getTime());
} else {
$.get("/chat/chat.php", function(data){
$("#sid").val(data);
$('#code').attr("src", "/bitrix/tools/captcha.php?captcha_sid="+data);
});
countOfexec = 0;
}
return ++countOfexec;
}
}
var refresh = cptRefresh();
Функцию refresh нужно повесить на событие при клике на текст "обновить картинку" или что то наподобие. И соответственно в шаблоне компонента регистрации для тега вывода каптчи нужно установить id="code", а у скрытого поля которое передает идентификатор каптчи установить id="sid"
// Подключаем класс битрикса для работы с captcha
include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/captcha.php");
// Создаем экземпляр класса
$cpt = new CCaptcha();
// Удаляем текущую каптчу
$cpt->Delete($_REQUEST['captcha_sid']);
// Генерируем и выводим код новой каптчи
echo htmlspecialchars($APPLICATION->CaptchaGetCode());
Не много отредактировал клиентскую часть: При первых пяти обновлениях, картинка обновляется, но текст остается тот же. Отдельное спасибо за идею: Антон Долганин, Эльдар Рахимбердин.
Изображение каптчи помещаем в див с классом captcha и добавляем JavaScripts:
/*RELOAD CAPTCHA*/ var symbols ="abcdefghjklmnopqrstuvwxyz0123456789" var length = 32; function generatePassword(symbols, length) { var result = ""; for (var i=0; i<length; i++) { result += symbols.charAt(Math.floor(Math.random()*symbols.length)); }; return result; }
$(".captcha img").click(function(){ var captcha_code = generatePassword(symbols, length); var c = "/bitrix/tools/captcha.php?captcha_sid=" + captcha_code ; $(".captcha img").attr("src", c) $(".captcha input").attr("value", captcha_code) })
Угу, а боты будут передергивать сорц картинки до тех пор, пока картинка не станет для них читабельной? Упростим задачу спамерам! Показывать одну и ту же капчу три раза, а потом вдруг показывать новую - тоже неявная для пользователя ситуация. Лучше всего каждый раз передергивать её, чтобы символы обновлялись.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».