В качестве примера использую стандартную доставку с фиксированной стоимостью. В принципе, чтобы поправить любой другой модуль доставки, надо сделать примерно тоже самое. Но главное - суть!
Работаем с файлом модели \catalog\model\shipping\flat.php (flat.php - этой модель для доставки с фиксированной стоимостью).
В opencart все квоты модулей доставки помещаются в массив $quote_data[]. Для данного модуля смотрим, чем наполняется массив:
$quote_data['flat'] = array(
'code' => 'flat.flat',
'title' => $this->language->get('text_description'),
'cost' => $this->config->get('flat_cost'),
'tax_class_id' => $this->config->get('flat_tax_class_id'),
'text' => $this->currency->format($this->tax->calculate($this->config->get('flat_cost'), $this->config->get('flat_tax_class_id'), $this->config->get('config_tax')))
);
code - Код метода доставки. Этот элемент нас не интересует. В итоге это ID метода в HTML коде.
title - Заголовок, который отображается на странице пользователю. Видно, что он берется из текстового файла в директориях language.
cost - Переменная, которая содержит стоимость, которая отдается в итоговый чек. Видно, что она берется из БД, где предустанавливается из админки.
tax_class_id - Идентификатор налоговой зоны, тоже нас не интересует.
text - в данном случае вывод стоимости и наименования валюты (например 100р, 200$, в зависимости он настроек вывода).
Итак, нас интересует внесение изменений в финальный прайс. Формализованная задача: Надо учитывать стоимость корзины, и вычислять от нее 2%. Эти 2% прибавить к фиксированной предустановленной стоимости доставки.
Решение: изменить алгоритм расчета элемента cost и вывода элемента text массива $quote_data[].
Метод:
Добавляем к cost и text 2-х процентную составляющую от стоимости корзины, которую достает стандартным методом opencart:
'cost' => $this->config->get('flat_cost') + 0.02*$this->cart->getTotal(),
'text' => $this->currency->format($this->tax->calculate($this->config->get('flat_cost') + 0.02*$this->cart->getTotal(), $this->config->get('flat_tax_class_id'), $this->config->get('config_tax')))
Метод getTotal() класса cart возвращает конечную стоимость корзины.
Надеюсь, я тебе помог :-)