Скидка от количества для любого способа доставки в Opencart

Дисклеймер: Тестировал на Opencart 2.0 и 2.1

Предыстория

Opencart классный движок для интернет магазинов, но функционала из коробки часто не хватает для самых элементарных задач, поэтому приходится постоянно его дополнять всякими платными модулями. Хорошо это или нет решать вам. Главным минусом платных плагинов в том, что их исходный код закрыт под кубом, таким образом мы, программисты не можем изменить или расширить, никак.

В такой ситуации оказался я, когда на сайте у одного из моих клиентов были установлены несколько платных плагинов доставки и платный плагин скидок, и все бы хорошо, до тех пор пока клиент не захотел сделать новую акцию. Для заказывающих от 3-х товаров стоимость доставки Почты России – 199 рублей. Вот такая казалось бы простая акция, однако из-за закрытого кода плагинов это оказалось не простой задачей.

Попытка №1

Итак, вначале я конечно пытался решить задачу с помощью имеющегося плагина скидок (“Менеджер скидок и наценок”), это работало так: я создавал скидку -100% только для конкретной доставки, и наценку только для этой доставки в размере 199 руб., таким образом получался запутывающий клиента математический столбик в итогах:

  • Подитог: 1000р
  • Стоимость доставки EMS: 255р
  • Скидка от 3х товаров: -255р
  • Итоговая стоимость: 199р
  • Промокод: -100р
  • Итого: 1099р

Не удивительно, что некоторые покупатели думали, что их пытаются обмануть. Как сделать “нормально”?

Рабочее решение

Поскольку плагин скидок и плагин доставки с закрытым кодом, будем искать искать где варится вся каша с итогами в Opencart. Оказалось все просто. В файле /catalog/model/total/shipping.php

Все что нам нужно 1) узнать код доставки для которой хотим сделать скидку.

var_dump($this->session->data['shipping_method']);
Code language: PHP (php)

Так мы узнаем код выбранного способа доставки на который будем навешивать скидку. Вот он:

Скидка от количества для любого способа доставки в Opencart

2) Нужно получить текущее количество товаров в корзине и с помощью условия вывести наш код, который будет подменять стоимость доставки на аукционный 199р, мы даже заменим для удобства название доставки:

if (($this->session->data['shipping_method']['code'] == 'citylink.citylink') && ($this->cart->countProducts() > 2))
   {
	$this->session->data['shipping_method']['cost'] = 199;
	$this->session->data['shipping_method']['title'] = 'Доставка по акции';
	$this->session->data['shipping_method']['text'] = '199 Руб';
   }Code language: PHP (php)

Результат:

Скидка от количества для любого способа доставки в Opencart

Отлично, это нехитрое решение поможет сэкономить кучу нервов и времени мне в будущем и возможно кому-то из вас. Весь файл будет выглядеть так:

<?php
class ModelTotalShipping extends Model {
	public function getTotal(&$total_data, &$total, &$taxes) {
		if ($this->cart->hasShipping() && isset($this->session->data['shipping_method'])) {
		    
		    //var_dump($this->session->data['shipping_method']);
            
            if (($this->session->data['shipping_method']['code'] == 'citylink.citylink') && ($this->cart->countProducts() > 2))
		     {
		         $this->session->data['shipping_method']['cost'] = 199;
		         $this->session->data['shipping_method']['title'] = 'Доставка по акции';
		         $this->session->data['shipping_method']['text'] = '199 Руб';
		     }
		    
			$total_data[] = array(
				'code'       => 'shipping',
				'title'      => $this->session->data['shipping_method']['title'],
				'value'      => $this->session->data['shipping_method']['cost'],
				'sort_order' => $this->config->get('shipping_sort_order')
			);

			if ($this->session->data['shipping_method']['tax_class_id']) {
				$tax_rates = $this->tax->getRates($this->session->data['shipping_method']['cost'], $this->session->data['shipping_method']['tax_class_id']);

				foreach ($tax_rates as $tax_rate) {
					if (!isset($taxes[$tax_rate['tax_rate_id']])) {
						$taxes[$tax_rate['tax_rate_id']] = $tax_rate['amount'];
					} else {
						$taxes[$tax_rate['tax_rate_id']] += $tax_rate['amount'];
					}
				}
			}

			$total += $this->session->data['shipping_method']['cost'];
		}
	}
}
Code language: HTML, XML (xml)
Like this post? Please share to your friends:
Leave a Reply

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: