В этой серии мы обсуждаем реализацию модуля пользовательских методов доставки в OpenCart. В первой части мы включили и настроили наш пользовательский метод доставки, используя форму конфигурации в серверной части. Сегодня мы реализуем файлы, которые требуются OpenCart, чтобы он мог определять собственный метод доставки и перечислять его вместе с другими включенными методами доставки во время оформления заказа.
Я надеюсь, что вы создали все файлы из первой части этой серии. Если вы еще не прошли первую часть, я бы посоветовал вам пройти через это, прежде чем продолжить. Кроме того, я предполагаю, что вы используете последнюю версию OpenCart.
Взгляд на настройку файлов в Front-End
Давайте начнем со списка файлов, необходимых в front-end.
-
catalog/language/english/shipping/custom.php: Это языковой файл, в котором мы определим метки. -
catalog/model/shipping/custom.php: это файл модели, который важен, так как большая часть логики расчета доставки идет сюда.
Вот и все, что касается настройки интерфейса.
Настройка файла
Начнем с настройки языкового файла.
Создать языковой файл
Создайте файл 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 и вставьте следующее содержимое в этот файл.
|
01
02
03
04
05
06
07
08
09
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;
}
|
Далее, если метод доставки применим, мы подготавливаем необходимые переменные массива согласно соглашениям.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
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
);
}
|
Как видите, мы используем метод $this->config->get для загрузки значений переменных конфигурации, таких как «custom_cost», «custom_tax_class_id» и «custom_sort_order». Вспомните первую часть, в которой мы настраивали эти значения с помощью пользовательской формы конфигурации!
Кроме того, важный фрагмент, на который следует обратить внимание, — это значение text ключа в массиве $quote_data . Он рассчитывает и форматирует общую сумму, которая будет взиматься за наш пользовательский метод доставки. В частности, он проверяет, должен ли быть добавлен какой-либо дополнительный налог к «стоимости» способа доставки. Вспомните настройку класса налога , которую мы указали в форме конфигурации, в которой мы выбрали облагаемые налогом товары . Таким образом, это добавит дополнительный налог к общей сумме способа доставки!
Мы постарались сделать нашу часть модели простой, но вы можете выполнить все вычисления в этом файле согласно API методов доставки, если таковые имеются. Вот и все, что касается модельной части.
Демо в Front-End
В интерфейсе добавьте несколько товаров в корзину и начните процесс оформления заказа. На шаге 4: Способ доставки вы должны увидеть наш собственный способ доставки, указанный на следующем снимке экрана.

Он указан с заголовком «Нестандартная стоимость доставки — $ 14,00» . Вы можете быть удивлены тем, что, хотя мы настроили параметр Cost на 10 , он показывает 14 в списке. Как я упоминал ранее, мы настраивали Налогооблагаемые товары в поле Налоговый класс в форме конфигурации в бэкэнде.
Перейдите к Локализации> Налоги> Налоговые классы и отредактируйте налогооблагаемые товары . Вы увидите, что для этого налогового класса настроены 20% НДС и фиксированный 2 $ экологический налог. Таким образом, это добавляет еще $ 4 к стоимости способа доставки! Конечно, если вы установите Налоговый класс на Нет, налог не будет применяться вообще!
Итак, на сегодня все. Теперь мы успешно создали полноценный модуль пользовательских методов доставки в OpenCart!
Вывод
Я надеюсь, что вам понравилась эта серия из двух частей, и вы узнали что-то полезное. Если вы ищете больше приложений OpenCart, не забудьте проверить, что у нас есть для продажи на рынке . Не забудьте поделиться своими отзывами и запросами с помощью канала!