2  /  2

Проверка телефона в форме заказа (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);
			}
		}
	}
}