Magento 1.9 símbolo de moneda incorrecto en el carrito de correo electrónico de confirmación de pedido - al pagar con PayPal-formatPrice()


Tengo Magento 1.9.0.1 funcionando con GBP (£) como moneda base y predeterminada, y Euros (€) como moneda permitida.

Si el usuario opta por pagar en euros, el sitio todo funciona excepto, si pagan por PayPal en su propia moneda, entonces el correo electrónico de confirmación del pedido tiene un error. En mi prueba a continuación me registré en Euros ( € ), pero mi cuenta de PayPal estaba usando libras (£).

El Precio del Artículo del carrito y el Subtotal se muestran en euros, pero con un símbolo de£. El Subtotal, Entrega y Total todos aparecen en euros, con el símbolo € correcto.

El siguiente ejemplo muestra una representación básica con precios aproximados:

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

He intentado rastrearlo, pero no estoy seguro de dónde sale mal, y es una pesadilla para probar. El correo electrónico llama:

(Mage_Checkout_Helper_Data) $this->helper('checkout')->formatPrice(...);

Que llama

(Mage_Core_Model_Store) $this->getQuote()->getStore()->formatPrice($price);

Que finalmente encuentra su camino para Zend métodos de moneda, pero no se donde el símbolo de la moneda se está perdiendo.

Este problema solo ocurre al realizar el check-out con PayPal, no al pagar por CC directamente a través del sitio.

¿Puede alguien señalarme en la dirección correcta? Gracias

Author: Jamie G, 2015-09-14

3 answers

En el correo electrónico de confirmación, no debe haber ninguna llamada a $this->helper('checkout')->formatPrice(...) en ningún lugar. Si este es el caso, el correo electrónico de pedido utiliza las plantillas de elementos de pago en lugar de las suyas propias, lo que probablemente sea causado por un tipo de producto personalizado no completamente implementado o un error en su tema.

Los totales de la orden muestran la moneda correcta porque los totales bloquean utiliza el método formatPrice() de la orden, que tiene en cuenta la moneda de la orden:

$this->getOrder()->formatPrice($total->getValue());

Las plantillas para los elementos individuales utilice también $_order->formatPrice(...). Pero dependiendo del tipo de producto, se utilizan diferentes plantillas. Esta es la plantilla predeterminada.

Los bloques y plantillas para cada tipo de producto se definen en sales.xml con la acción 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>

Los módulos que agregan tipos de producto tienen que registrar sus propios renderizadores allí, como se puede ver en 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>

Si esto no se definió, el renderizador predeterminado es el del checkout, donde el modelo de pedido en sí no se utiliza, solo los elementos individuales (que no tienen información de la moneda adjunta). Allí, el formato del precio lo realiza el asistente de pago, que no tiene información sobre el pedido, por lo que utiliza la moneda de la tienda seleccionada actualmente.

¿Por qué esto es solo un problema con los pagos en línea como PayPal? Porque con otros métodos, donde el correo de confirmación del pedido se crea inmediatamente con el botón "realizar pedido", la moneda de la tienda seleccionada actualmente sigue siendo la misma que el pedido moneda. Pero en la solicitud de devolución de llamada de PayPal este contexto se pierde y se utilizará la moneda predeterminada en su lugar.

¿Qué necesitas hacer?

  1. Busque el controlador de diseño <sales_email_order_items> en sus archivos XML de diseño para ver si los renderizadores de elementos predeterminados están registrados correctamente
  2. Asegúrese de que cualquier tipo de producto personalizado también registre sus renderizadores
  3. Compruebe las plantillas que utilizan los renderizadores de elementos. Tal vez es un error en su tema y solo tienes que sustitúyase $this->_helper('checkout')->formatPrice() por $_order->formatPrice().
 3
Author: Fabian Schmengler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 09:22:37

Este parece ser el error de la moneda del conjunto de caracteres. Debe aplicar charset utf-8 buscando ese código en particular para la plantilla de correo electrónico.

 -2
Author: Gaurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-30 11:33:03

Puede cambiar los símbolos de moneda desde Sistema- > Administrar moneda - > Símbolos

 -4
Author: Y.Q,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-12 02:02:48