Como añadir campos extra a los productos de Prestashop 1.5.x

En este artículo vamos a aprender como añadir campos extras a los productos de Prestashop 1.5.x.

Es requerido tener conocimientos de programación orientada a objetos para llevar a cabo la tarea de añadir un nuevo campo personalizado, en este caso, a los productos del prestashp 1.5.x.

Lo primero que deberías hacer es sobreescribir la clase product añadiéndole el nuevo campo. Existen infinidad de campos extra para añadir al producto pero en el caso del ejemplo que vamos a ilustrar vamos a tratar de añadir un nuevo campo que va a representar el plazo de entrega del producto.

Necesitaremos incorporar la nueva variable de la clase:

public $delivery;

Y seguidamente la definición:

'delivery' => array('type' => self::TYPE_STRING, 'validate' => 'isReference', 'size' => 64),

En la definición le estamos indicando que queremos una variable de tipo cadena de longitud 64 caracteres y que además se valida igual que el campo referencia, mirando su longitud.

Todo esto que comento lo deberemos añadir a la clase que sobreescribe la clase Product del core de Prestashop. Lo puedes localizar en /override/classes/Product.php y donde tan solo deberás añadir el siguiente contenido:

class Product extends ProductCore
{
	public $delivery;
 
        public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
        {
            parent::$definition['fields']['delivery'] = array('type' => self::TYPE_STRING, 'validate' => 'isReference', 'size' => 64);
            parent::__construct($id_product, $full, $id_lang, $id_shop);
        }  
}

Donde tan solo estamos añadiendo la nueva variable de la clase y dando su definición. Guardamos y subimos al servidor.

Utilizando un programa de administración de base de datos, deberemos acceder a la base de datos para crear una nueva tupla dentro de la tabla «ps_product». En el caso del ejemplo, la vamos a llamar «delivery» y será de tipo varchar(64).

delivery

Ahora tocaría añadir el campo de texto que representará el plazo de entrega del producto en el backend de la tienda. Deberemos localizar el fichero que se encuentra dentro de la siguiente ruta dentro de la administración:

adminxxx/themes/default/template/controllers/products/informations.tpl

Nos daremos cuenta que no es más que la plantilla de formulario de la ficha del producto. Entonces, allí donde deseemos añadiremos el nuevo campo. Deberás estar familarizado con las tablas HTML para añadirlo de forma correcta. En el caso del ejemplo lo situamos por debajo de la referencia y UPC el siguiente código:

<tr>
    <td class="col-left"><label>{$bullet_common_field} {l s='Plazo de entrega:'}</label></td>
    <td style="padding-bottom:5px;">
        <input size="55" maxlength="12" type="text" name="delivery" value="{$product->delivery|escape:html:'UTF-8'}" style="width: 130px; margin-right: 5px;" /> <span>{l s='(dias)'}</span>
    </td>
</tr>

Obteniendo como resultado:

plazo entrega

La parte más complicada ya está hecha. Ahora solo falta ir a la plantilla que estés utilizando en tu tienda y mostrar en el product.tpl la variable.

{if $product->delivery}
    <p>{l s='Plazo de entrega en '}{$product->delivery} {l s='dias'}</p>
{/if}

En el caso del ejemplo que ilustramos, tan solo vamos a mostrar el valor de la variable en el caso de que tenga información.

