Оформление заказа - настройка компонента и правка шаблона
Настраиваем форму оформления заказа, добавляем своё поле и разбираемся, почему доставка не выводится.
Решение
Ставим компонент оформления на страницу:
$APPLICATION->IncludeComponent('bitrix:sale.order.ajax', '', [ 'PERSON_TYPE' => [1, 2], // типы плательщика: физлицо, компания 'ALLOW_AUTO_REGISTER' => 'Y', 'DELIVERY_NO_AJAX' => 'N', 'PATH_TO_BASKET' => '/personal/cart/', // возврат в корзину из формы 'PATH_TO_PAYMENT' => '/personal/order/payment/', 'DELIVERY_TO_PAYSYSTEM' => 'd2p', // порядок выбора: доставка, потом оплата // шаблон компонента задают третьим аргументом: пустая строка берёт .default]);Компонент рисует все шаги сам и обменивается с сервером на каждое изменение формы. Отдельных страниц под шаги создавать не нужно, и попытка разложить их по страницам ломает пересчёт итогов.
Заводим своё свойство заказа:
use Bitrix\Sale\Internals\OrderPropsTable;
OrderPropsTable::add([ 'PERSON_TYPE_ID' => 1, // свойство принадлежит типу плательщика 'NAME' => 'Код домофона', 'TYPE' => 'STRING', 'CODE' => 'DOOR_CODE', 'REQUIRED' => 'N', 'UTIL' => 'N', // служебные свойства в форме не показываются]);Свойство привязано к типу плательщика, а не к заказу вообще. Заведённое для физлица поле не появится у компании, и это самая частая причина «поле есть в настройках, но не видно в форме».
Смотрим, какие доставки доступны заказу:
use Bitrix\Sale\Delivery\Services\Manager;
foreach (Manager::getActiveList() as $service) { printf("%-6s %-30s ограничений=%d\n", $service['ID'], $service['NAME'], count(Manager::getRestrictionsList($service['ID'])));}Каждая служба проверяется своими ограничениями: сумма, вес, местоположение, группа покупателя. Не прошедшая хотя бы одно из них служба в форму не попадает и никак об этом не сообщает.
Переопределяем шаблон формы:
# копия в своём шаблоне сайта: обновления продукта её не тронутcp -r bitrix/components/bitrix/sale.order.ajax/templates/bootstrap_v4 \ local/templates/main/components/bitrix/sale.order.ajax/my_checkoutПравки в исходном шаблоне живут до первого обновления модуля продаж. Копия в своём шаблоне сайта переживает обновления, но перестаёт получать исправления разметки от вендора - это осознанный обмен.
Значение свойства доезжает до заказа только через штатный механизм свойств. Поле, дописанное прямо в разметку шаблона, отправится вместе с формой, но модуль продаж его не примет: он сохраняет только известные ему свойства своего типа плательщика. Такие поля либо заводят свойствами, либо обрабатывают своим кодом в событии сохранения заказа.
Обязательность поля проверяется на сервере, а не в разметке. Убранный из шаблона блок с обязательным свойством не отменяет проверку: заказ не оформится, а сообщение об ошибке будет некуда вывести. Поэтому лишние поля отключают в настройках свойства, а не прячут стилями.
Типичные проблемы
Своё свойство не появляется в форме.
Оно привязано к другому типу плательщика либо помечено служебным. Форма показывает только свойства своего типа.
Служба доставки активна, но её нет в списке.
Она не проходит одно из своих ограничений. Ограничения проверяются молча, и отказ ничем не показывается покупателю.
Заказ не оформляется, ошибок на экране нет.
Не заполнено обязательное свойство, спрятанное в шаблоне. Проверка идёт на сервере, а место для вывода ошибки в разметке потерялось.
После обновления модуля пропали правки формы.
Правился исходный шаблон компонента. Обновление перезаписывает его целиком, копию в своём шаблоне сайта - нет.
Итоги не пересчитываются при смене доставки.
Форма разложена по своим страницам или сломан обмен с сервером. Компонент рассчитан на один шаг с обновлением по частям.
Частые вопросы
Можно ли сделать оформление в один шаг?
Форма и так работает одной страницей: шаги внутри неё - это разделы разметки. Свести их в один экран - задача шаблона, а не настроек компонента.
Как менять состав полей для юрлиц и физлиц?
Через типы плательщика: у каждого свой набор свойств заказа. Один и тот же компонент показывает разные поля в зависимости от выбранного типа.
Почему при смене оплаты меняется список доставок?
Ограничения служб учитывают выбранную оплату и наоборот. Совместимость доставки и оплаты настраивается ограничениями, а не порядком шагов.
Как добавить поле, которого нет среди типов свойств?
Через свойство с типом строки и своей обработкой в обработчике события сохранения заказа. Штатных полей произвольного вида в модуле продаж нет.
Смежное
- Оформление заказа - оглавление подтемы
- Своё поле в оформлении заказа: свойство, группа, свой тип - как добавить в форму своё поле
- Корзина - что попадает в заказ до оформления
- Сумма заказа не сходится с корзиной: разбор причин - разбор расхождения итоговой суммы
- Заказы и статусы - жизнь заказа после оформления
- Свой расчёт в оформлении: цена позиции и доставка - почему правки цены в шаблоне не доезжают
- Настройка магазина по шагам: что за чем включать - что настроить до самой формы
- Каталог и продажи - устройство магазина целиком
- Служба доставки и платёжная система: настройка и свой обработчик - откуда берётся список доставок
- Регистрация покупателей: форма, подтверждение, свои поля - учётная запись при заказе без входа
- События оформления заказа: свои проверки, запрет и допданные - свои проверки поверх компонента
- Оформление требует входа: разбор причин - если покупателя разворачивает на вход