По умолчанию форма заказа на "Битрикс" CAPTCHA не выводит. Причины, с одной стороны, понятны. Любое препятствие при оформлении заказа может отпугнуть посетителя, и покупка не состоится. Но, с другой стороны, незащищенная форма обязательно приманивает всяких злонамеренных личностей, стремящихся получить к сайту несанкционированный доступ. В порядке компромисса предлагаем настроить вывод CAPTCHA, чтобы потом сопоставить возможную потерю пользователей с очевидными преимуществами безопасности. Итак:
1. Скопируем шаблон компонента sale.order.ajax
2. Модифицируем файл компонента template.php
Добавим код, вызывающий форму CAPTCHA
<?if($_POST["is_ajax_post"] != "Y")
{
?>
</div>
<input type="hidden" name="confirmorder" id="confirmorder" value="Y">
<input type="hidden" name="profile_change" id="profile_change" value="N">
<input type="hidden" name="is_ajax_post" id="is_ajax_post" value="Y">
<?
// Получаем код капчи
$code = $APPLICATION->CaptchaGetCode();
?>
<div class="captcha-holder">
<label for="object-20">Введите символы:</label>
<?// Изображение капчи?>
<img src="/bitrix/tools/captcha.php?captcha_sid=<?=$code;?>" alt="CAPTCHA" width="110" height="33" class="captcha_pic" />
<?// Обновление капчи?>
<a href="#" rel="nofollow" class="update-captcha"> </a>
<?// Скрытое поле капчи?>
<input type="hidden" name="captcha_sid" value="<?=$code;?>" />
<?// Поле для ввода капчи пользователем?>
<input type="text" id="object-20" class="form-text" name="captcha_word" value="" />
</div><!-- captcha-holder -->
<div class="description"><span>*</span> Поля, необходимые для заполнения</div>
<div class="btn-holder">
<input type="button" name="submitbutton" onClick="submitForm('Y');" value="<?=GetMessage("SOA_TEMPL_BUTTON")?>" class="form-submit">
</div><!-- btn-holder -->
</fieldset>
</form>
<?if($arParams["DELIVERY_NO_AJAX"] == "N"):?>
<script type="text/javascript" src="/bitrix/js/main/cphttprequest.js"></script>
<script type="text/javascript" src="/bitrix/components/bitrix/sale.ajax.delivery.calculator/templates/.default/proceed.js"></script>
<?endif;?>
<?
}
3. Создадим файл, генерирующий новые значения CAPTCHA
Разместим в корневом каталоге сайта файл captcha.php, содержащий следующий код:
<?if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')
{
require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
if($_POST['captcha'] == 'yes')
{
echo $code = $APPLICATION->CaptchaGetCode();
}
else
die();
}
else
die();
?>
4. Добавим код на JavaScript, обновляющий CAPTCHA
Разместим в самом конце файла template.php следующий фрагмент кода:
<script>
$(document).ready(function() {
$('.update-captcha').on('click', function(){
$.ajax({
url: '/captcha.php',
type: 'post',
data: 'captcha=yes',
success: function(data){
$('#ORDER_FORM .captcha_pic').attr('src', '/bitrix/tools/captcha.php?captcha_sid=' + data);
$('#ORDER_FORM input[name="captcha_sid"]').val(data);
}
});
return false;
});
$('.form-submit').on('click', function(){
$.ajax({
url: '/captcha.php',
type: 'post',
data: 'captcha=yes',
success: function(data){
$('#ORDER_FORM .captcha_pic').attr('src', '/bitrix/tools/captcha.php?captcha_sid=' + data);
$('#ORDER_FORM input[name="captcha_sid"]').val(data);
}
});
});
});
</script>
5. Модифицируем файл init.php
Добавим в него код проверки CAPTCHA
AddEventHandler("sale", "OnSaleComponentOrderOneStepProcess", array("MyClass", "OnSaleComponentOrderOneStepProcessHandler"));
class MyClass
{
function OnSaleComponentOrderOneStepProcessHandler(&$arResult, &$arUserResult)
{
global $APPLICATION;
if($arUserResult["CONFIRM_ORDER"] == "Y" && !$APPLICATION->CaptchaCheckCode($_POST['captcha_word'], $_POST['captcha_sid']))
$arResult["ERROR"][] = 'Введите правильно "Код" с картинки';
}
}
Готово!
Назад в раздел