Оформление заказа с необязательным полем "E-mail"
Отсутствие электронной почты у посетителя сайта может стать причиной несовершившегося заказа в интернет-магазине. да, и такое бывает!
Замечательно, давайте сделаем свойство заказа "имейл" необязательным полем. Снимаем галочку, но нет же - компонент sale.order.ajax все-равно ругается, что поле email не заполнено. И даже снятая галочка в настройках главного модуля "E-mail является обязательным полем:" не помогает. Что делать? Лезем в код компонента sale.order.ajax, узнаем что разработчики догадались впихнуть туда обработчики событий, на которых мы бы с радостью и "выехали", но вызовы обработчиков находятся после проверки $_POST в компоненте, поэтому и тут разочарование. Придется либо кастомить логику компонента, либо
говнохардкодить прямо в init.php. Из двух зол, я выбрал второе, поскольку уж очень не хочется один из важнейших компонентов оставлять не обновляемым системой.
Итак, намутил вот такой кондовый способ, который особо не тестировал, поэтому собираем консилиум, критикуем и предлагаем:
init.php:
// ORDER_PROP_2 - свойство заказа "телефон"
// ORDER_PROP_3 - свойство заказа "email"
global $APPLICATION;
if ('/personal/order/make/' == $APPLICATION->GetCurDir()) // урл страницы оформления заказа
{
$sOrderPropPhone = '';
if (isset($_POST['ORDER_PROP_2'])) // эту секцию if можно вообще удалить, если у вас телефон не обязательное поле
{
$sOrderPropPhone = filter_var($_POST['ORDER_PROP_2'], FILTER_SANITIZE_NUMBER_INT); // аналог preg_replace("/[^0-9,+,-]/","",$string);
}
// если и телефон не заполнен, тогда вместо него в мыле будет значение unix времени
// это нужно только для того чтобы не выводить ошибку "имейл не заполнен", т.к. телефон у нас все-равно обязательное поле
if (0 == strlen($sOrderPropPhone))
{
$sOrderPropPhone = time();
}
if ((!isset($_POST['ORDER_PROP_3']) || empty($_POST['ORDER_PROP_3'])))
{
$_POST['ORDER_PROP_3'] = $sOrderPropPhone."@mysite.ru";
}
} |
Для универсальности невозбраняется предварительно узнать актуальный ORDER_PROP_ID и option SERVER_NAME.
Ну, а в шаблоне компонента sale.order.ajax, файл props.php
elseif($arProperties["TYPE"] == "TEXT")
{
if ("Y" == $arProperties["IS_EMAIL"] && strpos($arProperties["VALUE"], "@mysite.ru"))
{
$arProperties['VALUE'] = '';
}
?>
<input class="large" type="text" maxlength="250" size="<?=$arProperties["SIZE1"]?>" value="<?=$arProperties["VALUE"]?>" name="<?=$arProperties["FIELD_NAME"]?>" id="<?=$arProperties["FIELD_NAME"]?>">
<?
} |
Т.е. проверяем, если выводится инпут для имейла и значение имейла содержит в себе наше фейкомыльце, то подменяем его на пустую строку, чтобы юзер внедоумении не видел под каким имейлом он будет в БД.
и чуть выше по коду файла props.php место где выводится label для инпута:
<?php if($arProperties["REQUIED_FORMATED"]=="Y" && 'Y' != $arProperties['IS_EMAIL']):?>
<em>*</em>
<?php endif; ?> |
Заценил орфографию в коде БУС: обязательность полей пишут как REQUIED, IS_REQUIED
Назад в раздел