От автора: в этой серии мы обсуждаем, как реализовать в OpenCart методы доставки с пользовательскими настройками. В первой части мы включили и настроили наш пользовательский метод доставки, используя форму конфигурации в back-end. Сегодня мы реализуем файлы, которые требуются OpenCart, чтобы он мог обнаружить пользовательский способ доставки и перечислить его вместе с другими включенными способами доставки во время проверки.
Я надеюсь, что вы создали все файлы из первой части этой серии. А если вы еще не прошли первую часть, то я бы посоветовал сделать это, прежде чем продолжить. Кроме того, я предполагаю, что вы используете последнюю версию OpenCart.
Взгляд на настройку файла во front-end
Начнем со списка необходимых файлов:
catalog/language/english/shipping/custom.php: Это языковой файл, в котором мы будем определять метки.
catalog/model/shipping/custom.php: Это файл модели, который важен, поскольку большая часть логики расчета доставки идет здесь.
Это то, что касается настройки front-end.
Настройка файла
Начнем с настройки языкового файла.
Создание языкового файла
Создайте файл catalog/language/english/shipping/custom.php и вставьте в этот файл следующее содержимое.
1 2 3 4 |
<?php // Text $_['text_title'] = 'Custom Rate'; $_['text_description'] = 'Custom Shipping Rate'; |
Я не думаю, что это требует каких-либо объяснений, так что давайте двигаться дальше!
Создание файл модели
Создайте файл catalog/model/shipping/custom.php и вставьте в него следующее содержимое
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php class ModelShippingCustom extends Model { function getQuote($address) { $this->load->language('shipping/custom'); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('custom_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('custom_geo_zone_id')) { $status = true; } elseif ($query->num_rows) { $status = true; } else { $status = false; } $method_data = array(); if ($status) { $quote_data = array(); $quote_data['custom'] = array( 'code' => 'custom.custom', 'title' => $this->language->get('text_description'), 'cost' => $this->config->get('custom_cost'), 'tax_class_id' => $this->config->get('custom_tax_class_id'), 'text' => $this->currency->format($this->tax->calculate($this->config->get('custom_cost'), $this->config->get('custom_tax_class_id'), $this->config->get('config_tax'))) ); $method_data = array( 'code' => 'custom', 'title' => $this->language->get('text_title'), 'quote' => $quote_data, 'sort_order' => $this->config->get('custom_sort_order'), 'error' => false ); } return $method_data; } } |
В соответствии с требованиями OpenCart имя класса должно быть, ModelShippingCustom. Также есть getQuote метод, который является обязательным для нашего метода доставки, и который будет выбран OpenCart.
Стоит заметить, что $address аргумент передается в getQuote методе, который является адресом доставки клиента во время проверки, и позволяет нам решить, применим ли текущий метод доставки для географической зоны, принадлежащей этому адресу. Это определяется следующим кодом.
1 2 3 4 5 6 7 8 9 |
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('custom_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('custom_geo_zone_id')) { $status = true; } elseif ($query->num_rows) { $status = true; } else { $status = false; } |
Как можно увидеть, мы используем $this->config->get метод для загрузки значений для переменных конфигурации типа «custom_cost», «custom_tax_class_id» и «custom_sort_order». Вспомните первую часть, в которой мы настроили эти значения, используя настраиваемую форму конфигурации!
Кроме того, важным фрагментом для уведомления является значение text ключа в $quote_data массиве. Он вычисляет и форматирует общую сумму, которая будет взиматься за наш метод доставки. В частности, он проверяет, следует ли добавить дополнительный налог на «стоимость» метода доставки. Вспомните настройки налогового класса, которые мы предоставили в нашей форме конфигурации, в которой мы выбрали Taxable Goods. Таким образом, он добавит дополнительный налог на общую сумму доставки!
Мы попытались упростить нашу модельную часть, но вы можете делать все вычисления в этом файле в соответствии с вашими API-интерфейсами API доставки, если таковые имеются. Это то, что касается части модели.
Демонстрация во front-end
Во front-end добавьте несколько продуктов в корзину и начните процесс оформления заказа. В шаге 4: Delivery Method, вы должны увидеть наш пользовательский способ доставки, указанный в следующем скриншоте.
Он указан в заголовке «Custom Shipping Rate — $14.00». Вы можете быть удивлены тем, что, хотя мы установили параметр Cost на 10,в списке он отображает 14. Как я упоминал ранее, мы сконфигурировали Taxable Goods в поле Tax Class в форме конфигурации в back-end. Перейдите в Localization > Taxes > Tax Classes. Вы увидите, что для этого налогового класса настроен 20% НДС и 2 $ Eco Tax . Таким образом, он добавляет еще 4 доллара к стоимости! Конечно, если вы установите для Tax Class значение None, налог не будет применяться вообще!
Это была тема на сегодня. Теперь мы успешно создали полноценный пользовательский метод доставки в OpenCart!
Заключение
Я надеюсь, что вам понравилась эта серия из двух частей, и вы узнали что-то полезное. И не забудьте поделиться своими отзывами.
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.