Дорабатываем стандартные модули доставки Virtuemart для учета зависимости стоимости доставки от суммы заказа

Стандартный модуль доставки (Standard Shipping Module) не в состоянии автоматически учесть стоимость доставки, зависящую от суммы заказа. Для этого есть другой модуль — shipvalue. Он как раз позволяет сделать все более-менее автоматически. Набрал пользователь товаров на сумму больше 5000 рублей — получи бесплатную доставку. Не набрал — плати еще 300 рублей.

Ко мне в руки попал магазин, где оба эти модуля работали вместе. Shipvalue показывал пользователю, есть ли у него халявная доставка, а SSM (пусть для краткости будет так) позволял выбрать куда доставить. По Москве курьером или тем же курьером, но дороже и в Московскую область.

И тут выяснилось, что работали они неправильно (уж не знаю, чей это был косяк, но мне предстояло его скорее исправить). Выглядело все так: shipvalue смотрит (указывается в настройках модуля) — если сумма больше или равна 5000 рублей, то он ставит в стоимость доставки НОЛЬ рублей и, соответственно, если заказано до 5000р, то он выводит 300 рублей за доставку.

Все бы хорошо, но SSM тоже не дурак и вносит свою капельку. По-умолчанию option стоит на «Доставка по Москве курьером за 300 рублей», соответственно, ему абсолютно пофигу, что там думает shipvalue или кто-то еще о том, сколько брать с клиента за доставку и ставит свои 300 рублей по тарифу в админке.

Вроде бы все верно, да не совсем — клиент заказал, например, на 10000 всякой лабуды, а ему еще и 300 рублей за доставку хотят сверху положить… Клиент расстраивается, ругается и уходит…

Ремонтируем это безобразие.
Сначала я думал избавиться от shipvalue насовсем и проводить проверку прямо в коде SSM, но:

  1. SSM не оперирует данными о сумме заказа;
  2. это будет не совсем удобно на будущее (обязательно забудется, что эти самые 5000 где-то в коде и где конкретно).

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

Нам понадобятся два файла:

  • administrator\components\com_virtuemart\classes\shipping\shipvalue.php
  • administrator\components\com_virtuemart\classes\shipping\standard_shipping.php

В shipvalue.php объявляем глобальную переменную $myFLAG_flat_charge2 (я ее назвал так, ибо flat_charge2 — это переменная, которая определяет второй вариант — здесь это «заказано более, чем на 5000 р.». Соответственно, myFLAG — это указатель, что это мой флаг, а не флаг Virtuemart) и делаем его FALSE: $myFLAG_flat_charge2 = FALSE; (типа флаг не отработал и ничего нам не сообщал еще). Таким образом у нас в строке 56 (пусть будет 56 — между блоками кода) получается такое:

/* устанавливаем глобальный флаг. по-умолчанию FALSE.
*/
global $myFLAG_flat_charge2; //в standard_shipping.php передается флаг: сумма ПРЕВЫШАЕТ 5000 рублей
$myFLAG_flat_charge2 = FALSE;
/*
* флаг устанавливается в TRUE примерно в строке 95 (об этом дальше)
*/

Далее ищем строчку

else if($order_total < $base_ship2) {

— это как раз проверка на диапазон, в котором работает наша бесплатная доставка (строчка 81-86 где-то).
Теперь идем до конца блока IF и после $_SESSION[$shipping_rate_id] = 1; вставляем наш флаг:

//Флаг указывает на то, что сумма ПРЕВЫШАЕТ 5000 рублей
$myFLAG_flat_charge2 = TRUE;

Ну, тут вроде все.

Теперь в  файле standard_shipping.php в функции list_rates ищем строчку $show_shipping_handling = $CURRENCY_DISPLAY->getFullValue( $total_shipping_handling ) ; и прямо над ней вставляем такй код:

/* если тариф доставки = 1 (в пределах МКАД) и получен флаг из shipvalue.php о том, что сумма заказа ПРЕВЫШАЕТ 5000рэ TRUE,
* то ставим тариф НОЛЬ рублей (для расчета и вывода в таблицу пользователя)
*/
if ( $dbr->f("shipping_rate_id") == 1 AND $GLOBALS['myFLAG_flat_charge2'] == TRUE ) $total_shipping_handling = 0;

Объясню.

$dbr->f(«shipping_rate_id») == 1 это ни что иное, как ID нашего способа доставки. Если посмотреть выше по коду, то увидим, что таблица с выбором варианта доставки (и, как следствие, тарифами) выводится с помощью цикла WHILE .. DO и все проясняется.

У меня, например, ID у Москвы («Курьером по Москве») = 1, таким образом, если ID меняется — его всегда можно переназначит в этой строчке.

Ну, думаю $GLOBALS[‘myFLAG_flat_charge2’] == TRUE долго объяснять не нужно )) тут и так понятно, что проверяем наш глобальный флаг с условием стоимости заказа.

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

Удачи 🙂

0

Дорабатываем стандартные модули доставки Virtuemart для учета зависимости стоимости доставки от суммы заказа: 1 комментарий

  1. EGLrec

    1. не привильно написана переменная в коде $dbr->f(\»shipping_rate_id\»), должно быть,как в описании: $dbr->f(«shipping_rate_id»)
    2. не работает,т.к. глобальная переменная не передаёт своё значения из shipvalue.php в standard_shipping.php!!!

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