Productos bajo pedido en PrestaShop
PrestaShop, uno de los gestores de tiendas online más utilizados, cuenta con multitud de módulos, que nos ayudan a personalizar y ampliar nuestra tienda virtual con el fin de adaptarla a nuestro negocio y ofrecer mayores posibilidades a nuestros clientes. Uno de los más utilizados es el de Alertas por correo (mailalerts).
Módulo mailalerts: Alertas por Correo
El módulo mailalerts permite configurar PrestaShop para que notifique a los responsables de la tienda (a través de una o de varias direcciones de correo electrónico) cuando hay un nuevo pedido, cuando hay rotura de stock, etc..
Otra opción interesante del módulo, es la posibilidad que ofrece a los posibles clientes, cuando han llegado a un producto de nuestra tienda del cual no hay stock, de poder solicitar que se le avise cuando vuelva a estar disponible, bien dejando su correo electrónico (si no tiene iniciada una sesión) o simplemente haciendo clic en un enlace (si ha iniciado la sesión). El problema es que los responsables de la tienda no tienen forma de saber si alguien está interesado en estos productos sin stock, lo que limita la capacidad de actuación y puede desembocar en la pérdida de la venta y del cliente.
Por eso, es muy interesante realizar unas pequeñas modificaciones en el módulo, ampliando sus capacidades, lo que nos permitirá saber cuando un cliente está interesado en un producto sin stock o incluso ofrecer la posibilidad de solicitar productos bajo pedido en Prestashop.
Estos son los cambios a realizar en el código del módulo mailalerts, para que envíe un correo electrónico cuando un cliente solicita un producto bajo demanda en Prestashop. [Hay que recordar que si actualizamos el módulo tras los cambio, éstos se perderán.]
Añadir la siguiente función a la clase MailAlerts (fichero mailalerts.php):
public function sendEmailProductOutOfStock($id_customer, $id_product, $id_product_attribute, $id_shop=null, $id_lang=null, $guest_email=null) { $context = Context::getContext(); if (is_null($id_shop)) $id_shop = (int)$context->shop->id; if (is_null($id_lang)) $id_lang = (int)$context->language->id; $customer = new Customer($id_customer); $customer_email = $customer->email; $customer_firstname = $customer->firstname; $customer_lastname = $customer->lastname; $guest_email = pSQL($guest_email); $id_customer = (int)$id_customer; $customer_email = pSQL($customer_email); if ($id_customer==0) $customer_email = $guest_email; $product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang); if (empty($this->_merchant_mails))/* Algunas veces no guarda en $this->_merchant_mails los correos, si es así, los recuperamos de la configuración del módulo*/ $mails = str_replace(',', self::__MA_MAIL_DELIMITOR__, strval(Configuration::get('MA_MERCHANT_MAILS'))); else $mails = $this->_merchant_mails; $template_vars = array( '{id_customer}' => $id_customer, '{customer_firstname}' => $customer_firstname, '{customer_lastname}' => $customer_lastname, '{customer_email}' => $customer_email, '{product}' => $product_name ); if (!empty($mails)){ $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $mails); foreach ($merchant_mails as $merchant_mail) { Mail::Send( $id_lang, 'new_request_availability', sprintf(Mail::l('New request for product availability: %s', $id_lang), $product_name), $template_vars, $merchant_mail, null, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), null, null, dirname(__FILE__).'/mails/', null, $id_shop ); } } else{ Mail::Send( $id_lang, 'new_request_availability', sprintf(Mail::l('New request for product availability: %s', $id_lang), $product_name), $template_vars, strval(Configuration::get('PS_SHOP_EMAIL')), null, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), null, null, dirname(__FILE__).'/mails/', null, $id_shop ); } }
Modificar la función processAdd de la clase MailalertsActionsModuleFrontController (fichero mailalerts/controllers/front/actions.php), añadiendo antes de terminar la función y devolver 1 indicando que se ha ejecutado correctamente (dentro de la condición if ($mail_alert->add() !== false)
), la llamada a la función creada anteriormente:
MailAlerts::sendEmailProductOutOfStock($id_customer, $id_product, $id_product_attribute, $id_shop, null, $customer_email);
Por último sólo quedan por crear las plantillas de los correos en el subdirectorio del idioma que queramos dentro del directorio mails (del módulo), como por ejemplo:
new_request_availability.html
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Aviso de solicitud de disponibilidad de producto</pre> <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> <tbody> <tr> <td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" alt="{shop_name}" src="{shop_logo}" /></a></td> </tr> <tr> <td></td> </tr> <tr> <td style="background-color: #178a28; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Han solicitado un aviso de disponibilidad para el producto {product}.</td> </tr> <tr> <td></td> </tr> <tr> <td align="left"> Id del cliente que lo ha solicitado (si estaba registrado en la tienda con el mismo correo o si había iniciado sesión): {id_customer} Nombre del cliente (si estaba registrado en la tienda con el mismo correo o si había iniciado sesión): {customer_firstname} Apellido(s) del cliente (si estaba registrado en la tienda con el mismo correo o si había iniciado sesión): {customer_lastname} Correo electrónico del cliente: {customer_email}</td> </tr> <tr> <td></td> </tr> <tr> <td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #178a28; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://frabits.com/">Frabits C.B.</a></td> </tr> </tbody> </table> <pre>
new_request_availability.txt
Hola, Han solicitado un aviso de disponibilidad para el producto {product}. Id del cliente que lo ha solicitado (si estaba registrado en la tienda con el mismo correo o si había iniciado sesión): {id_customer} Nombre del cliente (si estaba registrado en la tienda con el mismo correo o si había iniciado sesión): {customer_firstname} Apellido(s) del cliente (si estaba registrado en la tienda con el mismo correo o si había iniciado sesión): {customer_lastname} Correo electrónico del cliente: {customer_email} {shop_url} desarrollado por Frabits C.B.
Los cambios en el módulo han sido probadores correctamente en las versiones:
- mailalerts (Alertas por correo): 3.2.9
- PrestaShop™: 1.5.4.1 (seguramente también en toda la rama de 1.5.x)
Hola, muchas gracias por vuestro aporte! es un código muy completo!
Lo único que lo he probado para Prestashop 1.6 y mailalerts 3.6.0 pero no recibo ningún correo electrónico, las demás funciones de este módulo sí que funcionan y recibo los correos, pero justo en esta función no se envía el correo electrónico cuando un cliente envía una petición de alerta cuando el producto vuelva a estar disponible.
He seguido los pasos: he añadido la función a la clase MailAlerts, he modificado el archivo actions.php tal cual dentro del if, y he añadido los dos archivos para el correo en el lenguaje español (al que está configurada la tienda).
Por favor, ¿me podríais ayudar a resolverlo?
Muchas gracias de antemano.
Abrazos,
Esperanza
Hola Esperanza,
¿el problema es que no llega un correo a tu lista de mailalerts cuando un cliente solicita que se le avise de un producto?, ¿o que al cliente no le llega un correo cuando vuelve a haber stock del producto?
Esta modificación sólo es para que avise a la lista de mailalerts cuando algún cliente solicita un aviso.
Prueba a ver los registros (logs) de tu servidor web, por si estuviera creando un correo inválido, o a activar el modo debug en PrestaShop, para ver los valores que se les pasan a las variables en la plantilla, y a los módulos. Es difícil poder averiguar el error sin revisar el proceso y el código.
Saludos
Hola Clemente, ¿sabes si alguien lo ha probado con Prestashop 1.6.x? y que le funcione?
Hola Emilio,
Nosotros lo hicimos para PrestaShop 1.5.x, pero no sabemos si funcionará en 1.6.x. No obstante, no es complicado adaptarlo a la versión 1.6. Si estás interesado, y no lo logras, contacta con nosotros.
Saludos
Hola Clemente:
No lo logro, podríamos hablar y llegar a algún acuerdo?’
Saludos
Hola Emilio,
Tal y como hemos comentado, envíanos un correo con la versión de tu PrestaShop y estimamos el coste de la personalización.
Saludos
Buenas tardes,
Yo tengo un problema y es que directamente al poner el correo electrónico no realiza ninguna acción en la pestaña “avisarme cuando esté disponible”. Los correos se reciben sin problemas normalmente, solo pasa con este módulo.
¿Sabes donde puede estar el problema?
Un saludo
Hola Daniel,
pueden ser muchas cosas, problemas con el módulo mail, mala configuración de correo, …
¿Has revisado los logs del sistema para ver si hay envíos que van a null?
Sin poder ver o revisar el sistema, no podemos hacer mucho más que indicarte que revises los logs en busca de indicios del problema. También puedes poner PrestaShop en modo debug para ver los errores y las llamadas.
Saludos
Hola, buen aporte pero no funciona al menos en ps 1.6 (mailalerts 3.6).
He seguido los pasos y pese a que sí me llega a notificar, al cliente le aparece cuando introduce su email el mensaje de “su dirección es inválida) … 🙁
Alguna idea de qué puede estar pasando? En los logs no hay nada
Hola Kenneth,
Tal y como se comenta en la entrada, esto está hecho y probado en PrestaShop 1.5.4.1, por lo que seguramente funcione en toda la rama de PrestaShop 1.5.
Esta modificación no ha sido probada en ninguna versión de la rama 1.6, pero no debería ser muy difícil adaptarla. Habría que revisar las llamadas, ya que tal vez alguna haya sido renombrada o eliminada. Revisando la documentación para desarrolladores de PrestaShop 1.6 podría encontrar más información.
Si no pudiera hacerlo, y tuviera interés en que lo adaptáramos nosotros a su versión de PrestaShop, le recordamos que puede contactar con nosotros en la sección de contacto para contratar nuestros servicios y que podamos realizarle estas modificaciones.
Saludos
Hola Daniel, mi problema es que desistale el modulo porque realmente no hacia nada, y ahora quiero volver a instalarlo y hace como que esta instalado pero no me aparece en el listado como antes, por el FTP si puedo ver la carpeta y todo, pero en el listado del Back-office no, sabrias decirme el problema de porque no me aparece?, gracias un saludo.
Hola,
Deberías revisar la BBDD, y borrar los rastros que queden del módulo, así como los ficheros.
Saludos
Buenos dias Clemente, de acuerdo echare un vistazo en la BBDD a ver que encuentro, gracias un saludo.
Me sigue sin aparecer en la lista de los modulos, borre desde el FTP , todo lo que habia de este modulo y en la base de datos tambien y volvi a instalarlo y me dice que se descargo correctamente, pero me sigue sin aparecer, sin embargo tengo configurado con el Smtp el servidor de correo, y me funciona correctamente, sin problemas, pero el modulo sigue sin aparecer
Hola,
Si sigue sin aparecer, o es un problema de los ficheros (aunque estén, puede ser un problema de permisos), o un problema de BBDD (han quedado registros en tablas que no deberían estar).
Saludos
Buenas tardes Clemente, al final pude configurar el modulo de myalert la version 3.60 y lo tengo funcionando, ahora estoy investigando a ver como puedo cambiar el texto que aparece cuando al cliente le llega la notificacion , muchas gracias por todo un saludo.
SE J*DI* EL ASUNTO XD
Como podría ponerse que el remitente del envió sea el cliente {customer_email}
Hola,
sólo debes cambiar la variable
$merchant_mail
por la que quieras.Saludos
Pero de que forma por que lo probe y no funciona
Hola Pedro,
¿Qué te aparece en los logs?
Saludos
La cuestión es que tiene que llegar un aviso a la tienda y como remitente el cliente
Hola Pedro,
el remitente no es el cliente, el remitente es el correo que tengas configurado en PrestaShop para el envío de correos.
Saludos