PrestaShop: Añadir detalles del pedido en los emails de cambio de estado

Cuando el estado de un pedido de PrestaShop cambia podemos enviar un email para aviar al cliente de dicho cambio. Sin embargo, este email tiene bastantes limitaciones. En este post te voy a dar algunas pistas para poder añadir más información en los emails (por ejemplo, el detalle del pedido).

Posiblemente hayas probado a usar la plantilla ‘order_conf’ en Parámetros de la tienda -> Configuración de pedidos pero hayas visto que el email llega con este aspecto:

Nota: Para hacer lo que se menciona en este artículo necesitarás «tocar código» y crear un módulo de PrestaShop. Hacen falta conocimientos de programación.

Comencemos por un hook

Lo primero que hay que hacer es añadir a nuestro módulo de PrestaShop una cosa llamada «hook» (un garfio). Un hook es un trozo de código (un método) que se ejecuta cuando sucede algún evento.

En PrestaShop tenemos unos cuantos hooks disponibles. Para nuestro caso usaremos:

actionEmailAddAfterContent

Para avisar a PresaShop de que vamos usar este hook tenemos que añadirlo en nuestra función install:

public function install()
{
    // ...

    return parent::install() &&
        $this->registerHook('actionEmailAddAfterContent');
}

Tendremos que reinstalar el módulo para que el cambio sea efectivo.

El siguiente paso es definir el el fichero principal de nuestro módulo el método que se ejecutará cuando ocurre el evento actionEmailAddAfterContent:

public function hookActionEmailAddAfterContent($params)
{
    dump($params);die(); // Vamos a meter esta línea para ver si funciona bien
}

Para probarlo de manera sencilla puedes irte al listado de pedidos y pinchar el botón «Reenviar email»:

Si todo ha ido bien podrás ver el contenido de la variable $params que, entre otras cosas contendrá el elemento template_html que es el que contiene la plantilla de HTML que se incluirá en nuestro email.

Si lo que quieres es enviar el detalle del pedido en el email puedes usar la plantilla ‘order_conf’. Esta plantilla incluye una sección {products} que puedes sustituir por el listado de productos (ojo, que aún no lo tenemos):

public function hookActionEmailAddAfterContent($params)
{
    $productos = '¡Mis productos!';
    $params['template_html'] = str_replace("{products}", $productos, $params['template_html']);
}

Si ahora probaras a enviar el email ya verías que en lugar de {products} ahora se mostrará ¡Mis productos!

Recuperar los detalles del pedido

El siguiente paso sería recuperar los datos del pedido. Eso podemos hacerlo añadiendo al principio de nuestro método el siguiente código:

$idPedido = Tools::getValue('id_order');
$pedido = new Order($idPedido);

Y el detalle del pedido:

$detallesPedido = OrderDetail::getList((int) $idPedido);

Con este objeto puedes construir el listado de los productos y meterlo en la variable $productos que he puesto más arriba.

También puedes sacar otras informaciones necesarias con ésto:

$transportista = new Carrier((int)($pedido->id_carrier), $pedido->id_lang);
$direccion = new Address((int)$pedido->id_address_delivery);
$direccionFacturacion = new Address((int)$pedido->id_address_invoice);

Y ya solo te quedaría sustituir toda esta información en la plantilla usando el mismo sistema que hemos hecho para los productos.

¡El precio se muestra con un montón de decimales!

Resulta que has ido a sacar el total del pedido de:

$pedido->total_shipping

y te sale todo con decimales. ¿Es que te lo tengo que dar todo mascado? Pues usa:

Tools::displayPrice($pedido->total_shipping)

Pero lo que quiero es cambiar el email que se envía al generar el pedido

Vale, haberlo dicho antes. Seguro que has probado a enviar el email en el momento de generar el pedido y te ha dado algún error.

NOTA: Esto solo es necesario en el caso de que tengas error en la generación del email.

Para arreglarlo tendrás que usar otro hook; en este caso: actionValidateOrder. Recuerda añadir esto para que tu módulo pueda usarlo:

public function install()
{
    // ...

    return parent::install() &&
        $this->registerHook('actionValidateOrder') && 
        $this->registerHook('actionEmailAddAfterContent');
}

Y no olvides reiniciarlo.

También deberías añadir esto en tu módulo. Sí, arriba, dentro de tu clase:

    /** @var Order */
    private $pedidoEnCurso;

Y por último recoger la información del pedido:

public function hookActionValidateOrder($params)
{
$this->pedidoEnCurso = $params['order'];
}

Y, claro, tendrás que modificar el método hookActionEmailAddAfterContent para dejarlo algo así:

public function hookActionEmailAddAfterContent($params) {
    if ($this->pedidoEnCurso) {
        $idPedido = $this->pedidoEnCurso->id;
        $pedido = $this->pedidoEnCurso;
    }
    else {
        $idPedido = Tools::getValue('id_order');
       $pedido = new Order($idPedido);
   }

Deja un comentario