Recibir notificaciones por email cuando se registra un cliente en Prestashop 1.6

18 enero, 2015 |

Si te gusta, compártelo ;)

Pedido recibido en Prestashop

En este tutorial vamos a dotar a nuestra tienda Prestashop 1.6 de una característica que no trae por defecto.

Cuando un nuevo cliente se registra en nuestra tienda, aparece una notificación en el panel de administración, pero obviamente, nosotros, como administradores, no advertiremos este nuevo registro hasta que no visitemos el back-office de Prestashop.

Por lo tanto, vamos a dar una funcionalidad nueva a nuestra tienda; que cada vez que se registre un cliente, podamos recibir notificaciones por email informándonos del nuevo registro. De esta forma, cuando recibamos este email, sentiremos una pequeña alegría en cualquier momento, siempre y cuando llevemos el móvil o celular encima :)


Compatibilidad: Prestashop 1.5, y 1.6

Descargar los archivos del proyecto

Si os da pereza realizar todo el tutorial debido a la longitud del mismo (aunque es mucho más rápido de realizar de lo que parece), podéis descargar los "Archivos del proyecto" y pegar los archivos en las rutas indicadas, no se tarda ni dos minutos.

Una vez lo hayáis probado y si os funciona (debe funcionar), leeréis el tutorial con más ganas, y asi podréis saber cómo funciona todo esto :)

Lo que vamos a hacer...

Como queremos ser informados cuando un cliente se registre en nuestra tienda, tenemos que añadir un fragmento de código en el método responsable de notificar al propio usuario de su registro, es decir, vamos a añdir un fragmento de código en el archivo que se encarga de avisar por email al usuario una vez se ha registrado. Solo que este fragmento de código enviará un email al administrador de la tienda.

Para conseguir esto necesitamos extender el método sendConfirmationMail() del archivo AuthController.php. Tambien necesitamos crear una nueva plantilla de correo electrónico.

Override sobre el archivo AuthController.php

Es buena práctica redifinir un archivo mediante la técnica de override, en lugar de tocar los archivos originales. De este modo conservaremos los cambios aunque actualicemos Prestashop.

Por lo tanto, crearemos un nuevo archivo llamado AuthController.php en ..prestashop/override/controllers/front. Dentro de la etiqueta PHP (<?php), debemos pegar el siguiente código:

class AuthController extends AuthControllerCore
{
 
     
}

Como he mencionado anteriormente, debemos extender el método original sendConfirmationMail(), así que, copiaremos el método del controlador original y lo pegaremos en nuestro override. El metódo original se encuentra en la ruta ..prestashop/controllers/front/AuthController.php. Estoy usando Prestashop 1.6.0.5:

class AuthController extends AuthControllerCore
{
  protected function sendConfirmationMail(Customer $customer)
 {
  if (!Configuration::get('PS_CUSTOMER_CREATION_EMAIL'))
   return true;
   
  Mail::Send(
            Configuration::get('PS_LANG_DEFAULT'),
            'account_for_admin',
            Mail::l('Nuevo registro en su tienda!'),
            array(
                '{firstname}' => $customer->firstname,
                '{lastname}' => $customer->lastname,
                '{email}' => $customer->email
                ),
            Configuration::get('PS_SHOP_EMAIL'),
            Configuration::get('PS_SHOP_NAME')
        );
  return Mail::Send(
   $this->context->language->id,
   'account',
   Mail::l('Welcome!'),
   array(
    '{firstname}' => $customer->firstname,
    '{lastname}' => $customer->lastname,
    '{email}' => $customer->email,
    '{passwd}' => Tools::getValue('passwd')),
   $customer->email,
   $customer->firstname.' '.$customer->lastname
  );
 }
     
}

Os debe quedar como vemos arriba.

Por si acaso, y antes de nada, comprobemos que el envío de emails funciona. Borremos el archivo class_index.php (no hay peligro en borrar este archivo) ubicado en la ruta ../prestashop/cache. Hecho esto, registremos un nuevo usuario en nuestra tienda, y cerciorémonos de que el email de confirmación es enviado correctamente.

