Para crear referencias automáticas para los productos en prestashop podemos utilizar el uso de triggers o disparadores de mysql. Un disparador o trigger es un objeto con nombre dentro de una base de datos el cual se asocia con una tabla y se activa cuando ocurre en ésta un evento en particular. En esta ocasion le indicaremos que se active antes de que se guarde una consulta.
Lo que haremos será que si el campo referencia se deja vacio cuando se crea el producto o combinacion, automaticamente se le asignará uno y si queremos crear un producto o combinacion con otra referencia o la misma que otro solo tendremos que introducirla. Esta opcion no es muy común usarla en mysql principalmente porque se añadio en la versión 5.0.2, se puede crear una consulta para crearlos pero aquí lo vamos a hacer por la interfaz de mysql. Debemos crear dos disparadores, uno para los productos y otro para las combinaciones porque se guardan en diferentes tablas. Así que vamos a ello.
Una vez en mysql pulsamos en nuestra base de datos y arriba a la derecha veremos que pone triggers en ingles o disparadores en español:
Una vez aquí tendremos la opcion de crear un nuevo disparador.
Al pulsar se nos abrirá una ventana en la que debemos introducir la información para el disparador.
En nombre le ponemos un nombre al disparador, es indiferente cual escojamos, yo por ejemplo le puse referencia_producto.
En tabla escogemos la tabla de productos en mi caso ps_product pero el ps_ será el prefijo que tengais establecido.
En tiempo debemos escoger BEFORE
En evento INSERT
En definicion pondremos este codigo pero cambiamos PREFIX por el prefijo que queramos, por lo general se pone una abreviacion del nombre de la tienda.
IF NEW.reference = '' THEN SET NEW.reference = concat('PREFIX',conv(UUID(),20,26));END IF
Esto nos genera una referencia de este tipo:
PREFIXI4129CG
Explico:
PREFIX = Prefijo
I4129CG = codigo alfanumérico generado aleatoriamente
En definidor podeis dejarlo en blanco, se asigna automaticamente.
Os quedará algo así.
Damos en continuar y se creará el disparador, a partir de ahora cuando dejemos un producto sin referencia se le asignara una automaticamente para ese producto, pero si le ponemos una, se le quedará la que le pongamos.
Personalmente me gusta tener más control sobre algunas cosas en este caso me gusta usar el id del producto, utilizandolo me garantizo que esa referencia será única aunque tenga millones de productos, lo malo es que los id son valores numeros y no alfanumeros por lo que si tenemos muchos productos a la larga será una referencia más larga. Para que se genere una referencia del tipo PREFIJO + ID del producto sería así:
IF NEW.reference = '' THEN SET NEW.reference = concat('PREFIX',(SELECT id_product FROM ps_product ORDER BY id_product DESC LIMIT 1) + 1);END IF
Una imagen de muestra:
Esto nos genera una referencia de este tipo: PREFIX35
PREFIX= prefijo
35 = Id del producto
Para las combinaciones haremos algo similar, creamos nuevo disparador y completamos, en mi caso el nombre es referencia_combinacion.
Nombre: referencia_combinacion
Tabla: ps_product_attribute
Tiempo: BEFORE
Evento: INSERT
Definicion:
IF NEW.reference = '' THEN SET NEW.reference = concat('PREFIX',(concat (NEW.id_product,'CO')),conv(UUID(),20,26));END IF
La imagen de como tiene que estar:
De este modo generará una referencia en las combinaciones como: PREFIX21CO2716KN8G
Explico:
PREFIX = prefijo
21 = id del producto de la combinacion
CO = co de combinacion
2716KN8G = Parte alfanumerica creada al azar.
La verdad que se hace bastante larga, lo mas corta que se me ocurrio y que fuera única sería utilizando los ids del producto y de la combinacion, no se puede usar solo el de la combinacion porque al ser diferentes tablas se daría el caso que algunos productos tendrían la misma referencia que algunas combinaciones. Lo que pense fue: PREFIX+Idproducto+ un separador+idcombinacion, sería así:
IF NEW.reference = '' THEN SET NEW.reference = concat('PREFIX',(concat (NEW.id_product,'C',(SELECT id_product_attribute FROM ps_product_attribute ORDER BY id_product_attribute DESC LIMIT 1) + 1)));END IF;
Lo que hice para obtener el id de la combinacion es crear una consulta que nos mostraría los id de todos los productos, le decimos que los muestre con orden descendente y que solo muestre 1 y luego le sumamos 1. Si teneis el prefijo por defecto en mysql no tendreis problema pero sino debeis cambiar el ps_ por vuestro prefijo.
Nos quedaría una referencia de este tipo: PREFIX19C91
PREFIX = prefijo
19 = id de producto
C = c de combinacion, lo puse como separador de las ids para identificarlar a simple vista las ids, se podría poner un guion, lo que se quiera o eliminarlo, ya vosotros trasteais con la consulta.
91 = Id de la combinacion
Esta referencia se podría dar igual en una referencia del producto del primer ejemplo que puse por lo que si se decide usar la id se debe usar tanto en la referencia del producto como en la referencia de la combinacion y sino pues se puede usar el otro método pero en las dos tablas o con UUID o con ID.
s las tablas que prestashop le indique y no solo en la que le indicamos nosotros, es decir al guardar la segunda vez es como si la metieramos manualmente. Digo esto porque el trigger solo afecta a la tabla que nosotros le indicamos, digamos que la principal de los productos y las combinaciones, pero es posible que prestashop guarde esa referencia tambien en otra tablas. Guardar el producto dos veces para evitar cualquier tipo de problema eso es lo que quiero decir. Recuerdo que para facilitar las cosas esta el boton de guardar y permacener.
Y ya está, con estos ejemplos creo que ya cada uno puede crear las referencias del tipo que quiera. Espero que os haya gustado y si es así dame unos puntos y comenta. Gracias.
Estos ejemplo han sido comprobados y realizados bajo prestashop 1.6.0.9.
Usenlo bajo su responsibilidad, no me hago responsable de cualquier problema que tengan por instalar y/o usar esta modificacion o por su mal uso.
Muchas gracias por el aporte, me ha resultado muy util.