Magento - 发票上的总费用

时间:2011-07-27 10:56:47

标签: php magento

当客户从Magento商店购买商品时,他们会收到一封电子邮件确认信息,其中包含一行底部的“Grand Total To Charged”。这显示了商店基础货币的总数。

我想将此图添加到从后端打印的发票中。怎么办呢?

2 个答案:

答案 0 :(得分:3)

让我们看看发生了什么。 正如我们在网址上看到的那样(www.example.com/index.php/admin/sales_invoice/view/invoice_id/[some_id]/) Mage_Adminhtml_Sales_Order_InvoiceController的{​​{1}}动作已执行,这是对应的到view布局(app / design / adminhtml / default / default / layout / sales.xml)节点。在那里我们可以看到:

<adminhtml_sales_order_invoice_view>

我们可以看到顶部块是<adminhtml_sales_order_invoice_view> <reference name="content"> <block type="adminhtml/sales_order_invoice_view" name="sales_invoice_view"> ... 。在那里我们可以看到(在Mage_Adminhtml_Block_Sales_Order_Invoice_View方法的末尾):

__construct()

if ($this->getInvoice()->getId()) {
    $this->_addButton('print', array(
        'label'     => Mage::helper('sales')->__('Print'),
        'class'     => 'save',
        'onclick'   => 'setLocation(\''.$this->getPrintUrl().'\')'
        )
    );
}

在这里,我们可以看到我们的发票PDF是从当前模块/控制器的public function getPrintUrl() { return $this->getUrl('*/*/print', array( 'invoice_id' => $this->getInvoice()->getId() )); } 操作创建的,因此我们再次查看print并搜索所需的操作方法:

Mage_Adminhtml_Sales_Order_InvoiceController

并在父/** * Create pdf for current invoice */ public function printAction() { $this->_initInvoice(); parent::printAction(); } 中:

Mage_Adminhtml_Controller_Sales_Invoice

我们可以看到PDF是由public function printAction() { if ($invoiceId = $this->getRequest()->getParam('invoice_id')) { if ($invoice = Mage::getModel('sales/order_invoice')->load($invoiceId)) { $pdf = Mage::getModel('sales/order_pdf_invoice')->getPdf(array($invoice)); $this->_prepareDownloadResponse('invoice'.Mage::getSingleton('core/date')->date('Y-m-d_H-i-s'). '.pdf', $pdf->render(), 'application/pdf'); } } else { $this->_forward('noRoute'); } } 模型(或sales/order_pdf_invoice类)创建的。 Mage_Sales_Model_Order_Pdf_Invoice方法内部是getPdf()类的调用$this->insertTotals($page, $invoice);我的建议是覆盖Mage_Sales_Model_Order_Pdf_Abstract课程并定义一种自定义Mage_Sales_Model_Order_Pdf_Invoice方法来实现您的需求。我决定全面了解情况,让您决定如何解决这个任务。

有用的链接 - Overriding a model class in Magento

答案 1 :(得分:2)

简而言之,您需要做的就是添加一些XML:

<global>
    <pdf>
       <totals>
            <mygrand_total translate="title">
                <title>Grand Total To Be Charged</title>
                <source_field>base_grand_total</source_field>
                <font_size>8</font_size>
                <display_zero>1</display_zero>
                <sort_order>705</sort_order>
            </mygrand_total>
       </totals>
    </pdf>
</global>

我会在app/code/local/Yourcompanyname/PDFBasetotal下创建一个单独的模块,然后通过etc/modules/启用该模块,之后在config.xml下创建一个Yourcompanyname/PDFBasetotal/etc/文件,我会在上面添加上面的XML避免任何涉及核心功能。

至于为什么会这样做,请参阅以下方法:app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php

请注意$totals = Mage::getConfig()->getNode('global/pdf/totals')->asArray();,因为这是创建总输出时循环播放的内容。

protected function _getTotalsList($source)
{
    $totals = Mage::getConfig()->getNode('global/pdf/totals')->asArray();
    usort($totals, array($this, '_sortTotalsList'));
    $totalModels = array();
    foreach ($totals as $index => $totalInfo) {
        if (!empty($totalInfo['model'])) {
            $totalModel = Mage::getModel($totalInfo['model']);
            if ($totalModel instanceof Mage_Sales_Model_Order_Pdf_Total_Default) {
                $totalInfo['model'] = $totalModel;
            } else {
                Mage::throwException(
                    Mage::helper('sales')->__('PDF total model should extend Mage_Sales_Model_Order_Pdf_Total_Default')
                );
            }
        } else {
            $totalModel = Mage::getModel($this->_defaultTotalModel);
        }
        $totalModel->setData($totalInfo);
        $totalModels[] = $totalModel;
    }

    return $totalModels;
}