Jump to content
moraira

APORTE Mejorar mailalerts

Recommended Posts

Bueno compañeros, hoy he visto que teníamos versión nueva de mailalerts o alertas por correo, este útil modulo aun tiene algún fallo con lo que me he puesto a ello.

 

TIENE UN FALLO que aunque sencillo genera mal uso para el cliente, y por tanto un fallo en nuestra tienda que puede tumbar una posible venta.

 

El problema es que por defecto tenemos su@email.com (o your@email.com) por tanto si el cliente pulsa "Indicarme cuando esté disponible" registrara un aviso para "su@email.com" y ya la ha liao, puede refrescar y volver a probar pero no queda bien, además si pulsa dos veces le aparecera el aviso "Usted ya tiene una alerta para este producto" y eso sin haber escrito nada.

 

Para ello vamos a hacer una sencilla modificación que nos permite "leer" e interpretar el email que tenemos en la casilla para que actue como debe.

 

Vamos a tocar simplemente el fichero www.mitienda.com/modules/mailalerts/views/templates/hook/product.tpl

 

por si utilizamos multi-idioma vamos a leer el email de la @ en adelante, y si en la casilla pone @email.com entonces consideramos que es un email erroneo (dejo tambien el codigo que lee el "su" por si alquien lo necesita.)

 

 

 

En el fichero de antes entramos y cambiamos esta funcion addNotification. Esto:

function  addNotification() {
	$.ajax({
		type: 'POST',
		url: "{/literal}{$link->getModuleLink('mailalerts', 'actions', ['process' => 'add'])}{literal}",
		data: 'id_product={/literal}{$id_product}{literal}&id_product_attribute='+$('#idCombination').val()+'&customer_email='+$('#oos_customer_email').val()+'',
		success: function (msg) {
			if (msg == '1') {
				$('#mailalert_link').hide();
				$('#oos_customer_email').hide();
				$('#oos_customer_email_result').html("{/literal}{l s='Request notification registered' mod='mailalerts'}{literal}");
				$('#oos_customer_email_result').css('color', 'green').show();
			}
			else if (msg == '2' ) {
				$('#oos_customer_email_result').html("{/literal}{l s='You already have an alert for this product' mod='mailalerts'}{literal}");
				$('#oos_customer_email_result').css('color', 'red').show();
			} else {
				$('#oos_customer_email_result').html("{/literal}{l s='Your e-mail address is invalid' mod='mailalerts'}{literal}");
				$('#oos_customer_email_result').css('color', 'red').show();
			}
		}
	});
	return false;
}

lo cambiamos por:

function  addNotification() {
	
	var email = document.getElementById('oos_customer_email').value;
	var hasta = email.lastIndexOf("@");
	var primera = email.substring(0,hasta);
	var segunda = email.substring(hasta + 1, email.length);
	if (segunda == 'email.com') {
		$('#oos_customer_email_result').html("{/literal}{l s='Your e-mail address is invalid' mod='mailalerts'}{literal}");
		$('#oos_customer_email_result').css('color', 'red').show();
		$('#oos_customer_email').css('color', 'red').show();
		return false;
	}  
	
	$.ajax({
		type: 'POST',
		url: "{/literal}{$link->getModuleLink('mailalerts', 'actions', ['process' => 'add'])}{literal}",
		data: 'id_product={/literal}{$id_product}{literal}&id_product_attribute='+$('#idCombination').val()+'&customer_email='+$('#oos_customer_email').val()+'',
		success: function (msg) {
			if (msg == '1') {
				$('#mailalert_link').hide();
				$('#oos_customer_email').hide();
				$('#oos_customer_email_result').html("{/literal}{l s='Request notification registered' mod='mailalerts'}{literal}");
				$('#oos_customer_email_result').css('color', 'green').show();
			}
			else if (msg == '2' ) {
				$('#oos_customer_email_result').html("{/literal}{l s='You already have an alert for this product' mod='mailalerts'}{literal}");
				$('#oos_customer_email_result').css('color', 'red').show();
			} else {
				$('#oos_customer_email_result').html("{/literal}{l s='Your e-mail address is invalid' mod='mailalerts'}{literal}");
				$('#oos_customer_email_result').css('color', 'red').show();
			}
		}
	});
	return false;
}