Si te ha servido este tutorial hazte fan de la página de facebook del blog Jose Aguilar

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(20 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

62 respuestas a “Como añadir campos extra a los productos de Prestashop 1.5.x”

  1. Javier dice:

    Hola, funciona para la version 1.7.7.x ??

  2. Chris dice:

    Hola, y para 1.6 y 1.7 es lo mismo? y como hago si lo quiero hacer en combinaciones? quiero otro campo aparte del sku (código de referencia), EAN-13 or JAN, UPC.
    Saludos.

    • Jose Aguilar dice:

      Hola,

      En PrestaShop 1.6 y 1.7 es muy probable que requiera de hacer algún ajuste. Para las combinaciones debes hacer una sobreescritura de la clase Combination del Core de PrestaShop y modificar la tabla correspondiente.

      Saludos

  3. Angela dice:

    Hola, cuando me meto en las carpetas no se cual es el fichero del core que tengo que modificar. Y en el caso del Override no me aparece ningun fichero que se llame producto.tpl solo me aparecen carpetas con index.php
    Alguna solucion?

  4. carlos raffe dice:

    Una vez añadido un nuevo campo… si quiero importar vía cvs, aparecen los nuevos ítems que se agregaron?

  5. Franklin dice:

    Hola, muy bien explicado, en caso de que fueran varios campos, las variables referente a cada campo y sus respectivas definiciones se han de especificar todo junto en el mismo product.php?

  6. ramon dice:

    hola tengo prestasop 1.6.014 y he podido añadir en el backend de la tienda lo de la fecha de entrega pero el resto ni en la base de datos ni en la casse no me funciona me podrias ayudar ,un saludo

  7. Sergio dice:

    ¿Alguien sabe como hacer que estos campos se puedan modificar en la configuración «Para todas las tiendas»?

    Ahora mismo, si tienes multitienda activada, solo guarda las modificaciones si seleccionas una tienda concreta (y sólo para esa tienda, lógicamente).

    He estado mirando un poco, pero no sé donde puede estar el problema.

  8. xavi dice:

    Hola Jose, ya lo tengo casi… he visto que tienes un articulo de como crear un campo de texto enriquecido… con lo que en clases lo pongo asi:

    ‘campo_extra1’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),

    Ya no da error al guardar… realmente ese campo del formulario no lo guarda, ni modifica la BD, sigo haciéndolo por un script que tengo creado, pero por lo menos puedo modificar el resto de campos del producto… sigo intentándolo…

  9. xavi dice:

    Hola Jose, gracias de nuevo por intentar que comprenda como funciona…

    He mirado el classes -> product.php para ver como se gestionan los campos que contienen html, de hecho he creado los dos campos tal que así:

    ‘campo_extra1’ =>array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isCleanHtml’),
    ‘campo_extra2’ =>array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isCleanHtml’),

    Carga bien los datos de la BD que previamente he introducido con un script, pero no me deja ni guardar ni modificar, me tira el siguiente error y se cierra sin guardar ningun dato:

    Se ha producido un error mientras se actualizaba el objeto product ()

    Muchas gracias de nuevo

  10. Jose Antonio dice:

    Hola, a mi me funciono de lujo, gracias.

    Ahora, lo que quiero hacer es sumar ese valor, de entre los productos del carrito.

    Ejem:
    Resumen del carrito
    – prod. 1 campo_extra = 50
    – prod. 2 campo_extra = 25

    total_campo_extra = 75

    • Jose Aguilar dice:

      Hola buenas tardes, para eso ya te tienes que meter en las tripas de Prestashop. No recuerdo exactamente pero creo que en la clase Cart.php tienes la clave para añadir esos campos extras a las lineas del carrito.

  11. Eduard dice:

    Hola!

    Me encuentro que después de realizar todos los pasos, me muestra las variables nuevas que he añadido, pero cuando quiero realizar una actualización, cuando le doy a actualizar, no me esta funcionando.

    Sabes porque puede ser?

    Tengo añadido por un lado en el archivo:

    adminxxx/themes/default/template/controllers/products/informations.tpl

    {$bullet_common_field} {l s=’Id distribuidor:’}

    id_distribuidor|escape:html:’UTF-8′}» style=»width: 130px; margin-right: 5px;» />

    {$bullet_common_field} {l s=’Nombre distribuidor:’}

    nom_distribuidor|escape:html:’UTF-8′}» style=»width: 130px; margin-right: 5px;» />

    Que son los dos campos que he añadido nuevos en la base de datos.

    Por otro lado en el archivo Products.php:

    Definición de la variable:

    /** @var string ID distribuidor */
    public $id_distribuidor;

    /** @var string NOM distribuidor */
    public $nom_distribuidor;

    Definición del array de producto:

    ‘id_distribuidor’ => array(‘type’ => self::TYPE_STRING, ‘validate’ => ‘isReference’, ‘size’ => 64),
    ‘nom_distribuidor’ => array(‘type’ => self::TYPE_STRING, ‘validate’ => ‘isReference’, ‘size’ => 64),

    En la base de datos he creado los campos como varchar de 255.

    Que puede estar fallando? Me falta alguna cosa?

    Anteriormente lo había hecho en la misma web en local y funcionaba, pero no se si me he dejado algun paso…

    Agradecería mucho vuestra ayuda, ya que llevo dos días intentando descubrir el error y no lo encuentro!

    Gracias de antemano!

    • Jose Aguilar dice:

      Hola,

      De entrada no es la mejor forma de plantear lo que quieres guardar. No te sirve lo que ya trea prestashop de proveedores o fabricantes?

      Si no te sirven, para tu caso yo creo que no tienes que hacer lo que estás haciendo sino plantear la creación de un nuevo objeto parecido a los proveedores o fabricantes.

      Saludos

  12. xavi dice:

    Gracias por el aporte, me ha servido de mucho, pero tengo unas dudas que tal vez alguien pueda ayudarme… necesito meter codigo html en el campo, por lo tanto defino el campo con size 400:
    'delivery' => array('type' => self::TYPE_STRING, 'validate' => 'isReference', 'size' => 400),
    En la BD defino el tipo de campo como text .
    En el Backoffice creo un textarea para poder meter el codigo en HTML pero da error al guardarlo… alguien puede orientarme?
    Gracias

    • Jose Aguilar dice:

      Fíjate como lo hace la clase classes/Product.php para definir la descripción y la descripción corta.

  13. Xavi dice:

    Muchas gracias por tus explicaciones, es justo lo que buscaba!. Necesito una aclaración, a ver si puedes ayudarme… he creado el campo, tanto en el formulario del backoffice como en la BD, todo bien, pero en lugar de una fecha, necesito alojar codigo html, unos 400 caracteres… el size de la clase lo he modificado a 400 y en la BD he puesto tipo de dato text con un maximo de 400… aun asi me da error al guardar los datos desde el formulario del backoffice; pienso que posiblemente sean las comillas o tags de html… se te ocurre alguna cosa para que funcione?

    De todas formas muchas gracias, ya que si no lo hago por el backoffice crearé un script externo en php que introduzca los datos en la BD directamente.

    • Jose Aguilar dice:

      Hola buenas tardes, fíjate como lo hace la clase classes/Product.php y verás como declara los campos de descripción y descripción corta.

  14. Lourdes dice:

    Hola.
    Yo uso la 1.6.0.9 y aquí estoy pegándome con tus indicaciones y aprendiendo.
    ¿me dejará grabar en la base de datos el código de un vídeo embebido de Youtube?
    Un saludo y gracias

  15. Carlos Doral dice:

    Hola a todos, buen trabajo Jose por tu artículo, excelente !!

    A mí no me funcionó el override pero se solucionó eliminando el archivo /cache/class_index.php, era problema del caché.

    saludos.

  16. Mr Kairo dice:

    Maestro…, muy bueno y didáctico lo suyo, me sirve para intentar lograr lo que estoy necesitando.
    Te hago una consultilla si esta en ti tener el tiempo para responderme, paso a explicar:

    Necesito lograr que los productos de mi tienda tengan la posibilidad de contar con fecha de expiración, por ej, yo a tal o cual producto que hoy doy de alta y que pongo como «activo» en tal fecha en un futuro cercano (supongamos en 10 días) automáticamente este producto se coloque solito en «desactivado» y por consiguiente desaparezca de la vista de todo usuario o visitante de la tienda.

    Se te ocurre algún método simple para lograr esta capacidad??, por ej, en el caso que tu explicas aquí en vez de colocar un campo «string» podría colocar un campo «fecha» o algo parecido pero mis conocimiento de PHP y MySQL todavía son primitivos.

    No me atrevo a pedirte la solución pero si me tiras una punta de hilo para seguir me ayudaras bastante.

    Mil gracias por tu santa paciencia
    Saludos Cordiales

    Mr Kairo

    • Jose Aguilar dice:

      Hola buenas tardes,

      Es una buena pregunta que se podría hacer de varias formas pero yo lo haría de la siguiente forma:

      Haría un módulo que tenga una tabla asociada a los productos con id_product y date_expire y programar toda la lógica que comentas en el módulo y que el módulo se ejecute en displayHeader y recorra esta nueva tabla para desactivar los productos que han expirado.

      Lo haría de esta forma simplemente por el hecho de que si en un futuro se actualiza la tienda no se pierda esta información. Ya que creando un campo extra en la tabla de productos cuando actualizas he comprobado que se pierde.

      Saludos

      • Mr Kairo dice:

        Amigo, tus consejos son muy apreciados, ahora estoy tras una modificacion en el programa de otorgamiento de puntos por compras, el tema es que todos lo productos otorgan puntos y quiero lograr que solo algunos producto que yo indique los otorgue, lo que hice fue usar tu receta aqui presette para añadir un condicinonal de «Otorga puntos?» en vez de fecha de entrega, añadi en la tabla PS_PRODUCT un capo llamado «puntos» y en la administracin de productos ahora tengo debajo de UPC algo que dice «Otorga Puntos? (1=SI / 0=NO), podria poner un checkbox pero por ahora esta todo bien para pruebas, el asunto es que segun lo que yo indique se actualiza perfectamente el campo «puntos» con un «1» o un «0».
        Hora bien, tengo el indicador de donde tomarme…, pero me estoy pelando las pestañas tratando de buscar en el modulo «loyalty» en donde preguntar por esta condicion para que ese producto otorgue puntos o no segun mi deseo. Trato de rastrear ala condicion que ya viene para el modulo loyalty de que los productos con descuento otorgue o no puntos pero me pierdo en la madeja de codigos…
        Tu que seguramente tienes mas experiencia que yo si me tiras un cabo te lo agradecere enormemente…, sino seguire con mi desvelo!!!, jajaja.
        Nuevamente mil gracias por tu atencion!

  17. Jose Antonio Neto dice:

    ¡Funciona perfectamente!. Además con esta ya van hoy dos entradas tuyas que me salvan el culo. También me ha sido muy útil la entrada donde explicas como añadir el logo del fabricante a la ficha de producto
    ¡Muchas gracias!

  18. Jéssica dice:

    Hola! excelente aporte.

    Pero quisiera preguntarte algo. He seguido tus pasos y en la información del producto (en el back-office) veo que aparece el nuevo campo de fecha de entrega. Pero cuando hago una compra, no lo veo por ningún sitio. ¿Sabes qué error pude haber cometido? Además, me gustaría poder escribir más de 12 caracteres, que es lo que me deja escribir ahora. ¿Dónde lo cambio? Mi versión de prestashop es la 1.5.6.

    Muchas gracias de antemano.

    • Jose Aguilar dice:

      Hola,

      Es normal que no se muestre cuando haces una compra a no ser que lo añadas tu por programación.

      Para poder escribir más de 12 caracteres deberás fijarte como has declarado el nuevo campo en la base de datos y también revisar en la clase Product.php que valor le has dado al atributo size en la definición.

      Saludos,

      • Jéssica dice:

        Gracias por responderme.
        Lo que quiero es que esa fecha de entrega se especifique en la información de mi producto, es decir, sin entrar en compra, visualizando el producto, me gustaría que se viera la fecha de entrega debajo de la descripción o del precio, por ejemplo. ¿Podrías decirme cómo tengo que hacerlo? Desde que entro en el producto hasta que lo compro, no veo en ningún momento ese nuevo campo.

        Lo de los caracteres, en la tabla puse tipo «varchar» como leí en tu artículo, y en el product.php tengo el valor de size: 64.

        Un saludo.

  19. Mauricio dice:

    Hola Jose, muchas gracias por tus mensajes y enseñanzas que nos compartes en esta pagina.

    Quiero compartir contigo algo que estoy haciendo.

    Uso PS 1.6, y estoy intentando ponerle un campo extra a los atributos de los productos en una tienda de un cliente. Necesito poner una descripción a cada atributo.

    Ahora, ya he logrado cargar a la base de datos y poner en el backend el campo de descripción así:

    1. En class>atrribute.php, he declarado la nueva variable:

    public $extra_desc;

    y en la definicion del array:

    ‘extra_desc’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘required’ => true, ‘size’ => 256),

    2. En la base de datos, en ps_attribute_lang, ya cree el campo ´extra_desc´ en la tabla.

    3. En AdminAttributesGroupsController.php, en renderFormAttributes function ya cargue el campo al formulario del backend.

    array(
    ‘type’ => ‘text’,
    ‘label’ => ‘extra description’,
    ‘name’ => ‘extra_desc’,
    ‘lang’ => true,
    ‘size’ => 128,
    ‘desc’ => ‘show me!!!’,
    ‘hint’ => $this->l(‘Invalid characters:’).’ ;=#{}’
    )

    Con esto, ya logro que me cargue el dato a la base de datos, para varios idiomas y hasta acá todo funciona perfectamente.

    Ahora, con lo que estoy en problemas es sacando los datos al frontend. A la pagina del producto.

    Se que debo modificar en class>product.php el SQL para extraer el nuevo campo pero no logro hacer que funcione. Y en ProductController.php, en assignAttributesGroups, para sacarlo y poderlo llamar en el product.tpl

    De esta parte no he podido avanzar. Será que con más ojos encima logramos sacar esto? Le he trabajado y ya no se como hacerlo.

    Ojalá tu y/o los amigos que leen tu blog me apoyen, y entre todos creemos esta nueva funcionalidad para prestashop.

    Un saludo, éxitos en tus proyectos.

    • Jose Aguilar dice:

      Si, en el ProductController.php se tiene que estar asignando la variable $attribute. Haz un print_r de esa variable a ver si te trae el nuevo campo. Tendrás que ir debugando seguramente hasta que llegues a la query que retorna los atributos.

  20. Henry dice:

    Hola Jose excelente articulo, solo me queda una duda, cual es el codigo que actualizara nuestra base de datos con este nuevo campo?

    Necesito saber ello pues en la web que estoy implementando necesito que un campo que es multilenguaje como la descripcion por ejemplo solo se necesite llenar en un idioma y los demas dupliquen lo rellenado, ya que imagina que en la descripcion quisiera poner un numero y no tiene sentido ir a cada idioma para rellenarlo.

    Lo que me parece interesante es que el titulo lo llenes en un idioma y al guardarlo se duplica automaticamente en los otros idiomas, entonces eso es lo mismo que quiero hacer para los campos descripcion corta y etiquetas.

    Agradecere tu gentil ayuda.

    • Jose Aguilar dice:

      Pues si el campo nuevo es multiidioma, el prestashop se espera a que rellenes todos los idiomas. Si quieres que sean para todos los mismo no hagas que el campo sea multiidioma. Crealo en ps_product en vez de ps_product_lang

  21. Víctor dice:

    Buenas Jose, ya no se donde preguntar y al ver tu manual para añadir campos en los productos, me gustaría ver si me puedes ayudar.

    Yo estoy buscando algo similar, pero en los datos de cliente, en registro, necesito añadir 3 campos, pero estos campos han de salir de otras tablas y han de estar vinculados.

    Por ejemplo.

    Campo Provincia, Campo Localidad, Campo Centro de estudios

    Tengo creadas 3 tablas

    ps_provincias con los campos id, provincia
    ps_localidades con los campos id, relación, localidades
    ps_centros con los campos id, relación, centros

    Ahora bien, necesito añadir en el registro un select anidado, en donde el cliente despliegue el primer form, provincias y elija una, por ejemplo Valencia, al seleccionarla, en el select 2 aparecen las opciónes para Valencia, por ejemplo Alboraya, Massanassa, Xirivella, al seleccionar la opción del select 2, por ejemplo alboraya, en el select 3 aparecen los centros en esa localidad.

    Para que veas a que me refiero, he hecho un ejemplo fuera de prestashop.

    http://libreria.tulibrodefp.es/centros/

    He de incluir eso en la tienda, es muy importante para mi tienda y no se como hacerlo, como digo, ya no se donde preguntar.

    Si me ayudaras te lo agradeceria.

    Abrazos y enhorabuena por tu web.

    Gracias

  22. Norman Gomez dice:

    Excelente articulo me funcionó correctamente!

  23. Rubén dice:

    Muchas gracias por este artículo. Está genial y perfectamente explicado. Tan solo tengo un problema, y es que el campo que quiero introducir es «años» y al llevar la letra «ñ» no hay manera de que se vea. Con cualquier otra palabra si que me funciona. Cómo puedo hacerlo?

    Un saludo y gracias otra vez.

  24. Damian dice:

    ole ole

  25. José Ángel dice:

    Gran aporte. Me ha servido de gran ayuda, lo único malo es que cuando actualices entiendo que se remplazara y habrá que cambiarlo.

    En la versión PrestaShop™ 1.5.6.0 no hay archivo Product.php en override y he modificado el que sale el archivo Product.php que sale en clases, funciona perfectamente. ¿Está bien hecho?

    Saludos

  26. Francisco Villen dice:

    Agradecer el fantastico articulo que me ha sido de gran ayuda.

    Gracias!

  27. Leandro dice:

    Hola Jose! antes que nada aprovecho para felicitarte por el blog!, muy buenos contenidos.
    Realice el tutorial, pero ando necesitando que en ves de mostrar el campo en el .tpl, poder mostrarlo con html desde la descripcion del producto. Agradeceria si hay algun tutorial por ahi que sirva para eso, muchas gracias!

  28. Leandro dice:

    Hola Jose!. antes que nada aprovecho para felicitarte, gran laburo.
    Hice el tutorial todo perfecto, pero quiero mostrar el campo guardado en la descripcion del producto y no en la vista tpl, de que manera deberia pegar el código?, algo para leer y poder hacerlo?
    Muchas gracias!

  29. Jose dice:

    Interesante modificación, la cual he probado y funciona bien, pero me gustaria saber como poder hacerla para que sea multi idioma.
    Gracias

    • Jose Aguilar dice:

      Hola buenos días,

      No lo he probado nunca pero si te fijas en la clase Product existen también los campos relacionados con la descripción corta, descripción breve, nombre, etc que tienen las propiedades de multiidioma. Entonces diría que creando un field como el siguiente ejemplo ya lo tendrías:

      /* Lang fields */
      ‘meta_description’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),

      Además de esto diría que el campo en vez de añadirlo en la tabla ps_product de la base de datos, deberías añadirlo a la tabla ps_product_lang

      Saludos

  30. Lourdes dice:

    ¡Hola! Nos podríais indicar por como añadir el subtitulo en cada imagen del producto en la versión 1.5.4.1, acabamos de actualizar nuestra página a esta versión pero le falta este campo. La versión 1.4.3. con la que trabajábamos anteriormente tenía este campo. Muchas gracias.

  31. Esteban dice:

    Bien y cual es la solución entonces? Los que modificaron el AdminProductsController.php que modificaron? lo hicieron por overrride?

    Agradezco vuestra respuesta

  32. tienda bebes dice:

    Lo solucione modificando el AdminProductsController.php

    Un saludo

  33. tienda bebes dice:

    Hola, estoy añadiendo un checkbox, pero cuando, actualiza correctamente cuando esta a false y le doy a true, pero ya no vuelve más a false, no actualiza. A que puede ser debido?

    Un saludo

  34. tienda bebes dice:

    Efectivamente era eso, no se porque no lee el override

    Gracias

  35. tienda bebes dice:

    Hola, mi versión de ps es 1.5.4.1 he realizado todo los pasos pero cuando le doy a guardar en la ficha de producto no actualiza la base de datos, tengo que modificar alguna clase mas?

    Un saludo

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.