Ответ 1
В электронном письме с подтверждением не должно быть никакого вызова $this->helper('checkout')->formatPrice(...)
в любом месте. Если это так, в электронном письме заказа используются шаблоны элементов оформления заказа, а не их собственные, что, вероятно, вызвано не полностью реализованным пользовательским типом продукта или ошибкой в вашей теме.
Итоговые суммы заказа показывают правильную валюту, потому что nofollow → totalals использует метод formatPrice()
порядка, который берет валюту заказа:
$this->getOrder()->formatPrice($total->getValue());
В шаблонах для отдельных элементов также используется $_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>
Модули, которые добавляют типы продуктов, должны регистрировать свои собственные средства визуализации там, как это видно в 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>
Если это не было определено, рендерингом по умолчанию является тот, который выдается из проверки, где сама модель заказа не используется, а только отдельные элементы (которые не имеют никакой информации о валюте). Там форматирование цены выполняется помощником проверки, который не имеет информации о заказе, поэтому он использует выбранную в настоящий момент валюту магазина.
Почему это только проблема с онлайн-платежами, такими как PayPal? Поскольку с помощью других методов, когда письмо с подтверждением заказа создается сразу с кнопкой "заказ места", выбранная в настоящий момент валюта магазина по-прежнему совпадает с валютой заказа. Но в запросе обратного вызова из PayPal этот контекст будет потерян, и вместо этого будет использоваться валюта по умолчанию.
Что вам нужно сделать?
- Найдите дескриптор макета
<sales_email_order_items>
в XML файлах макета, чтобы убедиться, что рендеринг элементов по умолчанию зарегистрирован правильно. - Убедитесь, что любые пользовательские типы продуктов также регистрируют свои средства визуализации.
- Проверьте шаблоны, используемые средствами рендеринга элементов. Возможно, это ошибка в вашей теме, и вам просто нужно заменить
$this->_helper('checkout')->formatPrice()
на$_order->formatPrice()
.