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