Давно не делился с Вами постами. Сорри, работа :)
Итак, сегодня рассмотрим полезную (и простую, если знаешь как) доработку одной из самых запутанных систем 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()
мы получаем суммарную стоимость товаров и если она меньше нашего порога, то цена за доставку берется из настроек модуля, в противном случае равна нулю.
Положа руку на сердце, я мог вполне дописать, чтобы модуль хранил и сумму заказа для бесплатной доставки в БД, но было немного лениво. Находчивый читатель может с удовольствием исправить сей недочет.
Спасибо, что делитесь полезной информацией. А можете пожалуйста помочь понять, как правильно сделать, чтобы на главной в ОС выводить количество + и — кнопками?