Si funciona correctamente, es momento de añadir un fragmento de código que enviará un email al administrador cuando se produzca un registro.

Justo después de la línea return true;, añadir:

Mail::Send(
            Configuration::get('PS_LANG_DEFAULT'),
            'account_for_admin',
            Mail::l('Nuevo registro en su tienda!'),
            array(
                '{firstname}' => $customer->firstname,
                '{lastname}' => $customer->lastname,
                '{email}' => $customer->email
                ),
            Configuration::get('PS_SHOP_EMAIL'),
            Configuration::get('PS_SHOP_NAME')
        );

De forma que el código quede así:

class AuthController extends AuthControllerCore
{
  protected function sendConfirmationMail(Customer $customer)
 {
  if (!Configuration::get('PS_CUSTOMER_CREATION_EMAIL'))
   return true;
   
  Mail::Send(
            Configuration::get('PS_LANG_DEFAULT'),
            'account_for_admin',
            Mail::l('Nuevo registro en su tienda!'),
            array(
                '{firstname}' => $customer->firstname,
                '{lastname}' => $customer->lastname,
                '{email}' => $customer->email
                ),
            Configuration::get('PS_SHOP_EMAIL'),
            Configuration::get('PS_SHOP_NAME')
        );

 return Mail::Send(
            $this->context->language->id,
            'account',
            Mail::l('Welcome!'),
            array(
                '{firstname}' => $customer->firstname,
                '{lastname}' => $customer->lastname,
                '{email}' => $customer->email,
                '{passwd}' => Tools::getValue('passwd')),
            $customer->email,
            $customer->firstname.' '.$customer->lastname
        );
 }
     
}

Explicación del código insertado:

Mail::Send(
            Configuration::get('PS_LANG_DEFAULT'),
            'account_for_admin',
            Mail::l('Nuevo registro en su tienda!'),
            array(
                '{firstname}' => $customer->firstname,
                '{lastname}' => $customer->lastname,
                '{email}' => $customer->email
                ),
            Configuration::get('PS_SHOP_EMAIL'),
            Configuration::get('PS_SHOP_NAME')
        );

Simplemente hemos tomado la función original Mail::Send() , y la hemos adaptado a nuestras necesidades.

En primer lugar, en vez de utilizar el idioma del cliente que tomaría la plantilla correspondiente a ese idioma, utilizamos el idioma de la tienda por defecto. De esta forma no es necesario traducir las plantillas a cada idioma. Además, como esta plantilla va ir dirigida al administrador lo más adecuado es utilizar el idioma de la tienda por defecto

El segundo parámetro corresponde a la plantilla account_for_admin que vamos a utilizar como email, (todavía tenemos que crearla).

También eliminamos la contraseña para preservar la confidencialidad del usuario

Por último, como destinatario del correo ponemos el email de la tienda, y como emisor, el nombre de la tienda.

Bien, vamos a crear la plantilla!

Creando la plantilla de email

Vamos a tomar como base una plantilla html existente, en este caso la de bienvenida de usuario, es decir, la que se le envía a un usuario cuando se registra en la tienda.

Por lo tanto, vayamos a la ruta ../prestashop/mails/es (es corresponde al idioma de nuestra tienda, el que tengáis vosotros), y copiemos los archivos account.html y account.txt. Debemos pegarlos en la misma ubicación, renombrándolos como account_for_admin.html y account_for_admin.txt.

Abramos el archivo account_for_admin.txt, veremos algo como esto:

[{shop_url}] 

Hola {firstname} {lastname},

Gracias por crear una cuenta de cliente en {shop_name}. 

Estos son sus datos de acceso:

DIRECCIÓN EMAIL: {email}

CONTRASEÑA: {passwd}    

Consejos de Seguridad:

