Añadir un nuevo campo de texto enriquecido a los productos de Prestashop
Prestashop dispone de 2 campos de texto enriquecido para los productos. La descripción corta y la descripción. Cada tienda es un mundo y podría ser que en alguna de ellas se necesite incorporar otro campo de texto enriquecido para guardar otro tipo de información.
En este artículo vamos a ver como crear un nuevo campo de texto enriquecido en la ficha de los productos de Prestashop. En la administración vamos a añadir un nuevo campo descriptivo editable que en el front office mostraremos por debajo de las imágenes del producto.
Es requerido tener conocimientos de programación orientada a objetos para llevar a cabo la tarea de añadir un nuevo campo de texto enriquecido a las fichas de 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 las características de un producto en formato enriquecido.
Prestashop ya dispone de una pestaña donde se administran las características pero en este caso queremos que las características no se gestionen como las gestiona prestashop sino que requerimos que las características sean un campo de texto enriquecido.
Bien, necesitaremos incorporar la nueva variable de la clase:
public $features;
Y seguidamente la definición:
'features' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
En la definición le estamos indicando que queremos una variable de tipo HTML y con validación tipo cadena.
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:
<?php
class Product extends ProductCore
{
public $features;
public static $definition = array(
'table' => 'product',
'primary' => 'id_product',
'multilang' => true,
'multilang_shop' => true,
'fields' => array(
// Classic fields
'id_shop_default' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_manufacturer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_supplier' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'reference' => array('type' => self::TYPE_STRING, 'validate' => 'isReference', 'size' => 32),
'supplier_reference' => array('type' => self::TYPE_STRING, 'validate' => 'isReference', 'size' => 32),
'location' => array('type' => self::TYPE_STRING, 'validate' => 'isReference', 'size' => 64),
'width' => array('type' => self::TYPE_FLOAT, 'validate' => 'isUnsignedFloat'),
'height' => array('type' => self::TYPE_FLOAT, 'validate' => 'isUnsignedFloat'),
'depth' => array('type' => self::TYPE_FLOAT, 'validate' => 'isUnsignedFloat'),
'weight' => array('type' => self::TYPE_FLOAT, 'validate' => 'isUnsignedFloat'),
'quantity_discount' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'ean13' => array('type' => self::TYPE_STRING, 'validate' => 'isEan13', 'size' => 13),
'upc' => array('type' => self::TYPE_STRING, 'validate' => 'isUpc', 'size' => 12),
'cache_is_pack' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'cache_has_attachments' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'is_virtual' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
/* Shop fields */
'id_category_default' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedId'),
'id_tax_rules_group' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedId'),
'on_sale' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
'online_only' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
'ecotax' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice'),
'minimal_quantity' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedInt'),
'price' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice', 'required' => true),
'wholesale_price' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice'),
'unity' => array('type' => self::TYPE_STRING, 'shop' => true, 'validate' => 'isString'),
'unit_price_ratio' => array('type' => self::TYPE_FLOAT, 'shop' => true),
'additional_shipping_cost' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice'),
'customizable' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedInt'),
'text_fields' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedInt'),
'uploadable_files' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedInt'),
'active' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
'available_for_order' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
'available_date' => array('type' => self::TYPE_DATE, 'shop' => true, 'validate' => 'isDateFormat'),
'condition' => array('type' => self::TYPE_STRING, 'shop' => true, 'validate' => 'isGenericName', 'values' => array('new', 'used', 'refurbished'), 'default' => 'new'),
'show_price' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
'indexed' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
'visibility' => array('type' => self::TYPE_STRING, 'shop' => true, 'validate' => 'isProductVisibility', 'values' => array('both', 'catalog', 'search', 'none'), 'default' => 'both'),
'cache_default_attribute' => array('type' => self::TYPE_INT, 'shop' => true),
'advanced_stock_management' => array('type' => self::TYPE_BOOL, 'shop' => true, 'validate' => 'isBool'),
'date_add' => array('type' => self::TYPE_DATE, 'shop' => true, 'validate' => 'isDateFormat'),
'date_upd' => array('type' => self::TYPE_DATE, 'shop' => true, 'validate' => 'isDateFormat'),
/* Lang fields */
'meta_description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'meta_keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'meta_title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
'link_rewrite' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 128),
'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128),
'description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
'description_short' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
'features' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
'available_now' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'available_later' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'IsGenericName', 'size' => 255),
),
'associations' => array(
'manufacturer' => array('type' => self::HAS_ONE),
'supplier' => array('type' => self::HAS_ONE),
'default_category' => array('type' => self::HAS_ONE, 'field' => 'id_category_default', 'object' => 'Category'),
'tax_rules_group' => array('type' => self::HAS_ONE),
'categories' => array('type' => self::HAS_MANY, 'field' => 'id_category', 'object' => 'Category', 'association' => 'category_product'),
'stock_availables' => array('type' => self::HAS_MANY, 'field' => 'id_stock_available', 'object' => 'StockAvailable', 'association' => 'stock_availables'),
),
);
}
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_lang”. En el caso del ejemplo, la vamos a llamar “features” y será de tipo TEXT.

