Статьи

Создание пользовательского метода доставки в OpenCart: часть вторая

В этой серии мы обсуждаем реализацию модуля пользовательских методов доставки в OpenCart. В первой части мы включили и настроили наш пользовательский метод доставки, используя форму конфигурации в серверной части. Сегодня мы реализуем файлы, которые требуются OpenCart, чтобы он мог определять собственный метод доставки и перечислять его вместе с другими включенными методами доставки во время оформления заказа.

Я надеюсь, что вы создали все файлы из первой части этой серии. Если вы еще не прошли первую часть, я бы посоветовал вам пройти через это, прежде чем продолжить. Кроме того, я предполагаю, что вы используете последнюю версию OpenCart.

Давайте начнем со списка файлов, необходимых в 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 методов доставки, если таковые имеются. Вот и все, что касается модельной части.

В интерфейсе добавьте несколько товаров в корзину и начните процесс оформления заказа. На шаге 4: Способ доставки вы должны увидеть наш собственный способ доставки, указанный на следующем снимке экрана.

Способ доставки Демо

Он указан с заголовком «Нестандартная стоимость доставки — $ 14,00» . Вы можете быть удивлены тем, что, хотя мы настроили параметр Cost на 10 , он показывает 14 в списке. Как я упоминал ранее, мы настраивали Налогооблагаемые товары в поле Налоговый класс в форме конфигурации в бэкэнде.

Перейдите к Локализации> Налоги> Налоговые классы и отредактируйте налогооблагаемые товары . Вы увидите, что для этого налогового класса настроены 20% НДС и фиксированный 2 $ экологический налог. Таким образом, это добавляет еще $ 4 к стоимости способа доставки! Конечно, если вы установите Налоговый класс на Нет, налог не будет применяться вообще!

Итак, на сегодня все. Теперь мы успешно создали полноценный модуль пользовательских методов доставки в OpenCart!

Я надеюсь, что вам понравилась эта серия из двух частей, и вы узнали что-то полезное. Если вы ищете больше приложений OpenCart, не забудьте проверить, что у нас есть для продажи на рынке . Не забудьте поделиться своими отзывами и запросами с помощью канала!