Seguimos con el tema sobre clases, controladores y overrides en Prestashop. El anterior post lo tenéis aquí.
Vamos a avanzar un poco más en los conceptos y vamos a presentar un caso práctico que pueda ayudar y ser un punto de partida en la personalización de nuestra tienda.
Siguiendo el ejemplo con el que estábamos: queremos añadir dos campos nuevos de texto asociados a la entidad producto para después poder mostrar esta información en nuestra plantilla (donde queramos: ficha de producto, lista de productos, portada en productos relacionados, etc).
La pregunta que hacíamos es:
¿Qué clase o controlador tenemos que extender?
Creo que está claro que habrá que modificar la entidad Product añadiendo estos nuevos parámetros.
Para ello debemos crear un nuevo fichero Product.php en /override/classes.
Una aclaración: si vamos a la carpeta classes general veremos que la clase que queremos modificar (Product.php) está en la «raiz» de clases y no en una subcarpeta, es por ello que nuestro recién creado Product.php estará en la raiz de /override/classes. Por tanto, si la clase que quisiéramos sobrecargar estuviera en una subcarpeta de classes, nuestra nueva clase estaría dentro de esa subcarpeta en /override/classes. Es más difícil de describir por escrito que lo que es en realidad.
Nuestra clase Product deberá extender de ProductCore y contendrá única y exclusivamente nuestro código (no hace falta que sea una copia exacta del fichero «original».
<?php
class Product extends ProductCore {
}
Así, por si solo nuestro código no hace nada, la tienda sigue funcionando correctamente pero no hay nada añadido.
Añadimos los nuevos campos tw y fb a la clase.
<?php
Product::$definition['fields']['twitter'] = array(
'type' => ObjectModel::TYPE_STRING,
'validate' => 'isAnything',
'size' => 128
);
Product::$definition['fields']['facebook'] = array(
'type' => ObjectModel::TYPE_STRING,
'validate' => 'isAnything',
'size' => 128
);
class Product extends ProductCore {
public $facebook = '';
public $twitter = '';
}
Lo que hacemos antes de la declaración de la clase, es modificar la definición que tiene la clase producto de un produto y la añadimos dos campos nuevos. Además, le decimos a Prestashop que estos campos no tienen validación, que pueden estar vacíos y que son de tipo «cadena de texto» (string).
Creamos sendos parámetros como parte de la clase producto.
Y con esto estaría ya nuestro modelo preparado para almacenar un objeto de tipo producto en memoria.
Faltaría un detalle: como estamos sobrecargando una clase fuera de un módulo, los campos que hemos declarado no están creados en la base de datos. Por ello, deberemos crear las columnas en la base de datos de nuestro PS en la tabla product. Si estuviéramos en el ámbito de desarrollo de un módulo, en la propia instalación del módulo podríamos ejecutar un sql que creara estas dos columnas en la tabla en concreto. Pista: desde un módulo también se pueden sobrecargar todo lo que queramos xD.
Para este ejemplo no sería necesario modificar ninguna clase controladora porque no hemos modificado nada del funcionamiento original de prestashop simplemente lo que hacemos son operaciones CRUD de estos campos.
¿Qué tpl tenemos que modificar del tema del admin para ver nuestro campo?
Ahora queremos que estos campos puedan ser establecidos desde el admin. Concretamente la página de edición de producto. Esta página es controlada por AdminProductsController. Todo el admin es «controlado» por las clases declaradas en /controllers/admin.
Sin embargo no es necesario modificar ningún controlador para incrustar nuestros nuevos campos.
Para modificar la «ficha» de productos del admin deberemos modificar un tpl que se encuentra localizado (esto lo he sabido más depurando el código de PS que leyendo por la red xD) en tu carpeta /adminXXX/themes/default/template/controllers/products/informations.tpl
Hay que tener en cuenta que el admin theme está maquetado con Bootstrap, por ello, si queremos que se mantenga el «estilo» de esta página al incrustar estos campos, deberemos usar las clases CSS de bootstrap.
Podríamos poner algo así:
<div class="form-group"> <label class="control-label col-lg-3" for="youtube"> <span class="label-tooltip" data-toggle="tooltip" title="{l s='El link a twitter de este servicio'}"> {l s='Twitter'} </span> </label> <div class="col-lg-5"> <input type="text" id="twitter" name="twitter" value="{$product->twitter|htmlentitiesUTF8}"/> </div> </div> <div class="form-group"> <label class="control-label col-lg-3" for="facebook"> <span class="label-tooltip" data-toggle="tooltip" title="{l s='Enlace a facebook ingresar aquí'}"> {l s='Facebook'} </span> </label> <div class="col-lg-5"> <input type="text" id="facebook" name="facebook" value="{$product->facebook|htmlentitiesUTF8}"/> </div> </div>
Este snippet lo podemos pegar debajo del nombre de nuestro producto o donde queramos.
Al guardar este producto nuestros campos se almacenarán en la base de datos y podremos hacer uso de ellos en nuestra plantilla.
Con esto ya veremos nuestros campos en el admin y podremos modificarlos como cualquier otro.
Ahora ya solo quedaría mostrarlos en la vista…
¿Dónde queréis que los pongamos xD?
Muchas gracias xD!