* Mantenga los datos de su cuenta en un lugar seguro.

* No comparta los detalles de su cuenta con otras personas.

* Cambie su clave regularmente.

* Si sospecha que alguien está usando ilegalmente su cuenta,
avísenos inmediatamente.

Ahora podrá realizar pedidos en nuestra tienda: {shop_name}
[{shop_url}] 

{shop_name} [{shop_url}] creado por
PrestaShop(tm) [http://www.prestashop.com/]

Aunque cada uno es libre, podemos realizar los siguientes cambios para que quede así:

[{shop_url}] 

Hola,

Un nuevo cliente se ha registrado en: {shop_name}. 

Estos son los detalles:
 
Email: {email}
 
Nombre: {firstname} {lastname}

Para la plantilla html podríamos usar este código:

&nbsp;
Hola,
Un nuevo cliente se ha registrado en: {shop_name}.
&nbsp;

Estos son los detalles:

Dirección email: {email}
Nombre: {firstname} {lastname}
&nbsp;
&nbsp;
El código de arriba debemos pegarlo justo después de la etiqueta <body>. Es la tabla principal de la plantilla.

Solución de problemas

En ocasiones el envío de emails en Prestashop puede fallar. Si no funciona a la primera, hagamos lo siguiente:

  • Enviar un mensaje de prueba desde nuestro Back-office, desde Parámetros avanzados -> Correo electrónico a nuestra dirección de email para ver si el envío de emails funciona correctamente.
  • Mirar en la carpeta de Correo no deseado, es muy posible que el mensaje haya ido a parar allí.
  • Comprobar que hayamos escrito correctamente el nombre de la plantilla; account_for_admin
  • Asegurarse de que hemos añadido la plantilla en la carpeta del idioma correcta.

Si a pesar de hacer todo esto, el email sigue sin ser enviado, merece la pena "abortar" el método Mail::Send. En ese caso podríamos probar este código:

Mail::Send(
            Configuration::get('PS_LANG_DEFAULT'),
            'account_for_admin',
            Mail::l('Nuevo registro en su tienda!'),
            array(
                '{firstname}' => $customer->firstname,
                '{lastname}' => $customer->lastname,
                '{email}' => $customer->email
                ),
            Configuration::get('PS_SHOP_EMAIL'),
            Configuration::get('PS_SHOP_NAME'),
            null,null,null,null,_PS_MAIL_DIR_,true
        );
El último parámetro anula el método en caso de fallo. Si eso sucede, obtendremos más información sobre lo que ha podido salir mal.

11 comentarios:

  1. Funciona perfecto!
    Gracias por la solución!

    ResponderEliminar
  2. Buenas!!

    Por más que pruebo no consigo. Primero probé montando yo los archivos siguiendo sus indicaciones y luego cogiendo directamente los vuestro y nada. No recibo ningún email, ni siquiera de error, que creo que es lo que se intenta al "abortar" Mail::Send con lo de null,null,null,null,_PS_MAIL_DIR_,true.

    A ver si me podéis echar una mano.

    Muchas gracias!!

    ResponderEliminar
    Respuestas
    1. Hola,
      ¿Has borrado el archivo prestashop/cache/class_index.php?

      Eliminar
  3. Hola, he subido los archivos a sus directorios y no funciona, por favor diganme como solucionarlo, prestashop 1.5.5

    ResponderEliminar
  4. Hola ,
    a mi lo que me ocurre es que prestashop 1.6 no envia mails al hacer un pedido ni al cliente ni al adminitrador, que puedo hacer?

    ResponderEliminar
    Respuestas
    1. Hola,
      Verifica que tengas instalado el módulo "Alertas por email", y que tengas activada la opción "Nuevo pedido".

      Eliminar
  5. He realizado los pasos como los explica en el tuto, y me funciona correctamente, Muchas Gracias.

    ResponderEliminar
  6. mira que tenia dudas...
    Te quiero tio, te quiero.

    ResponderEliminar