Дополнение для доставки
Способ доставки — то, что покупатель выбирает при оформлении заказа: курьер, самовывоз, почта. Каждый способ — дополнение вида 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'. Способ виден в списке, но после выбора оформление сообщает, что способ доставки неверный: ядро делит код по точке, чтобы найти способ и вариант.