Стоимость доставки в Prestashop снимается после подтверждения заказа

#prestashop-1.7 #shipping-method #prestashop-modules

#prestashop-1.7 #способ доставки #prestashop-модули

Вопрос:

Я в Prestashop 1.7.6. Я создал простой тестовый модуль для добавления пользовательского перевозчика и управления им программно.

Во время оформления заказа все работает хорошо: я вижу нового перевозчика с правильной стоимостью, если я выберу его, общая сумма в корзине будет правильной! (стоимость доставки добавляется).

После выбора способа оплаты и подтверждения заказа (и я перенаправлен на страницу подтверждения заказа) стоимость доставки исчезает: всегда бесплатная доставка!

Я не понимаю, почему..

Я сообщаю код этого теста:

 <?php
if (!defined('_PS_VERSION_')) {
    exit;
}

class TxShipping extends CarrierModule
{
    const PREFIX = 'tx_';
    public $id_carrier;

    private $loopCount = 0;
    private $shipCost = 0;

    protected $_hooks = array(
        'actionCarrierUpdate',
        'displayOrderConfirmation',
    );

    protected $_carriers = array(
        //"Public carrier name" => "technical name",
        'My new carrier' => 'txshipping',
    );

    public function __construct()
    {
        $this->name = 'txshipping';
        $this->tab = 'shipping_logistics';
        $this->version = '1.0.0';
        $this->author = 'Gerry';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = [
            'min' => '1.7.1.0',
            'max' => _PS_VERSION_
        ];
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('Tx Shipping');
        $this->description = $this->l('manage shipping costs');

        $this->confirmUninstall = $this->l('Are you sure you want to uninstall?');

        if (!Configuration::get('TXSHIPPING_NAME')) {
            $this->warning = $this->l('No name provided');
        }
    }

    public function getTemplate($area, $file)
    {
        return 'views/templates/' . $area . '/' . $file;
    }

    //-------------------------------------------------
    // Hooks
    //-------------------------------------------------
    public function hookActionCarrierUpdate($params)
    {
        if ($params['carrier']->id_reference == Configuration::get(self::PREFIX . 'fcd_reference')) {
            Configuration::updateValue(self::PREFIX . 'fcd', $params['carrier']->id);
        }
    }

    public function getOrderShippingCost($params = null, $shipping_cost = 0) {
        $curPage = $this->context->controller->php_self;

        /* using test on which page is running cause the following code is always executed (even if is loading home page!?)
           I don't understand why */
        if ($curPage == "order") {
            $this->loopCount  ; // attempt for not to run the same code over and over.. but it doesn't work very well

            if ($this->loopCount == 1) {
                $this->shipCost = 77;
                /*                
                $address = new Address($params->id_address_delivery);
                $cap = $address->postcode;
                $curID = $this->id_carrier; */
            }
            return floatval($this->shipCost);

        } elseif ($curPage == "order-confirmation") {
            $test = 76; // for simple test
            return floatval($test);

        } else {
            if ($curPage != "pagenotfound") {
                $this->loopCount = 0;
                $this->shipCost = 0;
            }
        }
    }

    public function getOrderShippingCostExternal($params){
        //return 999; costi spedizione
        return $this->getOrderShippingCost($params, 0);
    }

    //-------------------------------------------------
    // Setup
    //-------------------------------------------------
    public function install()
    {
        if (parent::install()) {
            foreach ($this->_hooks as $hook) {
                if (!$this->registerHook($hook)) {
                    return false;
                }
            }

            if (!$this->createCarriers()) {
                return false;
            }

            return true;
        }
        return false;
    }

    public function uninstall()
    {
        if (parent::uninstall()) {
            foreach ($this->_hooks as $hook) {
                if (!$this->unregisterHook($hook)) {
                    return false;
                }
            }

            if (!$this->deleteCarriers()) {
                return false;
            }

            return true;
        }
        return false;
    }

