6

我以前写过很多模块,但由于某种原因,我的运输模块不会覆盖现有的 Magneto 运输方法。这是允许的吗?我在这里想念什么?模块名称显示在配置区域的高级选项卡中,因此它正在加载,但没有任何反应。有什么提示吗?

代码

等/模块/Ssi_Shipping.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Ssi_Shipping>
            <active>true</active>
            <codepool>local</codepool>
        </Ssi_Shipping>
    </modules>
</config>

本地/Ssi/航运/etc.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Ssi_Shipping>
            <version>0.1.0</version>
        </Ssi_Shipping>
    </modules>
    <global>
        <models>
            <shipping>
                <rewrite>
                    <carrier_tablerate>Ssi_Shipping_Model_Carrier_Tablerate</carrier_tablerate>
                </rewrite>

            </shipping>
        </models>
    </global>
</config>

local/Ssi/Shipping/Model/Carrier/Tablerate.php

<?php
class Ssi_Shipping_Model_Carrier_Tablerate 
    extends Mage_Shipping_Model_Carrier_Tablerate {

        public function isActive()
        {
            Mage::log("here! Ssi_Shipping_Model_Carrier_Tablerate");

            // check to see if it's disabled
            if (parent::isActive() == false)
                return false;

            // check in the shopping cart
            foreach( Mage::getSingleton('checkout/session')->getQuote()->getItemsCollection() as $item ){
                if ($item->getDeliveryFlag() == "test")
                    return true;
            }

            // if nothing is found then disable this option.
            return false;

        }


    }
4

5 回答 5

12

有一种方法,但并不明显,需要我浏览运输模块源:

如果您查看Mage_Shipping_Model_Config,您会发现用作 Mage::getModel() 参数的代码取自商店配置。此代码不是像“shipping/carrier_tablerate”这样的标准代码,因此它无助于像往常一样覆盖。

现在你必须首先找出这段代码是什么。例如,我想覆盖矩阵率载体,所以我这样测试它:

$carrierConfig = Mage::getStoreConfig('carriers/matrixrate')
var_dump($carrierConfig['model']);

是的,您可以将此代码临时放在页面上的任何位置,但是为可以从命令行运行的此类内容创建一个单独的文件很有用(从 Mage::app() 开始以初始化 Magento)

在我的情况下,代码是matrixrate_shipping/carrier_matrixrate所以我必须像这样更改我的 config.xml:

<global>
    <models>
        <matrixrate_shipping>
            <rewrite>
                <carrier_matrixrate>my_class_name</carrier_matrixrate>
            </rewrite>
        </matrixrate_shipping>
    </models>

代替

<global>
    <models>
        <matrixrate>
            <rewrite>
                <carrier_matrixrate>my_class_name</carrier_matrixrate>
            </rewrite>
        </matrixrate>
    </models>

祝你好运!

于 2011-05-16T11:30:27.323 回答
1

首先检查模型是否被覆盖。试试这个:

var_dump(get_class(Mage::getModel("shipping/carrier_tablerate")));
于 2010-12-17T23:11:20.707 回答
0

在处理了这个之后,我发现覆盖运输控制器的唯一方法是在本地代码文件夹中复制文件(和目录结构)。然后我基本上可以调整代码。

不知道为什么 Magento 似乎不允许标准覆盖这些运输功能,但至少有一个解决方法。

于 2011-01-10T15:53:45.003 回答
0

已经有一段时间了,但最近几天我遇到了同样的问题。我想覆盖免费送货和统一运费方法,除了 fab 的答案之外,我还必须在 etc/config.xml 中添加以下代码。在我的情况下,原始值位于 app/code/core/Mage/Shipping/etc/config.xml 中。

<?xml version="1.0"?>
<config>
    ...
    <default>
        <carriers>
            <flatrate>
                <model>your_module/shipping_carrier_flatrate</model>
            </flatrate>
            <freeshipping>
                <model>your_module/shipping_carrier_freeshipping</model>
            </freeshipping>
        </carriers>
    </default>
</config>

模型值是示例。您必须用正确的路径替换它们。

于 2013-04-10T13:27:35.033 回答
0

如果其他人面临这个问题并来到这里寻求解决方案,看起来 OP 已经codepool在模块文件中使用了它应该在的位置codePool(注意大写的 P)。

于 2015-06-11T17:49:53.503 回答