Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Дополнение для доставки

Способ доставки — то, что покупатель выбирает при оформлении заказа: курьер, самовывоз, почта. Каждый способ — дополнение вида shipping. Главная его часть — модель витрины, которая смотрит на адрес и корзину и возвращает доступные варианты с ценами.

Файлы

extension/acme_hello/
├── admin/
│   ├── controller/shipping/courier.php
│   ├── language/en-gb/shipping/courier.php
│   └── view/template/shipping/courier.twig
└── catalog/
    ├── model/shipping/courier.php
    └── language/ru-ru/shipping/courier.php

Часть для панели — страница настроек, как у модуля: пространство имён заканчивается на Shipping, маршрут — extension/acme_hello/shipping/courier, код настроек — shipping_courier. Поля: shipping_courier_cost, shipping_courier_status, shipping_courier_sort_order.

Модель

// extension/acme_hello/catalog/model/shipping/courier.php
namespace Opencart\Catalog\Model\Extension\AcmeHello\Shipping;
 
class Courier extends \Opencart\System\Engine\Model
{
    public function getQuote(array $address): array
    {
        $this->load->language('extension/acme_hello/shipping/courier');
 
        $cost = (float) $this->config->get('shipping_courier_cost');
 
        $quote['courier'] = [
            'code' => 'courier.courier',
            'name' => $this->language->get('text_description'),
            'cost' => $cost,
            'tax_class_id' => 0,
            'text' => $this->currency->format($cost, $this->session->data['currency']),
        ];
 
        return [
            'code' => 'courier',
            'name' => $this->language->get('heading_title'),
            'quote' => $quote,
            'sort_order' => (int) $this->config->get('shipping_courier_sort_order'),
            'error' => false,
        ];
    }
}
// extension/acme_hello/catalog/language/ru-ru/shipping/courier.php
$_['heading_title'] = 'Курьер';
$_['text_description'] = 'Доставка курьером до двери';

Метод возвращает один способ доставки с одним вариантом. Код варианта — код способа, точка и ключ варианта.

Ключ вариантаСмысл
codeЧто сохранится в заказе: courier.courier
nameТекст, который видит покупатель
costЦена числом, в основной валюте
tax_class_idНалоговый класс доставки, 0 — без налога
textЦена текстом в валюте покупателя

В выпусках 4.0.0 и 4.0.1 текст передавали под ключом title, а не name. Сверьтесь со встроенным способом extension/opencart/catalog/model/shipping/flat.php своей копии.

Включение

В Extensions → Extensions, вид Shipping, установите «Courier», откройте настройки, введите стоимость 5 и включите статус.

Положите товар в корзину и перейдите к оформлению: index.php?route=checkout/checkout. После ввода адреса в списке способов доставки есть «Доставка курьером до двери — $5.00».

Цена в зависимости от корзины

У модели есть доступ к корзине, поэтому цену можно вычислить:

$cost = 5.0 + max(0, $this->cart->getWeight() - 2) * 1.5;

Первые два килограмма стоят $5, каждый следующий добавляет $1.50.

Когда способ недоступен

Если доставка по адресу невозможна, метод возвращает пустой массив — способ не появится в списке:

if ($address['country_id'] != $this->config->get('config_country_id')) {
    return [];
}

Встроенные способы ограничивают область географической зоной — набором стран и регионов из System → Localisation → Geo Zones.

Частая ошибка

Код варианта не соответствует образцу: 'code' => 'courier' вместо 'courier.courier'. Способ виден в списке, но после выбора оформление сообщает, что способ доставки неверный: ядро делит код по точке, чтобы найти способ и вариант.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.