АРАМА: Шаблон формы заказа с управляемой корзиной

Проверка телефона в форме заказа (bitrix:sale.order.ajax) с помощью отправки CMC

Чтобы реализовать функционал проверки номера телефона при оформлении заказа необходимо ДОРАБОТАТЬ процесс оформления заказа с помощью модуля АРАМА: Шаблон формы заказа с управляемой корзиной.

Решение состоит из нескольких этапов.

I. Создать свойства заказа Телефон и Код из СМС. Да Вы не ослышались, мы предлагаем для ввода кода из СМС использовать стандартное свойство заказа и отображать его нужным образом в нужный момент (об этом позже).

II. У вас должен быть установлен и подключен шаблон компонента формы заказ bitrix:sale.order.ajax от модуля  АРАМА: Шаблон формы заказа с управляемой корзиной.

III. Согласно требованиям шаблона этого модуля, в обязательно должен быть включен параметр: Режим совместимости для предыдущего шаблона в параметрах компонента  bitrix:sale.order.ajax.

IV. В настройках модуля Интернет-магазин (Настройки -> Настройки продукта -> Настройки модулей -> Интернет-магазин) от 1С-Битрикс Включить обработку устаревших событий, чтобы мы могли воспользоваться нужными обработчиками событий, связанные с компонентами, а именно OnSaleComponentOrderOneStepOrderProps.

Внимание: В статье приведены фрагменты кода, описывающие принцип реализации задачи, т.е. сырой код, а не полностью рабочий продукт. С учетом особенностей Вашего проекта условия могут быть другие.

Для внедрения рекомендуется обратиться к компетентным специалистам.

Также можете обратиться к нам в форме обратной связи или в чат за возможной помощью за отдельное вознаграждение.

V. Разместить слушателей изменения полей на jquery, отвечающих за Номер телефона и Код из СМС на странице размещения компонента оформления заказа.

< script type="text/javascript">
   BX.ready(function(){
      //ловим изменения поля Телефон
      $(document).on('change', '.sc-order-properties-phone input[type="text"]', function(e) {
         //если телефон задан
         if ($(this).val().length == 11)
            submitForm();      //обновляем форму
      });
      //ловим изменения поля Код из СМС
      $(document).on('change', '.sc-order-properties-phone_code input[type="text"]', function(e) {
         //если код введен
         if ($(this).val().length != 0)
            submitForm();      //обновляем форму
      });
   });
< /script>

VI. В init.php описать функционал запрета дальнейшего редактирования Номера телефона, а также отображения/скрытия поля Код из СМС.

