Недавно читал здешний форум и наткнулся на тему где спрашивают как сделать обновление каптчи без без перезагрузки страницы. В одном из моих проектов я сталкивался с этой задачей. [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());
Не много отредактировал клиентскую часть: При первых пяти обновлениях, картинка обновляется, но текст остается тот же. Отдельное спасибо за идею: Антон Долганин, Эльдар Рахимбердин.
Понял что имелось ввиду в первом коменте, я просто решил что лучше удалять лучше сразу, хотя может это и не правильно.
Совершенно новые цифры генерить в корне неправильно, потому что каждая новая капча может оказаться еще страшнее.
Или наоборот проще, почему, если это в корне не правильно, так делают большинство сервисов? взять тот же самый яндекс, в нем при регистрации почтового аккаунта ка каптче обновляются обновляются цифры.
С каких пор Яндекс стал авторитетом? Он очень редко что-то умное выпускает.
Живой пример. Заполняю форму, ввожу капчу, 5 цифр "48*90", и вместо звездочки мне непонятно, то ли 1, то ли 7, жму обновить, получаю "65*23", вместо * то ли S, то ли 5, непонятно.
А в случае одной и той же капчи я просто буду обновлять до тех пор пока мне не станет ясна полная комбинация "48*90", конкретно всего одна цифра, скорее всего я это определю на следующем обновлении капче.
Просто ваш вариант подразумевает с бОльшей вероятностью несколько кликов, тогда как мое предложение как раз наоборот - очень маленькая вероятность, что вам придется обновлять хотя бы два раза.
С каких пор Яндекс стал авторитетом? Он очень редко что-то умное выпускает.
Для меня яндекс не авторитет, я просто его как пример привел.
Просто ваш вариант подразумевает с бОльшей вероятностью несколько кликов, тогда как мое предложение как раз наоборот - очень маленькая вероятность, что вам придется обновлять хотя бы два раза.
Антон, зачет! Грамотно. Правда после двух-трех обновлений я бы всё же отправил юзеру новую капчу, может быть он не переваривает данную комбинацию вообще
Изображение каптчи помещаем в див с классом 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С-Битрикс».