Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Prestashop (1.6) – Añadiendo campos nuevos a nuestra tienda

Estos días, y para una nueva tienda que me han pedido que prepare, he andado averiguando la forma de añadir campos nuevos a la tabla de productos, y luego poderlos gestionar, y, aunque la solución no es demasiado trivial, no veo que sea inalcanzable para todos aquellos que estén dispuestos a programar un poquito….

El problema:

Los productos que se quieren vender están compuestos de unidades mas pequeñas, y se quieren mostrar en las descripciones, pero de forma independiente; esto es, aparte de la descripción se quiere que aparezca

Paquete de 6 botellas de 33 cl.

Por ejemplo, y eso seria solo escribirlo en la descripción, pero…hay otra tienda que vende la unidad individualmente, y en esa otra, ha de aparecer:

botellas de 33 cl.

Esto nos obligaría a repasar todas las descripciones en la segunda tienda… y en todos los idiomas

Ante esa disyuntiva he pensado resolverlo de la siguiente manera

  • Paquete de – puede ser un literal con soporte multi-idioma que añadiré en los «tpl» que necesite
  • 6 es el numero de unidades de venta que ya se indica en productosPrestashop-unidades de venta
  • botellas de 33 cl – es el campo que añadiré a la tabla de productos, para que se pueda especificar en cada idioma.

Modificando la Base de Datos de Prestashop.

Ni que decir tiene la importancia de tener una copia de seguridad actualizada de toda la tienda, incluida la BD, para poder solucionar cualquier pequeño «accidente» que tengamos, y tras esa precaución, vamos a añadir este campo (esta columna), a nuestra tabla.

Si no necesitamos el soporte multi-idioma, añadimos el campo en

[PREFIJO]_product

Si queremos poder entrar el campo en cada uno de los idiomas, se lo añadimos a la tabla

[PREFIJO]_product_lang

Recordad que [PREFIJO] por defecto es «ps», pero se puede ajustar en las instalaciones….

Para esta parte, deberéis utilizar la herramienta que tengáis en vuestra web para la administración de la BD; por ejemplo, phpMyAdmin.

SI preferís hacerlo con SQL, la orden podría ser algo como:

ALTER TABLE `ps_product` ADD `contenido` VARCHAR( 255 ) NULL ;

o

ALTER TABLE `ps_product_lang` ADD `contenido` VARCHAR( 255 ) NULL ;

para multi-idioma

Así, añadiríamos a la tabla correspondiente una columna con nombre «contenido» que podrá guardar cadenas de hasta 255 caracteres

Modificando el objeto Product

Nuestro siguiente paso, sera modificar el objeto que representa al producto en nuestra tienda, y que es la clase «Product.

Aunque el fichero que incorpora la distribución esta en classes/Product.php, lo correcto, es no modificar dicha clase, sino, extenderla.

Cuando extendemos una clase, disponemos te todas las características de la original, y podemos añadir nuevas….Perfecto.

Las ultimas versiones de Prestashop, proveen una carpeta para que guardemos todos los módulos que deseamos extender; esa carpeta es «override» en donde podemos dejar nuestros objetos expandidos con la misma estructura de carpetas donde este el original; cono el objeto que vamos a extender esta en «classes/Producto.php«, nuestro modulo lo creamos en override/classes/Producto.php

De forma que  en override/classes/ creamos un fichero llamado «Product.php«, y dentro escribimos:

Prestashop- Extendiendo la clase Product

  1. Extendemos la clase PruductCore con nuestra propia clase Product
  2. Definimos los nuevos campos; en este caso solo uno que se llama «contenido»
  3. Sobrecargamos el constructor de la clase padre para describir nuestro campo
  4. Añadimos la definición de «contenido» a la tabla de campos, en donde le indicamos que es una String (self::TYPE_STRING) de 255 caracteres, que es multi-idioma y que no es obligatoria.
  5. Llamamos al constructor de la clase extendida, para que haga todo lo previsto en ella.

Para los Multi-idioma:

Si nuestro campo añadido es multi-idioma, y lo hemos añadido a la tabla [PREFIJO]_product_lang, para que se vea en el Front-office, debemos hacer que se lea, ya que no lo incluye automáticamente, y para eso, debemos extender otra clase; concretamente Categorías (Category)

Esta vez vamos a utilizar otra técnica; copiamos el fichero «classes/Category.php» a «override/classes/Category.php«

En el fichero copiado (EN EL QUE ESTA EN OVERRIDE/….) cambiamos Prestashop-Categoria

por

Prestashop-Extend Categoria

y borramos el resto del codigo, dejando solo la funcion  enterita

Prestashop-getProductsdentro de la función, localizamos la SELECT que lee los productos de la categoría, y que tiene un aspecto como este

Prestashop-getProductsy añadimos que lea también nuestro nuevo campo

Incluyendo linea de lectura del nuevo campo (Prestashop)

Yo lo he incluido al final de la segunda linea, aunque el orden no tiene mas importancia, siempre que esté antes de la palabra «FROM».

Fijaros que al nombre de la columna creada, viene antecedido de «pl.» que es la forma como nos referimos en esta sentencia a la tabla «ps_product_lang«

Y ya tenemos nuestro nuevo campo incluido en el entorno Prestashop

Recordad: tenéis que borrar el fichero cache/class_index.php para que estas modificaciones se tengan en cuenta

Con lo que llevamos hecho, nuestro nuevo campo, ya esta en la BD, y su utilización en la parte externa es algo tan sencillo como escribir

{product.contenido}

Sin embargo, si queremos poder cargarlo y modificarlo desde nuestra zona de Administración, debemos trabajar un poco mas.

En nuestro siguiente entrada añadiremos el nuevo campo para que pueda ser administrado en productos

 

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 34.227.112.145
Proxy: 34.227.112.145
Remote host: ec2-34-227-112-145.compute-1.amazonaws.com
Remote port: 35782
** 34.227.112.145, 172.70.38.224