El funcionamiento corriente de Prestashop sigue mostrando los productos del catálogo aunque no queden unidades de los mismos. Normalmente muestra un mensaje del tipo «Sin unidades» o «Fuera de stock». Incluso te deja configurar desde el panel de administración si quieres que se pueda seguir comprando o no. También puedes instalar un módulo para que el cliente pueda dejar su correo para ser avisado cuando haya unidades.
¿Pero qué pasa si queremos que los productos fuera de stock no se muestren al cliente? Esto puede ser necesario si vendemos productos únicos o de segunda mano y solo tenemos una unidad de cada uno de ellos. No queremos que los productos se borren porque queremos tener un registro de ellos y permitir, por ejemplo, su devolución. Pero si que queremos que pasen a un estado «inactivo» automáticamente para que no se muestren ni en la categoría a la que pertenecen, ni en «productos destacados», ni en «novedades», etc.
He visto gente que lo intenta solucionar editando el product-list.tpl, pero no me parece la mejor solución porque, aunque sólo muestres los productos en stock, siguen teniendo en cuenta los productos fuera de stock para contabilizar el total de productos a listar. Por tanto, si hay 10 productos y 3 fuera de stock, te pondrá 10 de 10 productos, aunque sólo muestre 7.
También he visto que otras personas modifican la clase Category.php, modificando la consulta a la base de datos del método public function getProducts. Modifican la consulta para que seleccione sólo los productos en stock. Está solución es válida para los listados de productos en las categorías, pero por ejemplo no afecta a la página de novedades u a otros módulos como «productos destacados».
Por tanto la solución que más me convence es la de crear un trigger o disparador en la base de datos, de forma que cada vez que se actualicen las unidades de un producto, si son >0, se active el producto, pero si son = 0 se desactive el producto. Así, el producto seguirá existiendo en el panel de administración, pero nunca aparecerá en la parte pública de la página, en ninguna sección ni en ningún módulo.
– Para activar o desactivar un producto hay que cambiar el campo «active» de la tabla ps_product_shop a 1 o a 0 respectivamente.
– La información sobre el stock de un producto se almacena en la tabla ps_stock_available.
Por tanto, queremos crear un trigger que cambie la visibilidad de un producto (active=0) cuando la cantidad de un producto baje a 0 y que nos vuelva a activar el producto (active=1) cuando la cantidad vuelva a ser superior a 0 (por ejemplo si se realiza la devolución del producto). Un trigger es un disparador que se asocia a una tabla y que se hace saltar cada vez que se borra, actualiza o añade algún registro en esa tabla. Nosotros, como ya hemos dicho, queremos crear un trigger que se dispare cada vez que se actualice algo en la tabla ps_stock_available y que edite el campo active de la tabla ps_product_shop en consecuencia.
Para ello, en phpMyAdmin, iremos a la tabla ps_stock_available y haremos click sobre el elemento del menú «Disparadores» (si la interfaz está en español) o «Triggers» (si la interfaz está en inglés). En esa sección, daremos a «Agregar Disparador» y rellenaremos el formulario como se muestra en la imagen.
Y eso es todo. También se puede crear este trigger con una consulta SQL:
CREATE TRIGGER `change_active_after_update` AFTER UPDATE ON `ps_stock_available`
FOR EACH ROW
BEGIN
UPDATE ps_product_shop SET active=0 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity=0);
UPDATE ps_product_shop SET active=1 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity>0);
END
Gracias por la data. Muy útil.
Hola felicidades por el tutorial. Es lo que estoy buscando pero a mi no me funciona.
Cuando pego tu código en la consulta SQL me da este erro:
#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4
Seguramente es un fallo mio pero soy novato y te agradecería tu ayuda. Gracias!!
Mira, para que no te dé ese fallo, o lo haces a través de la pestaña de "disparadores" o "triggers" o si, lo vas a hacer como una consulta SQL, pon la siguiente línea antes del código que estás poniendo:
DELIMITER |
Buenas, he creado el trigger y todo correcto, lo unico que en la base de datos de back office de prestashop siguen saliendo articulos con stock 0 y activados. Tengo que hacer algo para "cargar" el trigger?? Gracias.
Carlos Alcaraz Tienes que realizar algun cambio en la base de datos para que el trigger se dispare, puedes hacerlo comprado algo en tu tienda y funcionara..
Please, creé el Tigger, pero ahora necesito eliminarlo, agradecería sequéncia exacta, he probado con:
delimiter //
DELETE TRIGGER `change_active_after_update` AFTER UPDATE ON `ps_stock_available`
FOR EACH ROW
BEGIN
UPDATE ps_product_shop SET active=0 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity=0);
UPDATE ps_product_shop SET active=1 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity>0);
END
Buenas noches.
No he podido ejecutar el comando SQL para crear esta instrucción, cabe destacar que el hosting donde quiero realizar la tarea no tiene la pestaña triggle en las opciones de phpmyadmin, además el problema cuando ejecuto la consulta lanza error.
He probado colocandolo así y tampoco:
DELIMITER | CREATE TRIGGER `change_active_after_update` AFTER UPDATE ON `ps_stock_available`
FOR EACH ROW
BEGIN
UPDATE ps_product_shop SET active=0 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity=0);
UPDATE ps_product_shop SET active=1 WHERE id_product IN (SELECT id_product FROM ps_stock_available WHERE quantity>0);
END
Hay alguna consulta sql para poner todos los productos visibles en la tienda? no me di cuenta al introducir y unos cuantos están con visibilidad: OCULTO, gracias :)
Buenos días.
Se puede dar el caso, de que haya artículos con stock negativo y el trigger no los contemplará.
BEGIN
UPDATE ps_product_shop SET active=0 WHERE id_product in (SELECT id_product FROM ps_stock_available WHERE quantity0);
END
Además, en mi caso, trabajo con importaciones de artículos y el mismo disparador, se ha creado after INSERT y after UPDATE.
¡Gracias!