订单确认电子邮件购物车中的Magento 1.9错误货币符号 - 使用PayPal付款时 - formatPrice()

Jam*_*e G 29 php currency magento

我有Magento 1.9.0.1以GBP(£)作为基准和默认显示货币,以及欧元(€)作为允许货币.

如果用户选择以欧元结账,则该网站全部有效,除非他们以自己的货币通过PayPal付款,然后订单确认电子邮件出错.在我下面的测试中,我以欧元(€)结账,但我的PayPal账户使用的是英镑(£).

购物车的商品价格和子总价以欧元显示,但带有£符号.小计,交付和总计均以欧元显示,并带有正确的€符号.

以下示例显示了具有近似价格的基本表示:

Items       Quantity    Item Price    Sub Total
---         ---         ---           ---
Product     1           £150.00       £150.00  <<-- These £'s should be €'s
-----------------------------------------------
Sub Total:                  €150.00 
Delivery:                   €0.00 
Total:                      €150.00 
Grand Total to be Charged:  £100.00
Run Code Online (Sandbox Code Playgroud)

我试图追踪它,但我不确定它出了什么问题,这是一个测试的噩梦.电子邮件致电:

(Mage_Checkout_Helper_Data) $this->helper('checkout')->formatPrice(...);
Run Code Online (Sandbox Code Playgroud)

那叫

(Mage_Core_Model_Store) $this->getQuote()->getStore()->formatPrice($price);
Run Code Online (Sandbox Code Playgroud)

最终找到了通往Zend货币方法的方法,但我不知道货币符号在哪里丢失.

只有在通过PayPal结账时才会出现此问题,而不是通过CC直接通过网站付款时.

谁能指出我正确的方向?谢谢

Fab*_*ler 3

确认电子邮件中不应有任何电话$this->helper('checkout')->formatPrice(...)。如果是这种情况,订单电子邮件将使用结帐项目模板而不是自己的模板,这可能是由于未完全实现的自定义产品类型或主题中的错误造成的。

订单总计显示正确的货币,因为总计块使用formatPrice()订单方法,该方法考虑了订单的货币:

$this->getOrder()->formatPrice($total->getValue());
Run Code Online (Sandbox Code Playgroud)

单个项目的模板也使用$_order->formatPrice(...). 但根据产品类型的不同,使用不同的模板。这是默认模板

每种产品类型的块和模板均通过sales.xml以下addItemRender操作定义:

<sales_email_order_items>

    <block type="sales/order_email_items" name="items" template="email/order/items.phtml">
        <action method="addItemRender"><type>default</type><block>sales/order_email_items_order_default</block><template>email/order/items/order/default.phtml</template></action>
        <action method="addItemRender"><type>grouped</type><block>sales/order_email_items_order_grouped</block><template>email/order/items/order/default.phtml</template></action>
        <block type="sales/order_totals" name="order_totals" template="sales/order/totals.phtml">
            <action method="setLabelProperties"><value>colspan="3" align="right" style="padding:3px 9px"</value></action>
            <action method="setValueProperties"><value>align="right" style="padding:3px 9px"</value></action>
            <block type="tax/sales_order_tax" name="tax" template="tax/order/tax.phtml">
                <action method="setIsPlaneMode"><value>1</value></action>
            </block>
        </block>
    </block>
    <block type="core/text_list" name="additional.product.info" />
</sales_email_order_items>
Run Code Online (Sandbox Code Playgroud)

添加产品类型的模块必须在那里注册自己的渲染器,如下所示bundle.xml

<sales_email_order_items>
    <reference name="items">
        <action method="addItemRender"><type>bundle</type><block>bundle/sales_order_items_renderer</block><template>bundle/email/order/items/order/default.phtml</template></action>
    </reference>
</sales_email_order_items>
Run Code Online (Sandbox Code Playgroud)

如果未定义,则默认渲染器是结账时的渲染器,其中不使用订单模型本身,仅使用单个项目(没有附加货币信息)。价格格式化是由结帐助手完成的,它没有有关订单的信息,因此它使用当前选择的商店货币。

为什么这只是 PayPal 等在线支付的问题?因为在其他方法中,通过“下订单”按钮立即创建订单确认邮件,当前选择的商店货币仍然与订单货币相同。但在 PayPal 的回调请求中,此上下文将丢失,并且将使用默认货币。

你需要做什么?

  1. 在布局 XML 文件中搜索<sales_email_order_items>布局句柄,以查看默认项目渲染器是否已正确注册
  2. 确保任何自定义产品类型也注册其渲染器
  3. 检查项目渲染器使用的模板。也许这是您主题中的一个错误,您只需替换$this->_helper('checkout')->formatPrice()$_order->formatPrice().