Drupal → Динамическая цена доставки типа Flat Rate

02.12.2017

Во всех мануалах модуля Commerce Shipping советуют создавать отдельный способ доставки (shipping service) на каждую градацию цены, например:

- доставка для заказов дешевле 5000 р.
- доставка для заказов от 5000 до 10000 р.
- ...

У каждого способа будет своя цена и свои условия в rules компоненте.

Однако можно создать один способ доставки, а цену высчитывать динамически с помощью PHP:

/**
 * Implements hook_commerce_shipping_calculate_rate().
 */
function hook_commerce_shipping_calculate_rate($line_item) {
  $line_item_wrap = entity_metadata_wrapper('commerce_line_item', $line_item);

  if ($line_item_wrap->commerce_shipping_service->value() == 'russian_post') {
    $order_base_price = commerce_price_component_total($line_item_wrap->order->commerce_order_total->value(), 'base_price');
    $shipping_amount = ($order_base_price['amount'] < 1000000) ? 50000 : 20000;
    module_load_include('rules.inc', 'commerce_line_item');
    commerce_line_item_unit_price_add($line_item, $shipping_amount, $line_item->data['shipping_service']['price_component'], COMMERCE_ROUND_HALF_UP);
  }
}

Код устанавливает цену доставки russian_post в 500 рублей для заказов дешевле 10000, а для всех остальных — 200 руб. Цена должна быть в валюте, указанной в настройках shipping service.

Написанное актуально для
Commerce Shipping 7.x-2.3
Похожие записи

Комментарии

Андрей
03.12.2017, 08:08

Я в commerce 1.x на 7 версии Drupal делал 1 flat rate и в рулсах менял его как хочу. Последний раз, например цена на доставку зависела от количества товаров и одновременно от региона доставки. Единственный минус - на каждое уникальное условие доставки приходилось делать свой отдельный рулс. В итоге вышло около 10 рулсов.

В commerce 2.x такую фишку убрали? Я еще с ним детально не разбирался

Добавить комментарий