Opencart - Создание Пользовательского Метода Доставки - 2 Часть

Тема в разделе "Модули и дополнения", создана пользователем admin, 27 апр 2018.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

    Сообщения:
    2.733
    Симпатии:
    130.100
    Репутация:
    215
    В этой серии мы обсуждаем, как реализовать в 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 и вставьте в этот файл следующее содержимое.

    Код:
    <?php
    // Text
    $_['text_title'] = 'Custom Rate';
    $_['text_description'] = 'Custom Shipping Rate';
    Я не думаю, что это требует каких-либо объяснений, так что давайте двигаться дальше!

    Создание файл модели
    Создайте файл catalog/model/shipping/custom.php и вставьте в него следующее содержимое

    Код:
    <?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 методе, который является адресом доставки клиента во время проверки, и позволяет нам решить, применим ли текущий метод доставки для географической зоны, принадлежащей этому адресу. Это определяется следующим кодом.

    Код:
    $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, вы должны увидеть наш пользовательский способ доставки, указанный в следующем скриншоте.

    1.png

    Он указан в заголовке «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!

    Заключение
    Я надеюсь, что вам понравилась эта серия из двух частей, и вы узнали что-то полезное. И не забудьте поделиться своими отзывами.
     
    alwaysumit и Vuqar нравится это.