【问题标题】:Magento - Grand Total To Be Charged on InvoiceMagento - 要在发票上收取的总计
【发布时间】:2011-07-27 10:56:47
【问题描述】:

当客户从 Magento 商店购买商品时,他们会收到一封电子邮件确认,其中包括底部的一行“总要收费”。这显示了商店基础货币的总额。

我想将此数字添加到从后端打印的发票中。如何做到这一点?

【问题讨论】:

    标签: php magento


    【解决方案1】:

    让我们看看发生了什么。 从 url (www.example.com/index.php/admin/sales_invoice/view/invoice_id/[some_id]/) 中我们可以看到Mage_Adminhtml_Sales_Order_InvoiceController 的view 动作被执行,这对应于<adminhtml_sales_order_invoice_view>布局(app/design/adminhtml/default/default/layout/sales.xml)节点。在那里我们可以看到:

    <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().'\')'
            )
        );
    }
    

    和

    public function getPrintUrl()
    {
        return $this->getUrl('*/*/print', array(
            'invoice_id' => $this->getInvoice()->getId()
        ));
    }
    

    在这里我们可以看到我们的发票 PDF 是从当前模块/控制器的 print 操作创建的,所以让我们再次查看 Mage_Adminhtml_Sales_Order_InvoiceController 并搜索所需的操作方法:

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

    在父母Mage_Adminhtml_Controller_Sales_Invoice:

    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');
        }
    }
    

    我们可以看到 PDF 是由 sales/order_pdf_invoice 模型(或 Mage_Sales_Model_Order_Pdf_Invoice 类)创建的。在getPdf() 方法内部是一个调用$this-&gt;insertTotals($page, $invoice);,它在Mage_Sales_Model_Order_Pdf_Abstract 类中定义。 我的建议是覆盖 Mage_Sales_Model_Order_Pdf_Invoice 类并在那里定义一个自定义的 insertTotals($page, $invoice) 方法来实现您所需要的。 我决定给出一个完整的情况,让您决定如何解决这个任务.

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

    【讨论】:

      【解决方案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/ 启用该模块,然后在Yourcompanyname/PDFBasetotal/etc/ 下创建一个config.xml 文件,我将添加上述XML 以避免触及核心功能。

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

      注意$totals = Mage::getConfig()-&gt;getNode('global/pdf/totals')-&gt;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;
      }
      

      【讨论】:

      • 我这样做了,它几乎奏效了。它添加了基数,但货币符号错误。您可以从我的发票skitch.com/a1anm/efwnp/invoice2012-07-09-16-49-35.pdf-1-page 中看到快照,基本总额实际上应该是 93.33 英镑
      • 虽然你最初的问题没有提到货币差异,但这应该有助于Mage::app()-&gt;getConfig()-&gt;getNode('default/'.Mage_Directory_Model_Currency::XML_PATH_CURRENCY_BASE);
      • 我应该把这段代码放在哪里?我相信我最初的问题确实提到了货币“..Grand Total To Be Charged。这显示了商店基础货币的总数。”。您的解决方案显示了总额,但未显示基础货币 (£)。相反,它显示了客户在结账时使用的货币。
      • 我很抱歉,我重新阅读了您的问题,并且有一些货币差异的迹象。您可能想研究在/app/code/core/Mage/Sales/Model/Order/Pdf/Total/Default.php 中覆盖getTotalsForDisplay
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多