Чтобы реализовать функционал проверки номера телефона при оформлении заказа необходимо ДОРАБОТАТЬ процесс оформления заказа с помощью модуля Шаблон формы заказа с управляемой корзиной.
Решение состоит из нескольких этапов.
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); } } } }