Разработчики Битрикса добавлять капчу в оформление заказа не планируются, а зря. Ну да ладно, исправляем эту ситуацию сами.
1) Как всегда первым делом копируем шаблон компонента, в нашем случае sale.order.ajax, я использовал шаблон .default, никто не мешает использовать visual.
2) Далее в файле template.php шаблона находит последние строки перед формой, там битрикс передает разные скрытые переменные, добавим туда саму капчу, вот кусок кода с капчей
<?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.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) Теперь напишем js (с помощью jQuery), который будет обновлять капчу. Поместим в самом низу файла 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) Добавим саму проверку captcha в init.php.
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"][] = 'Введите правильно "Код" с картинки';
}
}
|
Капча в оформлении заказа в битриксе готова.