1. Создание файла
Сначала вам нужно создать файл для нового модуля и поместить его в следующий каталог.
/lib/common/modules/orderTotal/
Например, давайте назовем этот новый общий модуль ot_custom_fee.php.
Скелет файла должен выглядеть следующим образом:
<?php
/**
* namespace
*/
namespace common\modules\orderTotal;
/**
* used classes
*/
use common\classes\modules\ModuleTotal;
use common\classes\modules\ModuleStatus;
use common\classes\modules\ModuleSortOrder;
use common\helpers\Tax;
/**
* class declaration
*/
class ot_custom_fee extends ModuleTotal {
/**
* variables
*/
public $title;
public $output;
/**
* default values for translation
*/ protected $defaultTranslationArray = [
'MODULE_ORDER_TOTAL_CUSTOM_FEE_TITLE' => 'Custom fee',
'MODULE_ORDER_TOTAL_CUSTOM_FEE_DESCRIPTION' => 'Custom module description'
];
/**
* class constructor
*/
function __construct() {
parent::__construct();
$this->code = 'ot_custom_fee';
$this->title = MODULE_ORDER_TOTAL_CUSTOM_FEE_TITLE;
$this->description = MODULE_ORDER_TOTAL_CUSTOM_FEE_DESCRIPTION;
if (!defined('MODULE_ORDER_TOTAL_CUSTOM_FEE_STATUS')) {
$this->enabled = false;
return false;
}
$this->enabled = ((MODULE_ORDER_TOTAL_CUSTOM_FEE_STATUS == 'true') ? true : false);
$this->sort_order = MODULE_ORDER_TOTAL_CUSTOM_FEE_SORT_ORDER;
$this->output = [];
}
/**
* your custom process
*/
function process($replacing_value = -1, $visible = false) {
$currencies = \Yii::$container->get('currencies');
$order = $this->manager->getOrderInstance();
if (defined('MODULE_ORDER_TOTAL_CUSTOM_FEE_FEE') && MODULE_ORDER_TOTAL_CUSTOM_FEE_FEE > 0) {
$taxation = $this->getTaxValues(MODULE_ORDER_TOTAL_CUSTOM_FEE_TAX_CLASS, $order);
$tax_class_id = $taxation['tax_class_id'];
$tax = $taxation['tax'];
$tax_description = $taxation['tax_description'];
$gift_wrap_amount += $order->info['total'] * MODULE_ORDER_TOTAL_CUSTOM_FEE_FEE / 100;
$gift_wrap_tax_amount += Tax::roundTax(Tax::calculate_tax($gift_wrap_amount, $tax));
$gift_wrap_amount_inc += Tax::add_tax($gift_wrap_amount, $tax);
$order->info['tax'] += $gift_wrap_tax_amount;
$order->info['tax_groups']["$tax_description"] += $gift_wrap_tax_amount;
$order->info['total'] += ($gift_wrap_amount + $gift_wrap_tax_amount);
$order->info['total_inc_tax'] += ($gift_wrap_amount + $gift_wrap_tax_amount);
$order->info['total_exc_tax'] += $gift_wrap_amount;
parent::$adjusting += $currencies->format_clear($gift_wrap_amount, true, $order->info['currency'], $order->info['currency_value']);
}
$this->output[] = array(
'title' => $this->title . ':',
'text' => $currencies->format($gift_wrap_amount_inc, true, $order->info['currency'], $order->info['currency_value']),
'value' => $gift_wrap_amount_inc,
'text_exc_tax' => $currencies->format($gift_wrap_amount, true, $order->info['currency'], $order->info['currency_value']),
'text_inc_tax' => $currencies->format(($gift_wrap_amount + $gift_wrap_tax_amount), true, $order->info['currency'], $order->info['currency_value']),
'tax_class_id' => $tax_class_id,
'value_exc_vat' => $gift_wrap_amount,
'value_inc_tax' => ($gift_wrap_amount + $gift_wrap_tax_amount),
'prefix' => '+',
);
}
/**
* configuration fields
*/
public function configure_keys() {
return [
'MODULE_ORDER_TOTAL_CUSTOM_FEE_STATUS' => [
'title' => 'Display Custom fee',
'value' => 'true',
'description' => 'Do you want to display the Custom fee?',
'sort_order' => '1',
'set_function' => 'tep_cfg_select_option(array(\'true\', \'false\'), ',
],
'MODULE_ORDER_TOTAL_CUSTOM_FEE_FEE' => [
'title' => 'Fee',
'value' => '0',
'description' => 'Additional fee in percentage',
'sort_order' => '2',
],
'MODULE_ORDER_TOTAL_CUSTOM_FEE_TAX_CLASS' => [
'title' => 'Tax Class',
'value' => '0',
'description' => 'Use the following tax class on the payment fee.',
'sort_order' => '3',
'use_function' => '\\common\\helpers\\Tax::get_tax_class_title',
'set_function' => 'tep_cfg_pull_down_tax_classes(',
],
'MODULE_ORDER_TOTAL_CUSTOM_FEE_SORT_ORDER' => [
'title' => 'Sort Order',
'value' => '4',
'description' => 'Sort order of display.',
'sort_order' => '4',
],
];
}
public function describe_status_key() {
return new ModuleStatus('MODULE_ORDER_TOTAL_CUSTOM_FEE_STATUS', 'true', 'false');
}
public function describe_sort_key() {
return new ModuleSortOrder('MODULE_ORDER_TOTAL_CUSTOM_FEE_SORT_ORDER');
}
}Примечание: обратите внимание на обязательные элементы:
пространство имен , указывающее размещение класса
использовать классы модулей, используемые для создания установки
объявление класса с обязательным наследованием от ModuleTotal
variables необходимые для вашего модуля
keys для транзакции
конструктор выполняет инициализацию
функция процесса для вычислений
поддержка tax_class
минимальный набор полей конфигурации
функция description_status_key отвечающая за условие
функция description_sort_key отвечающая за порядок сортировки
Не рекомендуется закрывать php tag во избежание отображения непечатаемых символов на страницах.
2. Установка модуля
После того, как вы вошли в админ-панель своего веб-сайта, нажмите «Модули», «Структура заказа» и необходимые вкладки внешнего интерфейса . Включите переключатели « Показать неактивные» и «Показать не установленные», найдите свой модуль и нажмите кнопку «Установить » .

Проверьте клавиши и включен ли модуль . Если в вашей версии есть раздел Доступно для , заполните его и сохраните изменения.

3. Тестирование
Если у вас несколько каналов продаж, обязательно примените настройки к нужному. Убедитесь, что статус установленного вами модуля включен.

Если вы следовали всем рекомендациям, информация на фронтенде будет следующей.
Как видно на предыдущем скриншоте, дополнительная комиссия в процентах и налог на нее не применялись к общей сумме. Чтобы исправить это, добавьте дополнительную комиссию в процентах и измените налоговый класс на нужное значение в настройках модуля.

После этого применяются соответствующие значения на переднем конце и увеличиваются на 20%.

4. Вывод
Этот пример самый простой. В большинстве случаев предоставленные решения должны соответствовать вашим требованиям. Однако этот пример дает представление о том, как подготовиться к использованию более сложных структур, использующих API для получения ставок. Если вы знакомы со старыми модулями, вам не составит труда их обновить.
