无法重写Mage_GoogleShopping_Model_Attribute_Link类

saf*_*foo 2 magento

我会尝试提供尽可能多的上下文.

一直试图覆盖Mage_GoogleShopping_Model_Attribute_Link2天但我无法让Magento拿起我的文件版本.

Mage_GoogleShopping_Model_Attribute_Linkclass在app/code/core/Mage/GoogleShopping/Model/Attribute/Link.php中

我把课程Safoo_Froogle_GoogleShopping_Model_Attribute_Link放在/app/code/local/Safoo/Froogle/GoogleShopping/Model/Attribute/Link.php

然后我的config.xml:

<global>
...
 <models>
        <safoofroogle>
            <class>Safoo_Froogle_Model</class>
        </safoofroogle>
        <googleshopping>
            <rewrite>
              <attribute_link>Safoo_Froogle_GoogleShopping_Model_Attribute_Link</attribute_link>
            </rewrite>
      </googleshopping>
    </models>
    <helpers>
      <googleshopping>
            <rewrite>
              <price>Safoo_Froogle_GoogleShopping_Helper_Price</price>
            </rewrite>
      </googleshopping>
    </helpers>
Run Code Online (Sandbox Code Playgroud)

(注意上面的Helper Rewrite非常有效.)

我调试了对Link模型的调用 Mage_GoogleShopping_Model_Type::_createAttribute

protected function _createAttribute($name)
{
    $modelName = 'googleshopping/attribute_' . $this->_prepareModelName($name);
    $useDefault = false;
###LOGGING###
    Mage::log($modelName); 
    Mage::log(get_class(Mage::getModel($modelName)  )); 
###LOGGING###
    try {
        $attributeModel = Mage::getModel($modelName);
        $useDefault = !$attributeModel;
    } catch (Exception $e) {
        $useDefault = true;
    }
    if ($useDefault) {
        $attributeModel = Mage::getModel('googleshopping/attribute_default');
    }
    $attributeModel->setName($name);

    return $attributeModel;
}
Run Code Online (Sandbox Code Playgroud)

这是2个日志语句的结果:

2011-11-01T06:57:17+00:00 DEBUG (7): googleshopping/attribute_Link 2011-11-01T06:57:17+00:00 DEBUG (7): Mage_GoogleShopping_Model_Attribute_Link

所以Mage::getModel('googleshopping/attribute_Link')还在取材Mage_GoogleShopping_Model_Attribute_Link.

我能够覆盖该类的唯一方法是将Link.php文件复制到相应的local目录:app/code/local /Mage/GoogleShopping/Model/Attribute/Link.php但是想避免这种情况.

只是不工作.我的助手重载工作.而且我认为我应该能够覆盖这个类,如下所示:

http://www.magentocommerce.com/boards/viewthread/222046

http://www.magentocommerce.com/boards/viewthread/35787/

有任何想法吗?

Ala*_*orm 6

你已经在Mage_GoogleShopping_Model_Type课堂上发现了一个阻止你重写的错误.根据您的调试,这里是最终被调用以实例化模型的代码

Mage::getModel('googleshopping/attribute_Link')
Run Code Online (Sandbox Code Playgroud)

虽然它在代码中没有强制执行,但它是一个完善的准则,所有类别名('googleshopping/attribute_Link'是类别名)应该是小写的.因为大写字母L,在attribute_Link,当Magento的查找类名的重写使用,它将搜索名为节点用大写L.

<attribute_Link>Safoo_Froogle_GoogleShopping_Model_Attribute_Link</attribute_Link>
Run Code Online (Sandbox Code Playgroud)

幸运的是,你可以解决这个问题.只需让你的config.xml重写部分看起来像这样,你的重写应该有效

<googleshopping>
    <rewrite>
        <attribute_Link>Safoo_Froogle_GoogleShopping_Model_Attribute_Link</attribute_Link>
        <attribute_link>Safoo_Froogle_GoogleShopping_Model_Attribute_Link</attribute_link>
    </rewrite>
</googleshopping>
Run Code Online (Sandbox Code Playgroud)

这样您就可以在表单Mage::getModel('googleshopping/attribute_Link')和表单中捕获实例化Mage::getModel('googleshopping/attribute_link').

为了将来参考,当您正在调试重写时,

Mage_Core_Model_Config::getGroupedClassName
Run Code Online (Sandbox Code Playgroud)

方法

app/code/core/Mage/Core/Model/Config.php 
Run Code Online (Sandbox Code Playgroud)

是Magento查找类重写的地方.