我在Magento 1.7中有一个要求,我的网站有多种货币,假设我使用GBP checkOut,而我的默认货币是USD。现在,订单电子邮件包含以下文本
Grand Total £93.66
Grand Total to be Charged $169.70
这两个值在转换价值[今天的费率]方面彼此相等。但是当生成发票邮件时,最后一行" Grand Total将被收费"没有出现。我需要在所有其他交易电子邮件中显示该行,包括发票电子邮件[如果产品是以非默认货币购买的产品]。
我怎样才能实现这一目标?任何帮助都非常感谢。
答案 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,
));
}