首先,我为在这里提出另一个“magento核心覆盖”问题而道歉,但我遵循了大约10个教程并阅读了几乎所有类似的问题,但没有成功。
我必须覆盖一堆核心模型和类。代码有效,因为我已经改变了核心(在测试magento站点中)并且它工作得很完美。但是偶尔会有一个magento更新,如果我们应用更新,我的所有更改都将丢失。 所以我必须改写基本代码。 我想创建自己的模块来输入所有必需的代码,因为我只需要在每个类中覆盖1或2个函数,其余的应该像Magento一样工作。
我的第一次尝试是覆盖 Mage_Sales_Model_Order_Pdf_Invoice 类。 好的,所以我制作了我的模块。文件结构是:
应用/代码/本地/ [命名空间] /Sales/etc/config.xml
应用/代码/本地/ [命名空间] /Sales/Helper/Data.php (这个类没有做任何事情,它只是一个空类。我之所以这样做是因为我读到某个地方,如果没有Helper类,Magento有时候不会识别模块)
应用/代码/本地/ [命名空间] /Sales/Model/Order/Pdf/Invoice.php
应用的/ etc /模块/ [命名空间] _Sales.xml
[namespace] _Sales.xml文件看起来像这样:
<?xml version="1.0"?>
<config>
<modules>
<[namespace]_Sales>
<active>true</active>
<codePool>local</codePool>
</[namespace]_Sales>
</modules>
</config>
config.xml文件如下所示:
< ?xml version="1.0"?>
<config>
<modules>
<[namespace]_Sales>
<version>0.1.0</version>
</[namespace]_Sales>
</modules>
<global>
<helpers>
<sales>
<class>[namespace]_Sales_Helper</class>
</sales>
</helpers>
<models>
<sales>
<rewrite>
<order_pdf_invoice>[namespace]_Sales_Model_Order_Pdf_Invoice</order_pdf_invoice>
</rewrite>
</sales>
</models>
</global>
</config>
Invoice.php文件如下所示:
<?php
/****I'm adding some different classes here*******************************/
include_once Mage::getBaseDir('lib')."/myclass.php";
include_once Mage::getBaseDir('lib')."/another_library.php";
/********************************************************/
class [namespace]_Sales_Model_Order_Pdf_Invoice extends Mage_Sales_Model_Order_Pdf_Invoice
{
public function getPdf($invoices = array())
{
//my code
}
}
我想先测试一下,然后覆盖我必须改变的所有其他控制器和模型。
问题是,它仍然使用原始模型。
我认为模块代码和路径是正确的,因为magento找到了我的自定义模型。我通过进入后端检查并查看系统 - >配置 - >高级
我完全清除了缓存,所以不是它。
我使用get_class来确定控制器中返回的模型: get_class(Mage :: getModel('sales / order_pdf_invoice')),这将返回 Mage_Sales_Model_Order_Pdf_Invoice
我不知道我犯了哪个错误,但我确信我做了一个:(
答案 0 :(得分:7)
我从字面上发现了一些错误。请纠正这些错误: -
您在“local
”代码池中的问题中提到的所有文件结构在“code
”文件夹中都缺少文件夹名称“app
”。因此,本地模块的每个文件结构都必须如下:“app/code/local/[namespace]/Sales/...
”。
如果此文件夹结构错误,那么 [namespace]_Sales
模块也可能无法正常工作。
其次,文件“config.xml
”的内容有点不对。正确的将是: -
<?xml version="1.0"?>
<config>
<modules>
<[namespace]_Sales>
<version>0.1.0</version>
</[namespace]_Sales>
</modules>
<global>
<helpers>
<!--
This node will be the unique identifier of your module,
and it will be used every time your code requires referencing your own module.
This shouldn't clash with other unique identifiers used in your Magento system.
Normally all the characters are kept in small case for this,
however, I haven't tried with the upper case.
But it will be best to keep your unique identifier in small case only.
-->
<[namespace]sales>
<class>[namespace]_Sales_Helper</class>
</[namespace]sales>
</helpers>
<models>
<!--
If this is not provided, then Magento will not know your module's starting part of Model Class Names.
-->
<[namespace]sales>
<class>[namespace]_Sales_Model</class>
</[namespace]sales>
<sales>
<rewrite>
<order_pdf_invoice>[namespace]_Sales_Model_Order_Pdf_Invoice</order_pdf_invoice>
</rewrite>
</sales>
</models>
</global>
</config>
另外我认为你不需要在这里添加不同的类(你在“[namespace]_Sales_Model_Order_Pdf_Invoice
”类PHP页面中已经完成了)。这是因为Magento会自动加载相关库的所有定义(库类的一些示例是“Varien
”和“Zend
”。您只需要创建这些库类的对象,您就可以完全使用这些方法。
希望它有所帮助。