+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Добавляем капчу (captcha) в оформление заказа (sale.order.ajax)

Разработчики Битрикса добавлять капчу в оформление заказа не планируются, а зря. Ну да ладно, исправляем эту ситуацию сами.

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">&nbsp;</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"][] = 'Введите правильно "Код" с картинки';

   }
}

Капча в оформлении заказа в битриксе готова.

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA