问题
I've written many many modules before but for some reason my shipping module won't override an exsiting Magneto shipping method. Is that allowed? What am I missing here? The module name shows up in the advanced tab of the configuration area, so it's getting loaded, but nothing is happening. Any hints?
Code
etc/modules/Ssi_Shipping.xml
<?xml version="1.0"?>
<config>
<modules>
<Ssi_Shipping>
<active>true</active>
<codepool>local</codepool>
</Ssi_Shipping>
</modules>
</config>
local/Ssi/Shipping/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;
}
}
回答1:
There is a way but it is not obvious and required me to browse the shipping module source:
If you look at Mage_Shipping_Model_Config, you will discover that the code used as parameter for Mage::getModel() is taken from the store configuration. This code is NOT the standard code like 'shipping/carrier_tablerate', so it does not help overriding as usual.
Now you have to find out first what this code is. For example I wanted to override the matrixrate carrier, so I tested it like that:
$carrierConfig = Mage::getStoreConfig('carriers/matrixrate')
var_dump($carrierConfig['model']);
Yes, you can put this code anywhere on the page temporary but it is useful to have a separate file for such things that can be run from the command line (starting with Mage::app() to initialize Magento)
In my case the code was matrixrate_shipping/carrier_matrixrate so I had to change my config.xml like that:
<global>
<models>
<matrixrate_shipping>
<rewrite>
<carrier_matrixrate>my_class_name</carrier_matrixrate>
</rewrite>
</matrixrate_shipping>
</models>
instead of
<global>
<models>
<matrixrate>
<rewrite>
<carrier_matrixrate>my_class_name</carrier_matrixrate>
</rewrite>
</matrixrate>
</models>
Good Luck!
回答2:
Check first that the model is being overridden at all. Try this:
var_dump(get_class(Mage::getModel("shipping/carrier_tablerate")));
回答3:
After working through this one a bit, I found that the only way to override the shipping controller was to make a duplicate of the file (and directory structure) in the local code folder. Then I could basically tweak the code.
Not sure why Magento doesn't seem to allow the standard overriding of these shipping functions, but a least there is a work around.
回答4:
it's been a while but I had the same problem the last days. I wanted to override freeshipping and flatrate shipping methods and in addition to the answer of fab I had to add the following code in etc/config.xml. In my case the original values are located in 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>
The model values are examples. You have to replace them with your correct paths.
回答5:
If anyone else is facing this problem and came here for solution, it looks like OP have used codepool
in module file where it should be codePool
(notice the capital P).
来源:https://stackoverflow.com/questions/4474502/overridding-a-shipping-method-what-am-i-missing