Новый шаблон sale.order.ajax: кастомизация

Изображение
На реализацию этого функционала ушло порядка 30 часов рабочего времени (плюс время на самообразование). За это время было отправлено 18 коммитов, написано 371 строк кода и осуществлено несколько попыток виртуального суицида :) Основная задача Создать группу свойств "Параметры доставки", которая будет зависеть от выбора типа доставки. Для курьера это "Адрес доставки", для "Транспортной компании" это выбор ТК из выпадающего списка, для доставки "Другая транспортная компания" - тоже текстовое поле (как и адрес доставки). Все эти поля являются обязательными, и отображаться должны не в блоке "Пользователь", а в блоке с доставками. В новом шаблоне sale.order.ajax перенести поля в другой блок не так просто, как кажется на первый взгляд, а информации на эту тему буквально крупицы.

Оформление заказа без использования функционала интернет-магазина

Итак, сегодня задача была несколько странновата.
Заказчик, имея полноценную версию интернет-магазина, желает получать заказы через подобие "формы обратной связи".
Для удобства я сразу решила определять все заказы в инфоблок "Заказы", чтобы они хранились еще хоть где-то, кроме почты.

Поэтому использую компонент iblock.element.add.form.
Заказы успешно добавляются, но теперь нужно, чтобы еще и почта приходила.
Штатного события "Добавлен элемент в инфоблок" в системе нет. Поэтому пишем свой обработчик в init.php.

Если используется событие OnAfterIBlockElementAdd, то ID инфоблока в который добавлен элемент - это $arFields["IBLOCK_ID"].

Достаточно понятно этот механизм описан у Дениса Шаромова в статье о создании своего почтового события и шаблона.

Кроме прочих данных, нам в письме понадобится ID товара, на котором нажали кнопку "Купить". Для этого кнопка "Купить" имеет идентификатор, например, id=171, который совпадает с ID элемента инфоблока товара.
Передается он в форму таким образом.
Во-первых, в шаблоне компонента iblock.element.add.form внутри тега input (тот, который text) стоит вот такое условие:
<?if($propertyID=="NAME"):?> id="PRID" type="hidden" <?else:?> type="text" <?endif?>
То есть если мы наткнулись на поле с идентификатором NAME (название инфоблока, которое, кстати, является обязательным), мы присваиваем инпуту id=PRID (Продукт Айди) и делаем его скрытым. Иначе - это просто поле text.

Далее при нажатии кнопки "Купить" выполняется onclick="javascript:set_product_id.call(this);"
(пояснение: да, скорее всего, было бы разумнее прописать в качестве события jQuery где-нибудь в теле страницы - для кнопок, имеющих класс buy)
Вызов с помощью call используется, потому что иначе параметр this внутри функции не будет указывать на объект нажатой кнопки.

Функция же set_product_id подключается в хедере шаблона из файла /js/orderform.js следующего содержания:

        function set_product_id() {
          //alert(this.id);
          $("#PRID").val(this.id); //самая главная строчка, передающая ID товара (кнопки)

          if ($('#'+this.id).hasClass('price')) //если нажата кнопка "Цена"
          {
            $('#buy').hide();
            $('#price').show();
          };
          if ($('#'+this.id).hasClass('buy')) //если нажата кнопка "Купить"
          {
            $('#price').hide();
            $('#buy').show();  
          };
    };
      
Помимо самой главной строчки, функция также выбирает, какую форму заказа показывать клиенту во всплывающем окне - для заказа товара или форму "Заказать прайс" при нажатии кнопки "Цена" (да-да, именно так, "клиент всегда прав").

Но вернемся к нашим баранам нашему письму. Помимо информации о клиенте, нам необходимо в письме дать ссылку и название товара, на котором была щелкнута ссылка "Купить".
Так как на сайте используется ЧПУ, простой подстановкой ID товара в URL здесь обойтись не получится.
Поэтому нам нужно будет получить полную информацию о товаре по его ID. Заодно узнаем его название и пропишем красиво в текст ссылочки.

              if ($arFields['NAME']!='')
              {
                $res = CIBlockElement::GetByID($arFields['NAME']);
                if($ar_res = $res->GetNext())
                  $product="<a href='http://".$_SERVER['HTTP_HOST'].$ar_res['DETAIL_PAGE_URL']."'>".$ar_res['NAME']."</a>";
              }

Комментарии

Популярные сообщения из этого блога

Новый шаблон sale.order.ajax: кастомизация

Вывод пользовательского свойства раздела в компонентах catalog.section и news.list

Если при полной выгрузке из 1С в битрикс товары и разделы приходят неактивными