Дополнение для итогов заказа
Сумма заказа складывается из строк: стоимость товаров, доставка, купон, налог, итог. Каждая строка — отдельное дополнение вида total. Чтобы добавить свой сбор или скидку, пишут ещё одно такое дополнение — здесь это сбор за маленький заказ.
Файлы
Итог состоит из страницы настроек в панели и модели на витрине:
extension/acme_hello/
├── admin/
│ ├── controller/total/small_order.php
│ ├── language/en-gb/total/small_order.php
│ └── view/template/total/small_order.twig
└── catalog/
├── model/total/small_order.php
└── language/ru-ru/total/small_order.phpЧасть для панели пишется точно так же, как страница настроек модуля, только пространство имён заканчивается на Total, маршрут — extension/acme_hello/total/small_order, а код настроек — total_small_order. Нужны два поля: total_small_order_status и total_small_order_sort_order.
Модель
// extension/acme_hello/catalog/model/total/small_order.php
namespace Opencart\Catalog\Model\Extension\AcmeHello\Total;
class SmallOrder extends \Opencart\System\Engine\Model
{
public function getTotal(array &$totals, array &$taxes, float &$total): void
{
if ($this->cart->getSubTotal() >= 20) {
return;
}
$this->load->language('extension/acme_hello/total/small_order');
$fee = 3.0;
$totals[] = [
'extension' => 'acme_hello',
'code' => 'small_order',
'title' => $this->language->get('text_small_order'),
'value' => $fee,
'sort_order' => (int) $this->config->get('total_small_order_sort_order'),
];
$total += $fee;
}
}Ядро по очереди вызывает getTotal() каждого включённого итога. Метод получает по ссылке три значения: список строк, налоги и накопленную сумму. Он добавляет свою строку и увеличивает сумму.
// extension/acme_hello/catalog/language/ru-ru/total/small_order.php
$_['text_small_order'] = 'Сбор за маленький заказ';Включение
- Откройте
Extensions → Extensionsи выберите видOrder Totals. - Установите «Small order fee», откройте его настройки, включите статус и задайте порядок сортировки.
Положите в корзину товар дешевле $20 и откройте index.php?route=checkout/cart — под стоимостью товаров стоит строка «Сбор за маленький заказ $3.00», а итог больше на эту сумму.
Если нового пункта в списке нет, пересоберите архив и установите пакет заново в Extensions → Installer: список файлов пакета записывается при установке.
Порядок сортировки
Строки считаются в порядке настройки sort_order, поэтому её значение важно:
| Строка | Обычный порядок |
|---|---|
| Sub-Total | 1 |
| Shipping | 3 |
| Taxes | 5 |
| Total | 9 |
Сбор с порядком 2 считается после товаров и до налога. Настоящие значения в своём магазине смотрите в настройках каждого итога.
Скидка
Скидка — та же строка с отрицательным значением: 'value' => -5.0 и $total -= 5.0.
Частая ошибка
Строку добавляют в $totals, а $total не меняют. В корзине сбор виден, а итоговая сумма прежняя — покупатель платит меньше, чем дают строки в сумме. Каждая строка, добавленная в список, должна изменить и накопленную сумму на то же значение.