AddEventHandler("sale", "OnSaleComponentOrderOneStepOrderProps", Array("CDev", "OnSaleComponentOrderOneStepOrderPropsHandler"));
class CDev
{
        //SMS: Вспомогательная функция, где необходимо описать отправку СМС с помомщью ипользуемого вашего модуля
        function send_sms($phone, $text)
        {
                //TODO отправка СМС
                return true;
        }
        //SMS: Вспомогательная функция, служит для изменения данных по свойствам заказов 
        function __check_send_orderproperties(&$properties,$ar_phone_id = array(),$load = array())
        {
                //смотрим в свойствах, входящих в профиль
                if (!empty($properties['USER_PROPS_Y']))
                {
                        foreach ($properties['USER_PROPS_Y'] as $prop_id => $property)
                        {
                                if (in_array($property["ID"],$ar_phone_id))
                                {
                                        foreach($load as $code => $val)
                                        {
                                                $properties['USER_PROPS_Y'][$prop_id][$code] = $val;
                                        }
                                        break;
                                }
                        }
                }
                //если не нашли, смотрим в свойствах, НЕ входящих в профиль
                if (!empty($properties['USER_PROPS_N']))
                {
                        foreach ($properties['USER_PROPS_N'] as $prop_id => $property)
                        {
                                if (in_array($property["ID"],$ar_phone_id))
                                {
                                        foreach($load as $code => $val)
                                        {
                                                $properties['USER_PROPS_Y'][$prop_id][$code] = $val;
                                        }
                                        break;
                                }
                        }
                }
                //если не нашли, смотрим в свойствах, зависящих от служб доставки или платежных систем
                if (!empty($properties['RELATED']))
                {
                        foreach ($properties['RELATED'] as $prop_id => $property)
                        {
                                if (in_array($property["ID"],$ar_phone_id))
                                {
                                        foreach($load as $code => $val)
                                        {
                                                $properties['USER_PROPS_Y'][$prop_id][$code] = $val;
                                        }
                                        break;
                                }
                        }
                }
        }
        //SMS: Вызывается в компоненте bitrix:sale.order.ajax после формирования списка доступных свойств заказа, может быть использовано для модификации данных.
        function OnSaleComponentOrderOneStepOrderPropsHandler(&$arResult,&$arUserResult,$arParams)
        {
                if (is_array($arUserResult['ORDER_PROP']))
                {
                        global $APPLICATION;
                        $time = 120;
                        $phone_length = 11;
                        $ar_phone_id = array(
                                3,                //для типа плательщика "Физическое лицо"
                                14,                //для типа плательщика "Юридическое лицо"
                        );
                        $ar_sms_id = array(
                                23,                //для типа плательщика "Физическое лицо"
                                24,                //для типа плательщика "Юридическое лицо"
                        );
                        foreach ($ar_phone_id as $id)
                        {
                                if (array_key_exists($id,$arUserResult['ORDER_PROP']))
                                {
                                        $phone_id = $id;
                                        break;
                                }
                        }
                        foreach ($ar_sms_id as $id)
                        {
                                if (array_key_exists($id,$arUserResult['ORDER_PROP']))
                                {
                                        $sms_code_id = $id;
                                        break;
                                }
                        }
                        if ($phone_id>0)
                        {
                                $phone = preg_replace('/[^0-9]/', '', $arUserResult['ORDER_PROP'][$phone_id]);
                                //если СМС еще не отправлено и задан номер телефона
                                if ($APPLICATION->get_cookie("SC_ORDER_PHONE")==""
                                        && strlen($phone) == $phone_length
                                        )
                                {
                                        //ГЕНЕРИРУЕМ СЛУЧАЙНЫ СМС КОД
                                        $generate_sms_code = randString(5, array(
                                          "abcdefghijklnmopqrstuvwxyz",
                                          "ABCDEFGHIJKLNMOPQRSTUVWXYZ",
                                          "0123456789",
                                        ));
                                        $APPLICATION->set_cookie("SC_ORDER_SMS_CODE", $generate_sms_code, time()+$time, "/");        //записаываем СМС КОД в куки
                                        //TODO SEND SMS
                                        //ТУТ НЕОБХОДИМО ВЫЗВАТЬ АПИ ФУНКЦИЮ ОТПРАВКИ СМС ВАШЕГО МОДУЛЯ
                                        //НАПРИМЕР send_sms($phone,$text); - название send_sms приведено для примера, в вашем случае можете описать свою
                                        $text = "Ваш СМС код " . $generate_sms_code;
                                        //если СМС отправлено
                                        if (self::send_sms($phone,$text))
                                        {
                                                $APPLICATION->set_cookie("SC_ORDER_PHONE", $phone, time()+$time, "/");                //записаываем номер телефона в куки
                                        }
                                }
                        }
                        //если НОМЕР ТЕЛЕФОНА есть в куки, т.е. СМС отправлено, не даем менять телефон
                        if ($APPLICATION->get_cookie("SC_ORDER_PHONE")!="")
                        {
                                $load = array(
                                        "READONLY" => "Y",
                                        "DISABLED" => "Y",
                                );
                                self::__check_send_orderproperties($arResult['ORDER_PROP'],$ar_phone_id,$load);
                                if ($sms_code_id>0)
                                {
                                        $sms_code = trim($arUserResult['ORDER_PROP'][$sms_code_id]);
                                        //если SMS код введен
                                        if ($sms_code!="")
                                        {
                                                $need_code = $APPLICATION->get_cookie("SC_ORDER_SMS_CODE");
                                                //если СМС код равен сгенерированному коду, т.е. телефон подтвержден
                                                if ($sms_code == $need_code)
                                                {
                                                        //скрываем свойство SMS код
                                                        $load = array(
                                                                "READONLY" => "Y",
                                                                "DISABLED" => "Y",
                                                                "HIDE_ALLBLOCK" => "Y",
                                                                "REQUIED_FORMATED" => "Y",
                                                        );
                                                        self::__check_send_orderproperties($arResult['ORDER_PROP'],$ar_sms_id,$load);
                                                }
                                        }
                                }
                        }
                        else
                        {
                                $load = array(
                                        "READONLY" => "Y",
                                        "DISABLED" => "Y",
                                        "HIDE_ALLBLOCK" => "Y",
                                        "REQUIED_FORMATED" => "Y",
                                );
                                self::__check_send_orderproperties($arResult['ORDER_PROP'],$ar_sms_id,$load);
                        }
                }
        }
}