Ahora tocaría añadir el campo de texto que para añadir las características de los productos 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 vamos a situar por debajo de la descripción corta con el siguiente código:
<tr>
<td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="features" type="tinymce" multilang="true"}
<label>{l s='Otro campo:'}<br /></label>
<p>({l s='Appears in the body of the product page'})</p>
</td>
<td style="padding-bottom:5px;">
{include file="controllers/products/textarea_lang.tpl" languages=$languages
input_name='features'
input_value=$product->features
}
<p class="clear"></p>
</td>
</tr>
Obteniendo como resultado:
La parte más complicada ya está hecha. Ahora solo falta ir a la plantilla que estés utilizando en tu tienda y añadir en el product.tpl allí donde lo desees el código para visualizar el contenido de este campo nuevo, como por ejemplo:
{if $product->features}
<p>{$product->features}</p>
{/if}
Obteniéndose como resultado:
Si te ha servido este tutorial, no dudes en hacerte fan de la página de facebook del blog Jose Aguilar
Hola, gran aportación, pero tengo una duda…
Si el campo features a incluir quiero que provenga de una tabla nueva que yo me cree en prestashop? en la que tenga asociado el id del porducto por ejemplo… como podría hacerlo? Tendría que definir una clase nueva o puedo hacerlo de una forma parecida a esta?
Gracias de antemano! (Estoy haciendo unas pruebas en prestashop1.6)
Hola buenos días,
Si deseas guardar esta información en una tabla nueva lo ideal es crear una clase para esa tabla y el proceso sería diferente al explicado en este tutorial.
Saludos
hola,
una consulta, tengo prestashop 1.7 y quiero añadir una nueva propiedad en las imagenes de productos como la de «imagen de portada» para luego dependiendo de este mostrar el producto de una manera o otra.
encontre la propiedad de «imagen portada» y añadi la mia nueva en src/prestashopbundle/resources/views/admin/productimage/form.html.twig y en src/prestashopbundle/controller/admin/productimagecontroller.php los modifique en el codigo fuente porque no se como hacerlo sin manipular los ficheros fuente alguien sabe como hacerlo?
aparte ahora me aparece el campo en el backoffice pero no guarda el valor en la base de datos, alguna idea?
gracias.
Hola buenos días,
Para este tipo de ayudas que se salen de lo que hay en el blog debe enviarnos un ticket al centro de soporte y allí le indicaremos como podemos proceder:
https://www.jose-aguilar.com/soporte/
Saludos
¿En /override/classes/Product.php no sería mejor añadir sólo el campo features en lugar de replicar toda la tabla ps_products?
public $features;
public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null) {
self::$definition[‘fields’][‘features’] = array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’);
parent::__construct($id_product,$full,$id_lang,$id_shop,$context);
}
Si, sería mejor
también lo reparé, gracias, al final es cambiar los parámetros del array de features más concretamente el isString por isCleanHtml como lo hace en description en la version 1.6 de prestashop, no se si me explico, pero lo tengo reparado y funcionando al 100%, muchas gracias por las ayudas!
Por cierto, ¿como pedirte a ser posible una implementación? Estoy intentando fabricar un botón para que el cliente pueda eliminar su cuenta desde el front office en 1.6, pero no consigo avanzar más allá de la creación del mismo.. gracias desde ya, aunque no se pueda.
Saludos!
Hola buenos tardes, ok perfecto! Para lo que comentas de eliminar cuenta de usuario tenemos pendiente hacer un módulo que tenga exactamente esta funcionalidad.
Gracias por las respuestas Jose,
a la espera de novedades con el módulo para eliminar cuenta, y también para la exportación/importación del nuevo campo creado de este post, gracias!
Hola, gracias por tus post, me estan siendo de gran ayuda, después de modificar un poco los y , por lo que hay en la versión 1.6, me aparece correctamente en el backoffice, y parece incluso que guarda la información, pero no aparece en el front, limpio la cache, fuerzo compilación, pero nada, sigue sin aparecer en el front, también aparece el contenido en la base de datos.. necesito tu ayuda, muchas gracias por todo!
Vuele a revisar todos los pasos. Si te dejas alguno no va a funcionar. Para ayudarte necesitaríamos que nos explicaras todo los pasos que has hecho…
Hola, primero de todo felicidades por el post, me ha servido de mucho. Sólo me gustaría saber cómo puedo modificar el archivo «AdminImportController» para poder importar masivamente este campo. No se si me explico… He encontrado poca cosa por internet y he pensado que tú igual sabes cómo modificarlo.
Muchas gracias 🙂
Si, esa es una operación que tengo pendiente revisar ya que no es el primero que me lo pregunta. Seguro que se puede pero hay que meterse en el controlador y sobreescribirlo.
Hola Jose,
He seguido tus pasos para añadir un nuevo field ( Prestashop 1.6 ) a los productos, pero no guarda los datos la base de datos y obviamente no los printa por pantalla ( incluso si yo edito el contenido des de la base de datos, no veo nada en el Front ). Lo curioso es que si toco el CORE en vez de añadir/editar el override/classes todo funciona correctamente. Alguna idea?
Gracias! 🙂
Hacerlo con override y limpiar la caché desde preferencias
Frescura!
Gracias
:)))
saludos buenos aportes tienes soy un novato estoy conociendo prestashop estoy con la version 1.6 y quisiera saber como quitar de la vista de los productos la referencia que no se vea al igual que condicion.
Aprovechando tambine quisiera saber si la pantalla del administrdor donde logueas se puede cambiar la apariencia.
Hola buenas tardes,
Si, el campo de condición y referencia los puedes quitar buscándolos y quitándolos del archivo product.tpl de la plantilla en uso.
La administración también se puede cambiar de apariencia. Diria que si te vas a empleados y editas un empleado le puedes asignar una plantilla de administración. De la misma forma que puedes hacer una plantilla para el front office, se puede hacer para el backoffice.
Saludos
Saludos
Estupendo muchas gracias! justo lo que necesitaba. He tenido q adaptarlo a 1.6 pero sin mayor dificultad.
Hola Jose, tu post es espectacular además de super útil, sólo una pregunta, a la hora de declarar la variable en el PHP, me he ido al archivo en la carpeta /override/ y estaba vacio, he hecho la modificación en product.php pero de la carpeta /classes/ y me ha funcionado correctamente, pero ¿me podrías indicar el porqué?.
Muchas gracias
Lo ideal es sobreescribir los métodos añadiendo la modificación en el archivo override/classes/Product.php. Si no existe, lo creas como indico en el ejemplo ya que si lo has modificado directamente en el corazón de prestashop, cuando actualices tu versión se perderán tus cambios ya que actualizando se reemplazan todos los archivos del corazón de prestashop.