+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Оформление заказа с необязательным полем "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


Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA