微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确认订单后即可清除Prestashop的运输费用

如何解决确认订单后即可清除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'),'id_range_price' => NULL,'id_range_weight' => (int) $rangeWeight->id,'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;
    }
}

解决方法

我认为这与您的$curPage

有关

我会改用这个if

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

我不理解这部分代码:

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

为什么在已经下订单的真实订单确认页面上做些不同的事情?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。