Бесплатная доставка с фиксированной стоимостью в OpenCart

web development
4 мин. на чтение

Давно не делился с Вами постами. Сорри, работа :)

Итак, сегодня рассмотрим полезную (и простую, если знаешь как) доработку одной из самых запутанных систем OpenCart, а именно модули Доставки и Оплаты. Среднестатистический разработчик добирается до правок или написания своих модулей оплаты или доставки для OpenCart далеко не в первый год знакомства с этой CMS.

Начнем с того, что будет интересно узнать PHP разработчикам, которые знают ООП и MVC, но только начинают знакомиться с OpenCart. Дело в том, что пользовательская часть модуля доставки или оплаты может совсем не иметь контроллера 😜 И это нормально.

Знакомство и написание своих оплат и доставок я предлагаю начинать с очень полезных заготовок: Клон оплата при доставке (10 шт.)Клон фиксированной доставки (10 шт.).

В целом, если посмотреть на модель такого модуля, то каждая строка не представляет какой-то сложности в понимании, но я покажу уже переделанную модуль модуля доставки, когда цена зависит от суммы в корзине:

<?php
class ModelExtensionShippingFlat1 extends Model {
  function getQuote($address) {
    $this->load->language('extension/shipping/flat1');

    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('flat1_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");

    if (!$this->config->get('flat1_geo_zone_id')) {
      $status = true;
    } elseif ($query->num_rows) {
      $status = true;
    } else {
      $status = false;
    }

    if ($this->cart->getSubTotal() < 3000) {
      $price = $this->config->get('flat1_cost');
    } else {
      $price = 0.00;
    }

    $method_data = array();

    if ($status) {
      $quote_data = array();

      $quote_data['flat1'] = array(
        'code'         => 'flat1.flat1',
        'title'        => $this->language->get('text_description'),
        'cost'         => $price,
        'tax_class_id' => $this->config->get('flat1_tax_class_id'),
        'text'         => $this->currency->format($this->tax->calculate($price, $this->config->get('flat1_tax_class_id'), $this->config->get('config_tax')), $this->session->data['currency'])
      );

      $method_data = array(
        'code'       => 'flat1',
        'title'      => $this->language->get('text_title'),
        'quote'      => $quote_data,
        'sort_order' => $this->config->get('flat1_sort_order'),
        'error'      => false
      );
    }

    return $method_data;
  }
}

Нас интересуют строки с 16 по 20-ю:

if ($this->cart->getSubTotal() < 3000) {
      $price = $this->config->get('flat1_cost');
    } else {
      $price = 0.00;
    }

С помощью метода $this->cart->getSubTotal() мы получаем суммарную стоимость товаров и если она меньше нашего порога, то цена за доставку берется из настроек модуля, в противном случае равна нулю.

Положа руку на сердце, я мог вполне дописать, чтобы модуль хранил и сумму заказа для бесплатной доставки в БД, но было немного лениво. Находчивый читатель может с удовольствием исправить сей недочет.

Ihor Chyshkala
Пишу статьи про ИТ в свободное от работы время.
Оцените автора
Авторский блог Игоря Чишкалы
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  1. Дмитрий

    Спасибо, что делитесь полезной информацией. А можете пожалуйста помочь понять, как правильно сделать, чтобы на главной в ОС выводить количество + и – кнопками?

    Ответить