文本" Grand Total将被收费"在Magento 1.7的发票电子邮件中

时间:2014-05-08 12:30:50

标签: magento invoice

我在Magento 1.7中有一个要求,我的网站有多种货币,假设我使用GBP checkOut,而我的默认货币是USD。现在,订单电子邮件包含以下文本

Grand Total                   £93.66
Grand Total to be Charged    $169.70

这两个值在转换价值[今天的费率]方面彼此相等。但是当生成发票邮件时,最后一行" Grand Total将被收费"没有出现。我需要在所有其他交易电子邮件中显示该行,包括发票电子邮件[如果产品是以非默认货币购买的产品]。

我怎样才能实现这一目标?任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:3)

我找到了解决这个问题的方法。

我如何找到解决方案::

A)。发票电子邮件模板 invoice_new.html 包含以下行:

{{layout handle="sales_email_order_invoice_items" invoice=$invoice order=$order}}

而订单电子邮件模板 order_new.html 包含以下行:

{{layout handle="sales_email_order_items" order=$order}}

B)。在sales.xml中,布局句柄“ sales_email_order_invoice_items ”具有块模板“电子邮件/订单/ invoice / items.phtml ”...此item.phtml文件具有以下内容line ::

echo $this->getChildHtml('invoice_totals');

和sales.xml再次说::

<block type="sales/order_invoice_totals" name="invoice_totals" template="sales/order/totals.phtml">   

C)。同样,在sales.xml中,布局句柄' sales_email_order_items '有一个块模板'email / order / items.phtml'..此item.phtml文件包含以下行::

echo $this->getChildHtml('order_totals');

和sales.xml再次说::

<block type="sales/order_totals" name="order_totals" template="sales/order/totals.phtml">

d)。因此,订单和发票电子邮件都会动态加载“ sales / order / totals.phtml ”文件。现在在totals.phtml文件中,我们有一个这样的行::

foreach ($this->getTotals() as $_code => $_total):

上述函数 getTotals()循环包含总定价结构的数组,包括基本价格,运费,税金,折扣,其他货币的基本价格等。

E)。由于基本价格(管理面板中设置的BASE货币)在订单电子邮件中正确显示,我检查了Mage / Sales /中找到的类(来自块类型='sales / order_totals') Mage_Sales_Block_Order_Totals 块/订单/ Totals.php。 getTotals()函数只是迭代属性“ $ this-&gt; _totals ”。我还检查了这个' $ this-&gt; _totals '数组是如何通过' _initTotals()'方法创建的。在此 _initTotals()方法中,已创建 $ this-&gt; _totals ['base_grandtotal'] ,负责以基础货币打印订单价格是我在寻找的。但是,此基本价格未包含在发票电子邮件中。因此我打开了班级' Mage_Sales_Block_Order_Invoice_Totals '

F)。类“ Mage_Sales_Block_Order_Invoice_Totals ”(存在于文件'app / code / core / Mage / Sales / Block / Order / Invoice / Totals.php'中)继承自类 Mage_Sales_Block_Order_Totals '并覆盖创建定价数组的函数 _initTotals()。但是在这个函数中,有一行::

$this->removeTotal('base_grandtotal');

以上一行是从 _totals 数组中删除基本价格部分。简单地评论这条线终于解决了我的问题。

答案 1 :(得分:1)

这应该是正确的方式,以在不更改Magento代码的情况下获得预期的行为。

为此创建自己的扩展程序。我们用以下文件称它为Easylife_Sales(随意更改命名空间): app/etc/modules/Easylife_Sales.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Sales>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Sales />
            </depends>
        </Easylife_Sales>
    </modules>
</config>

app/code/local/Easylife/Sales/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Sales>
            <version>0.0.1</version>
        </Easylife_Sales>
    </modules>
    <global>
        <blocks>
            <sales>
                <rewrite>
                    <order_totals>Easylife_Sales_Block_Order_Totals</order_totals><!-- this tells Magneto to use your block instead the default one-->
                </rewrite>
            </sales>
        </blocks>
    </global>
</config>

app/code/local/Easylife/Sales/Block/Order/Totals.php

<?php
class Easylife_Sales_Block_Order_Totals extends Mage_Sales_Block_Order_Totals
{
    /**
     * Initialize order totals array
     *
     * @return Mage_Sales_Block_Order_Totals
     */
    protected function _initTotals()
    {
        $source = $this->getSource();

        $this->_totals = array();
        $this->_totals['subtotal'] = new Varien_Object(array(
            'code'  => 'subtotal',
            'value' => $source->getSubtotal(),
            'label' => $this->__('Subtotal')
        ));


        /**
         * Add shipping
         */
        if (!$source->getIsVirtual() && ((float) $source->getShippingAmount() || $source->getShippingDescription()))
        {
            $this->_totals['shipping'] = new Varien_Object(array(
                'code'  => 'shipping',
                'field' => 'shipping_amount',
                'value' => $this->getSource()->getShippingAmount(),
                'label' => $this->__('Shipping & Handling')
           ));
        }

        /**
         * Add discount
         */
        if (((float)$this->getSource()->getDiscountAmount()) != 0) {
            if ($this->getSource()->getDiscountDescription()) {
                $discountLabel = $this->__('Discount (%s)', $source->getDiscountDescription());
            } else {
                $discountLabel = $this->__('Discount');
            }
            $this->_totals['discount'] = new Varien_Object(array(
                'code'  => 'discount',
                'field' => 'discount_amount',
                'value' => $source->getDiscountAmount(),
                'label' => $discountLabel
            ));
        }

        $this->_totals['grand_total'] = new Varien_Object(array(
            'code'  => 'grand_total',
            'field'  => 'grand_total',
            'strong'=> true,
            'value' => $source->getGrandTotal(),
            'label' => $this->__('Grand Total')
        ));

        /**
         * Base grandtotal REMOVED
         */
        return $this;
    }
}
?>

清除缓存并禁用编译(如果已启用)。

通过适当的解决方案复制并启发:https://magento.stackexchange.com/a/2925/29024 PHP代码基于Magento 1.9.0.2

答案 2 :(得分:0)

转到 app / code / core / Mage / Sales / Block / Order / Totals.php

(我建议您覆盖该文件)

查找以下代码

if ($this->getOrder()->isCurrencyDifferent()) {
        $this->_totals['base_grandtotal'] = new Varien_Object(array(
            'code'  => 'base_grandtotal',
            'value' => $this->getOrder()->formatBasePrice($source->getBaseGrandTotal()),
            'label' => $this->__('Grand Total to be Charged'),
            'is_formated' => true,
        ));
    }

并将其替换为

//if ($this->getOrder()->isCurrencyDifferent()) {
if(false){
        $this->_totals['base_grandtotal'] = new Varien_Object(array(
            'code'  => 'base_grandtotal',
            'value' => $this->getOrder()->formatBasePrice($source->getBaseGrandTotal()),
            'label' => $this->__('Grand Total to be Charged'),
            'is_formated' => true,
        ));
    }