0

我试图覆盖 Pdf 类以更改 Invoice/Shipment/Creditmemo pdf,但它似乎没有反映出来。

我在 Mymodule/etc/config.xml 中创建了一个模块

<config>
<modules>
    <Mymodule_Printtemplates>
        <version>0.1.0</version>
    </Mymodule_Printtemplates>
</modules>
<global>
    <models>
        <sales>
            <rewrite>
                <order_pdf_abstract>Mymodule_Printtemplates_Model_Order_Pdf_Abstract</order_pdf_abstract>
                <order_pdf_invoice>Mymodule_Printtemplates_Model_Order_Pdf_Invoice</order_pdf_invoice>
                <order_pdf_creditmemo>Mymodule_Printtemplates_Model_Order_Pdf_Creditmemo</order_pdf_Creditmemo>
                <order_pdf_shipment>Mymodule_Printtemplates_Model_Order_Pdf_Shipment</order_pdf_shipment>
            </rewrite>
        </sales>
    </models>
</global>

然后我在 Mymodule/models/ 中创建了以下模型类作为 Abstract.php、Invoice.php、Shipment.php、Creditmemo.php

abstract class Mymodule_Printtemplates_Model_Order_Pdf_Abstract extends Mage_Sales_Model_Order_Pdf_Abstract

class  Mymodule_Printtemplates_Model_Order_Pdf_Invoice extends  Mymodule__Printtemplates_Model_Order_Pdf_Abstract { ... functions here ...}

class Mymodule_Printtemplates_Model_Order_Pdf_Shipment extends Mymodule__Printtemplates_Model_Order_Pdf_Abstract{ ... functions here ...}

class Mymodule_Printtemplates_Model_Order_Pdf_Creditmemo  extends  Mymodule__Printtemplates_Model_Order_Pdf_Abstract{ ... functions here ...}

该模块已启用 - 我已通过 System>Configuration>Admin>Advanced 检查它,但它似乎没有反映更改

另一方面,如果我将粘贴 Mage/Sales/Model/Order/Pdf/*.php 复制到本地并进行更改,则会反映更改。我知道这不是推荐的方法,但通过重写类的方法似乎不起作用。

通过类重写对第一种方法的任何帮助将不胜感激。

谢谢,洛芙琳


真正的问题是 etc/config.xml 中的语法错误 [参见结束标记中的大写 C]

Mymodule_Printtemplates_Model_Order_Pdf_Creditmemo

我使用以下方法来调试问题:将其放在 index.php 的底部,类似于 Alans 模块列表,但可以快速复制/粘贴代码。请记住,Magento 的所有 XML 都组合成一棵 XML 树。

header("内容类型:文本/xml"); die(Mage::app()->getConfig()->getNode()->asXML());

取自以下答案:我如何知道我的 Config.xml 文件是否在 Magento 中工作?

4

2 回答 2

2

这是我看到的几件事。

  1. 每个覆盖文件的文件路径是什么?它们应该是:Mymodule/Printtemplates/Model/Order/Pdf/Invoice.php例如。类名应与文件名匹配。
  2. 重写不会影响抽象类,除非使用工厂方法调用抽象类(不推荐)。重写的工作方式是通过工厂方法 ( Mage::getModel(''))。使用工厂方法允许 Magento 浏览系统以查看是否需要使用另一个类。但是,当一个类被硬引用(ex Mage_Sales_Model_Order_Pdf_Abstract)时,它不会通过工厂方法,因此不会发生重写。
  3. 我会考虑让您的每个课程都扩展其原始课程(例如Mage_Sales_Model_Order_Pdf_Invoice等)。如果您有额外的常用功能,您可能会将它们放入 Helper。
  4. 要查看代码是否被调用,请将已知代码错误放入文件中。PHP 会抱怨,告诉你你的文件正在被加载。
于 2012-11-07T03:09:00.837 回答
2

我使用以下方法来调试问题:将其放在 index.php 的底部,类似于 Alans 模块列表,但可以快速复制/粘贴代码。请记住,Magento 的所有 XML 都组合成一棵 XML 树。

header("内容类型:文本/xml"); die(Mage::app()->getConfig()->getNode()->asXML());

取自以下答案:我如何知道我的 Config.xml 文件是否在 Magento 中工作?

于 2012-11-14T22:34:17.503 回答