2011-02-13 76 views
2

请能帮助我这个magento专家之一。这一直让我疯狂的一整天!Magento - 模型覆盖不起作用

我想覆盖Mage_Catalog_Model_Product_Type_Price和任何我尝试不工作。我之前做过几次这样的事情,并确信我的代码是正确的,但我显然错过了一些东西。

控制器工作正常,如果我实例化模型,它也可以正常工作。它似乎是实际重写本身不起作用。

我正在使用Magento 1.5.1。

这里是我的模块配置文件中的代码:

<?xml version="1.0" encoding="utf-8"?> 
<config> 
    <modules> 
     <MyNs_MyMod> 
      <version>0.1.0</version> 
     </MyNs_MyMod> 
    </modules> 
    <global> 
    <models> 
     <catalog> 
     <rewrite> 
      <product_type_price>MyNs_MyMod_Model_Price</product_type_price> 
     </rewrite> 
     </catalog> 
    </models> 
    </global> 
    <frontend> 
     <routers> 
      <mymod> 
       <use>standard</use> 
       <args> 
        <module>MyNs_MyMod</module> 
        <frontName>mymod</frontName> 
       </args> 
      </mymod> 
     </routers> 
    </frontend> 
</config> 

这里是向后剥离到最小型号代码:

<?php 

class MyNs_MyMod_Model_Price extends Mage_Catalog_Model_Product_Type_Price 
{ 
    public function getPrice($product = null) { 
     Mage::log('Made it into getPrice()'); 

     return 0; 
    } 
} 
+0

当你实例化Mage :: getModel('catalog/product_type_price')时会发生什么?你得到一个物体吗?如果是这样,它的课程是什么? – 2011-02-13 17:55:36

回答

10

这是一个猜测在这里,但根据您的评论它听起来像你已经成功地重写了Mage_Catalog_Model_Product_Type_Price类。 但是,Magento的重写系统并不是你在Ruby/Python中看到的“真正的”鸭子打字/猴子打补丁。只有核心代码通过类别别名catalog/product_type_price实例化Mage_Catalog_Model_Product_Type_Price时,重写才起作用。它不适用于对象是继承自Mage_Catalog_Model_Product_Type_Price的类的实例。

因此,考虑这

#File: app/code/core/Mage/Catalog/Model/Product/Type/Configurable/Price.php 
<?php 
class Mage_Catalog_Model_Product_Type_Configurable_Price extends Mage_Catalog_Model_Product_Type_Price 

我的猜测是你加载实例化一个Mage_Catalog_Model_Product_Type_Configurable_Price的页面。这就是为什么当你单独实例化一个catalog/product_type_price时,你的重写看起来很有效,但是当系统实例化一个catalog/product_type_configurable_price时,你的重写不会(也不能)被触发。

长话短说,试着改写catalog/product_type_configurable_price模型,看看你是否有更多的运气。

如果这不起作用,您需要跟踪Magento核心代码实例化这些对象的位置,并调试发生了什么。为您的代码提供更多的上下文可以帮助这里的人们帮助您解决这个问题。