Сейчас покажу, как на практике можно применить новые правила, описанные в статье Учим rules работать с полем Price у заказа.
Задача такая - разрешить пользователю во время оформления заказа выбрать вариант предоплаты (50% от стоимости заказа). Например, при продаже билетов на мероприятие. Остальная оплата будет осуществляться на месте самого мероприятия...
Шаг 1: Настройка интерфеса для пользователей
Необходимо добавить новое поле на форму оформления заказа (checkout). Для этого необходимо включаем модуль Commerce Fieldgroup Panes, который превращает группы полей заказа в Checkout Panes.
На странице управления полями заказа admin/commerce/config/order/fields добавляем новую группу и новое поле. Я назвал его field_payment_type (Тип оплаты):
Настройки поля field_payment_type:
На странице настроек чекаута admin/commerce/config/checkout переносим появившуюся панель из Disabled в нужный шаг:
Тут важно понимать только одно - выбор оплаты должен находится перед шагом Проверка, т.е. минимум одна перезагрузка страницы должна быть. Именно в тот момент и юудет происходить пересчет общей стоимости заказа.
Результат:
Шаг 2: Пересчет стоимости заказа
Осталось выполнить пересчет стоимости заказа в момент его обновления. Это можно сделать программно (аналогично этому материалу). А можно настроить через Правила, предварительно "научив" их работать с полем Price.
На странице admin/config/workflow/rules создаем новое правило на событие "Перед сохранением commerce order".
В разделе "Условия" указываем
- Сущность имеет поле "field_payment_type"
- Сравнение данных - commerce-order:field-payment-type = 50% Предоплата
В разделе "Действия" изменяем цену в 2 раза
- Multiply the order price by some amount 0.5
Вот так выглядит данное правило "изнутри":
{ "rules_type_payment" : { "LABEL" : "50% - Type payment", "PLUGIN" : "reaction rule", "ACTIVE" : false, "OWNER" : "rules", "TAGS" : [ "frantsuzzz" ], "REQUIRES" : [ "rules", "frz_tweaks", "entity" ], "ON" : { "commerce_order_presave" : [] }, "IF" : [ { "entity_has_field" : { "entity" : [ "commerce-order" ], "field" : "field_payment_type" } }, { "data_is" : { "data" : [ "commerce-order:field-payment-type" ], "value" : "1" } } ], "DO" : [ { "frz_tweaks_commerce_order_price_multiply" : { "commerce_order" : [ "commerce_order" ], "amount" : "0.5", "component_name" : "discount", "round_mode" : "1" } } ] } } //frz_tweaks - так называется мой модуль, в котором я создавал новые действия для правил
Результат:
Комментарии
Добавить комментарий