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

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

Определить в битриксе сумму заказов клиента, включающую текущую корзину

В битриксе есть механизм накопительных скидок. Там можно настроить, за какой период считать сумму оплаченных заказов клиента (например, за последние 2 месяца).
В данном случае понадобилось учитывать не только уже сделанные и оплаченные заказы, но и текущую корзину пользователя (чем больше положил в корзину, тем больше становится скидка).



Для этого можно использовать тот же класс CumulativeCalculator, который используется для расчета суммы заказов пользователя в стандартном механизме накопительных скидок.
Выполняем его метод calculate, предварительно подложив ему нужную нам конфигурацию для расчета:

$calculator = new \Bitrix\Sale\Discount\CumulativeCalculator(
         $this->userId,SITE_ID);$sumConfiguration = array (
    'type_sum_period'=> 'relative',
    'sum_period_data' => array(
        'period_value' => 2,
        'period_type' => 'M'
    ));
$calculator->setSumConfiguration($sumConfiguration);
$lastOrdersSum = $calculator->calculate();

Теперь нужно добавить к нему сумму из текущей корзины:

$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(),
 Main\Context::getCurrent()->getSite());
$basket = $basket->getOrderableItems();
$basketPrice = $basket->getPrice();
$this->userSum = $lastOrdersSum + $basketPrice;

Результат мы положили в свойство userSum, оно используется в кастомном классе. Класс вызывается на событии OnGetDiscountResult и определяет нужные нам данные пользователя для последующего назначения ему правильной скидки.
К сожалению, в новом механизме объединенных скидок разработчики битрикса убрали события OnGetDiscountResult и OnGetDiscount.

Комментарии

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

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

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

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