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 для получения ставок. Если вы знакомы со старыми модулями, вам не составит труда их обновить.