    //-------------------------------------------------
    // Funzioni private
    //-------------------------------------------------
    protected function createCarriers()
    {
        foreach ($this->_carriers as $key => $value) {
            //Create own carrier
            $carrier = new Carrier();
            $carrier->name = $key;
            $carrier->id_tax_rules_group = 0;
            $carrier->active = 1;
            $carrier->deleted = 0;
            foreach (Language::getLanguages(true) as $language)
                $carrier->delay[(int)$language['id_lang']] = 'Delay [1-2 days]';
            $carrier->shipping_handling = false;
            $carrier->range_behavior = 0;
            $carrier->is_module = true;
            $carrier->shipping_external = true;
            $carrier->external_module_name = $this->name;
            $carrier->need_range = true;

            if ($carrier->add()) {
                $groups = Group::getGroups(true);
                foreach ($groups as $group) {
                    Db::getInstance()->autoExecute(_DB_PREFIX_ . 'carrier_group', array(
                        'id_carrier' => (int) $carrier->id,
                        'id_group' => (int) $group['id_group']
                    ), 'INSERT');
                }

                $rangePrice = new RangePrice();
                $rangePrice->id_carrier = $carrier->id;
                $rangePrice->delimiter1 = '0';
                $rangePrice->delimiter2 = '1000000';
                $rangePrice->add();

                $rangeWeight = new RangeWeight();
                $rangeWeight->id_carrier = $carrier->id;
                $rangeWeight->delimiter1 = '0';
                $rangeWeight->delimiter2 = '1000000';
                $rangeWeight->add();

                $zones = Zone::getZones(true);
                foreach ($zones as $z) {
                    Db::getInstance()->autoExecute(_DB_PREFIX_ . 'carrier_zone',
                        array('id_carrier' => (int) $carrier->id, 'id_zone' => (int) $z['id_zone']), 'INSERT');
                    Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_ . 'delivery',
                        array('id_carrier' => $carrier->id, 'id_range_price' => (int) $rangePrice->id, 'id_range_weight' => NULL, 'id_zone' => (int) $z['id_zone'], 'price' => '0'), 'INSERT');
                    Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_ . 'delivery',
                        array('id_carrier' => $carrier->id, 'id_range_price' => NULL, 'id_range_weight' => (int) $rangeWeight->id, 'id_zone' => (int) $z['id_zone'], 'price' => '0'), 'INSERT');
                }

                copy(dirname(__FILE__) . '/views/img/carrier.jpg', _PS_SHIP_IMG_DIR_ . '/' . (int) $carrier->id . '.jpg');
                Configuration::updateValue(self::PREFIX . $value, $carrier->id);
                Configuration::updateValue(self::PREFIX . $value . '_reference', $carrier->id);
            }
        }

        return true;
    }

    protected function deleteCarriers()
    {
        foreach ($this->_carriers as $value) {
            $tmp_carrier_id = Configuration::get(self::PREFIX . $value);
            $carrier = new Carrier($tmp_carrier_id);
            $carrier->delete();
        }
        return true;
    }
}
  

Ответ №1:

Я считаю, что это как-то связано с вашим $curPage

Вместо этого я бы выбрал это if :

if ($this->context->controller instanceof CartController || $this->context->controller instanceof OrderController) {

Я не понимаю эту часть кода:

 } elseif ($curPage == "order-confirmation") {
  

почему вы должны делать что-то другое на странице подтверждения реального заказа, где заказ уже размещен?

Комментарии:

1. ДА.. спасибо за советы.. проблема вызвана моей попыткой ограничить количество выполнений кода в «getOrderShippingCost»: со страницы «заказ» на «подтверждение заказа» prestashop несколько раз вызывает «getOrderShippingCost», в котором $ curPage равно нулю, и мой код не вернул значение функции: я разобрался со случаем, и теперь, похоже, это работает!

2. как вам удалось это исправить?