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

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() мы получаем суммарную стоимость товаров и если она меньше нашего порога, то цена за доставку берется из настроек модуля, в противном случае равна нулю.

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

Igor Chishkala

Пишу статьи про ИТ в свободное от работы время.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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