En realidad solo hemos añadido esto:

	var email = document.getElementById('oos_customer_email').value;
	var hasta = email.lastIndexOf("@");
	var primera = email.substring(0,hasta);
	var segunda = email.substring(hasta + 1, email.length);
	if (segunda == 'email.com') {
		$('#oos_customer_email_result').html("{/literal}{l s='Your e-mail address is invalid' mod='mailalerts'}{literal}");
		$('#oos_customer_email_result').css('color', 'red').show();
		$('#oos_customer_email').css('color', 'red').show();
		return false;
	} 

Es decir, obtenemos el EMAIL, le decimos donde esta el limite con HASTA, y luego calculamos la PRIMERA parte antes de la @ (esto no es necesario para para que lo tengáis) y calculamos la SEGUNDA parte, que es la que nos interesa, si es EMAIL.COM entonces lanzamos el mismo mensaje de email incorrecto (así no hay nuevas traduciones) le damos color rojo, tambien ponemos el campo email en rojo y le decimos a la función que se pare

 

Para que quede niquelado yo también ampliaría la función CLEARTEXT con estas dos últimas lineas

function clearText() {
	if ($('#oos_customer_email').val() == '{/literal}{l s='your@email.com' mod='mailalerts'}{literal}')
		$('#oos_customer_email').val('');
		$('#oos_customer_email').css('color', 'black').show();
		$('#oos_customer_email_result').hide();
}

Esta función es la que vacía el campo email al hacer click sobre el, además de vaciarlo le decimos que el color del texto sea negro (en la modificación de antes lo hemos puedo rojo si es erróneo) y ocultamos el mensaje de error, ya que si el cliente va ha escribir su email era porque estaba mal escrito.

 

Borramos cache, forzamos compilacion y ya tenemos modulo nuevo

Edited by moraira
  • Like 3

Share this post


Link to post
Share on other sites

El equipo de prestashop debería tener en cuenta tu aportación, si es verdad que las notificaciones de correo se llenan de "su@email.com" y prácticamente deja inútil esta función.

 

Yo lo solvente cambiando la traducción de "su@email.com" a "inserte su dirección de correo" .

 

Tengo el archivo con la nueva traducción en el template personaliza y asi no me tengo que preocupar si con una actualización me vuelve a poner el texto no deseado.

 

Gracias

Share this post


Link to post
Share on other sites

Gracias por el aporte!

 

En el caso que el usuario esté logueado no se puede añadir el correo del usuario y esta validación no sería necesaria.

 

He realizado alguna prueba y no queda registrado. He visto que el js no continúa a partir de la línea:

	var hasta = email.lastIndexOf("@");

Para solucionarlo he añadido una condición antes del nuevo código para comprobar si el usuario está logueado y el código queda así:

	{/literal}{if (!logged)}{literal}
	$('#oos_customer_email_result').hide();
	var email = document.getElementById('oos_customer_email').value;
	var hasta = email.lastIndexOf("@");
	var primera = email.substring(0,hasta);
	var segunda = email.substring(hasta + 1, email.length);
	if (segunda == 'email.com') {
		$('#oos_customer_email_result').html("{/literal}{l s='Your e-mail address is invalid' mod='mailalerts'}{literal}");
		$('#oos_customer_email_result').css('color', 'red').show();
		$('#oos_customer_email').css('color', 'red').show();
		return false;
	} 
	{/literal}{/if}{literal}

Es el mismo código que el anterior pero con {/literal}{if (!logged)}{literal} delante y {/literal}{/if}{literal} detrás.

 

Espero que os funcione.

 

Un saludo

Share this post


Link to post
Share on other sites

Hola y para poder refrescar el formulario al actualizar los atributos, ¿sabéis como va? Si entro en un producto y hay talla no me muestra el formulario y si selecciono una talla que no hay producto me sigue sin salir.

Saludos y gracias

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More