Задача — по определённому условию изменять итоговую сумму заказа в Drupal Commerce. Например нужно добавить к заказу стоимость доставки, если цена меньше определённой суммы; или сделать скидку постоянным покупателям; или сделать скидку по купонам. Кейсов множество.
Решений есть несколько и большинство довольно нетривиальные. Остановлюсь на двух самых простых.
Если к итоговой цене нужно добавлять/отнимать процент от стоимости, то выручит дефолтный модуль Tax (пример 1, пример 2).
Если к цене нужно добавлять/отнимать какую-то сумму, то поможет модуль Commerce Fees:
-
Включаем модуль Commerce Fees
-
На странице
admin/commerce/config/fees
добавляем новый Fee type: -
В админке Rules
admin/config/workflow/rules
добавляем правило с реакцией на событие Apply a fee to a given order: -
Добавляем необходимые условия
-
Добавляем действие Apply a fee to an order. В Entity выбираем
commerce-order
, в Fee созданный ранее Fee type, в Amount сумму (в копейках), на которую нужно изменить итоговую стоимость, а так же валюту:
Profit:
Если такую же табличку, с расчётом итоговой стоимости нужно показать и в корзине, то в представлении commerce_cart_form
, вместо подвала Commerce Line Item: Line item summary (Cart summary), добавляем Commerce Order: Order total:
Profit:
Добавлено 18.04.2014:
В модуле есть баг — если добавить условие Price comparsion, в котором проверять сумму заказа, то при определённых условиях Fee не будет применяться корректно. Как обойти баг читайте комментарии.
- Модуль Commerce Checkout Pages — дополнительные шаги в форме оформления заказа
- Дополнительные поля в форме оформления заказа Drupal Commerce
- Модуль Commerce Addressbook — адресная книга покупателя
- Модуль Commerce Checkout Redirect — принудительная регистрация/авторизация перед оформлением заказа
- Динамическая цена доставки типа Flat Rate
Комментарии
Скажите, а разве использование Rules - не будет d таких случаях более универсальным способом ?
здесь и используется Rules
Я имел в виду не подключать дополнительные модули в зависимости от того, что нужно сделать, а просто создать своё правило, в котором и прописать, что делать с ценой.
комерц не предоставляет таких возможностей
Гм... Я как-то с ней экспериментировал, вроде бы получалось что-то такое сделать.
Или дело в том, что я работал с версией 2.x ...
скорей всего вы экспериментировали с ценой товара.
версии 2.х ещё не существует.
Да, точно. Так и есть :)
Спасибо за пост. Второй способ вполне подошел, но возникла следующая проблема. При изменении количества товара и нажатия "обновить корзину" не добавляется сумма к итоговому заказу. Только при обновлении страницы
Все работает когда создаешь правило через admin/config/workflow/rules, но что если мне нужно чтобы правило работало через admin/commerce/config/product-pricing ? Там больше доступных селекторов, а мне как раз нужно считать итоговую сумму исходя из заказа
https://drupal.org/node/2201885
Добрый день!
Плиз, расскажите подробнее о 4м пункте.
Столкнулся с такой ошибкой:
В условиях цену можно получить только через "Price comparison" - это итоговая цена, с ценой доставки!
Если ставлю условие "Price comparison < 1500,00 руб", а товар стоит 1320, то условие выполняется через раз! Т.к. в первом случае мы получаем сумму 1320+250=1570 > 1500!! И при повторном обновлении он уже не считает доставку..
Ни ужели с 4 пунктом в статье, ни у кого не возникало проблем??
Проверил, действительно есть такая бага. Значит нужно отдельным правилом считать цену заказа без добавляемого fee и сравнивать с получившейся цифрой, а не с
commerce-order:commerce-order-total
Можно поставить модуль https://drupal.org/project/commerce_price_components и вместо условия Price comparsion добавить Data comparsion с селектором
commerce-order:commerce-order-total:base-price:amount
. Цену для сравнения указать в копейках.Ещё можно добавить условие Execute custom PHP code с кодом:
предварительно включив модуль PHP filter
Спасибо!! Успешно воспользовался третьим вариантом :)
Небольшой баг, последнюю строчку php кода нужно заменить на:
if ($amount_decimal > 0){ return $amount_decimal < 1500; }
Иначе после удаления товаров из корзины получим такую штуку:
На идеальность предложенного варианта не претендую :)
А можно ли как-то добавить к заказу не фиксированную стоимость доставки, а значение поля из дисплея товара, например $content['field_dostavka'][0] ?
в Amount доступны токены
Я так понимаю токен надо свой создавать, т.к. по-умолчанию полей дисплея в там нет
подгрузите отдельным экшеном
Доброго времени суток.
Можете подсказать, как правильно это сделать?
У меня есть доп.поле "списать с баланса" в профиле покупателя.
Пытаюсь по событию "Окончание процесса оформления" выполнить экшн "Fetch entity by property".
Параметры на скрине:
http://joxi.ru/DrlOykMsKVV0AP.png
Не понимаю, что делать с полем "значение", там не выбирается ничего похожего на нужные мне данные...
Правильно ли я вообще выбрал экшн?
речь шла о product display. с профилем не знаю как
Здравствуйте! меня интересует можно как то реализовать изменение минимальной суммы заказа при выборе товара которого нет в наличии? Использую модули Commerce Minimum & Maximum Order Amount (для установки минимальной суммы заказа) и Commerce Stock. Пытался создать правило, но не знаю какое выбирать событие, что бы запрещалось переходить к оформлению заказа и какое выбрать действие после проверки условия.
Помогите, пожалуйста. Требуется сделать наценку на товары при условии: стоимость заказа меньше 3000.
Создаю правило. При задании условия требуется заполнить Селектор данных.
Выбираю commerce-order:commerce-order-total:
Но дальше стоит двоеточие, а что туда писать после двоеточия, непонятно. Условие не сохраняется - появляется красная рамка.
Без двоеточия тоже не сохраняется.
Подскажите, как правильно заполнить Селектор данных?
commerce-order:commerce-order-total:amount
Добрый день! У меня ситуация: есть несколько способов доставки, у каждого своя стоимость. Какой rule нужно написать, чтобы при выборе определенного способа доставки добавлялась его стоимость?
Добавить комментарий