Drupal Commerce — расчет доставки для выбранного района

Есть список районов города, доставка в которые имеет фиксированную ставку. Пользователь выбирает район — программа должна подставить цену доставки для этого района.

Задача вроде простая, но приходится решать много попутных вопросов и в комплексе получается довольно сложно.

Как основу будем использовать модуль Commerce Shipping. Он реализует пару схем расчёта доставки и нам потребуется написать собственный расчет, как плагин для этого модуля.

Районы (зоны доставки) я создал как таксономию, мне кажется это удобно для управления ценами и добавления новых районов — zony_dostavki.

В этом словаре нужно создать поле, куда можно будет вписывать цену за доставку в этот район — field_stoimost_dostavki. Это поле типа «Цена», которое предоставляется модулем Commerce.

Настройка Commerce Shipping

Чтобы Shipping начал работать для ваших заказов, нужно провести настройки как «типа заказа» так и «типа товара».

В нужных типах заказов (если вы используете несколько) проставьте галку «разрешить доставку для этого типа заказов»:

В товарах, а вернее в настройках вариации товара, нужно указать что — это «доставляемый» товар.

Я отдельно на этом останавливаюсь, т.к. иначе панель доставки, вставленная в процесс оформления заказа в нужный вам этап, просто не будет отображаться. И многие задают вопросы вроде — «А почему не показывается панель (pane) доставки?».

Создание плагинов

Теперь отвлечемся от настроек и займемся делом. Нам нужно создать пару плагинов:

  1. Панель с выводом поля, где пользователь выбирает район доставки для создаваемого заказа;
  2. Собственный механизм расчета доставки, на основе выбранного района.

Панель для процесса оформления заказа

Таксономия со списком районов у нас уже создана, нам нужно поле в заказе. Добавим поле в настройки типа заказа (field_rayon_dostavki):

Это ссылка на сущность, в данном случае таксономии «Зоны доставки».

Теперь создадим панельку для конструктора «процесса оформления», с выводом этого поля. В Drupal 8/9 это выполняется как плагин с соответствующей аннотацией. Итак, файл, описывающий еще одну CheckoutPane, размещают в папке <YOUR-MODULE>/src/Plugin/Commerce/CheckoutPane с именем соответствующим имени нового класса — ShowDistrictField.php:

Свой механизм расчета доставки

Плагин для расчета доставки в терминах Drupal Commerce / Commerce Shipping обычно расширяет класс ShippingMethodBase, но мы будем использовать как основу класс FlatRate.

Создадим файл DistrictBased.php в папке <YOUR-MODULE>/src/Plugin/Commerce/ShippingMethod.

Как видите, опять же не сложный кусочек кода, но здесь множество вещей, которые нужно знать как делать.

Сбросьте кеш, чтобы Drupal прочитал новые плагины.

Настройка способов доставки

Мы создали метод расчета доставки, но в CMS, используя этот метод, нужно настроить «способ доставки».

Включим наш плагин расчета (District based) и заполним остальные поля. Цена, указанная здесь, будет ценой по умолчанию, если район не выбран.

Настройка панелей (panes) процесса оформления

Теперь всё готово, к тому чтобы расставить панели в нужном порядке.

Т.к. данные о районе попадают в объект заказа при сохранении данных очередного шага оформления, то нам нужно разнести панельку с полем выбора района и расчетом (+ данными и прочим) доставки на разные шаги. У меня это выглядело вот так:

Написать комментарий

Мало букафф? Читайте есчо !

Загрузить данные параграфов для связанного с ними entity

Июль 8, 2023 г.

Пример кода для загрузки параграфов. В данном примере будем загружать параграфы, связанные с entity commerce_product_variation (это сущность модуля Commerce). Я привязал информацию по остаткам складов к вариациям в виде параграфов (тип - stocks). ...

Читать

Делаем выгрузку xml для яндекс маркет

Сентябрь 23, 2023 г.

Ключевая особенность в том, что данные выгружаются из Drupal Commerce. Первое, что понадобится - это настроить какой то route, а потом мы напишем для него контроллер. Маршрут можно добавить в какой то кастомный модуль, выглядеть он может следующим ...

Читать

 

Комментарии к «Drupal Commerce — расчет доставки для выбранного района»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: