Añadir nuevo campo a una categoría de Prestashop sin tocar su core

1. Sobreescribir la clase Category de Prestashop (override).

2. Sobreescribir el controlador de administración de categorías.

3. Crear el nuevo campo en la base de datos.

4. Eliminar caché de clases de Prestashop.

 

Vamos a ver cómo añadir un campo extra a una categoría de Prestashop, lo haremos siguiendo las mejores prácticas de programación para el CMS y, por supuesto, sin tocar para nada el core. En este artículo lo vamos a hacer sin usar un módulo para ello pero todo esto podría encapsularse en un módulo de PS.

1. Sobreescribir la clase Category de Prestashop (override).

Lo primero, hacemos un override de la clase php, esto NO significa copiar toda la clase en la carpeta overrides y modificar lo necesario (como me he encontrado en algunos códigos), la sobreescritura en la programación orientada a objetos es una arma muy poderosa y hay que saber cómo se usa. Lo que se hace es simplemente crear un nuevo archivo que herede de la clase Category de prestashop y únicamente sobreescribimos aquellos métodos que necesitemos ampliar.

Vamos a la carpeta /raiz/proyecto/override/classes/ y creamos el archivo Category.php, le añadimos una nueva variable pública a la clase con el nombre que queramos para nuestro nuevo campo, en nuestro caso vamos a crear el campo “my_field” que será de tipo string, después modificamos el constructor de la clase de la siguiente forma:

class Category extends CategoryCore {
     //CREAMOS EL NUEVO CAMPO
     public $my_field;

     //MODIFICAMOS EL CONSTRUCTOR PARA AÑADIR EL NUEVO CAMPO
    public function __construct($id_category = null, $id_lang = null, $id_shop = null) {
         self::$definition['fields']['my_field'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isString');
         parent::__construct($id_category, $id_lang, $id_shop);
    }
}

Con esto le estamos diciendo a Prestashop que entre los campos del objeto Category existe también uno llamado “my_field” de tipo string, que requiere traducción y que valida como un string.

2. Sobreescribir el controlador de administración de categorías.

Para que el nuevo campo se muestre en el back office de Prestashop y deje guardarlo en base de datos desde la edición de categoría debemos sobreescribir el controller AdminCategoriesController.

Como en el paso 1, creamos un archivo llamado AdminCategoriesController.php en la carpeta /raiz/proyecto/override/controllers/admin/, en este caso debemos sobreescribir el método completo renderForm puesto que prestashop no ha dispuesto otra forma de añadir un campo al array fields_form, así que, vamos la ruta raiz/proyecto/controllers/admin/ y copiamos todo el procedimiento public function renderForm() y lo copiamos en nuestro nuevo override.

class AdminCategoriesController extends AdminCategoriesControllerCore {
     public function renderForm() {
          ...
          // DENTRO IRÁ EL CÓDIGO ORIGINAL DEL MÉTODO. MODIFICAMOS EL ARRAY $this->fields_form
           $this->fields_form = array(
                'tinymce' => true,
                'legend' => array(
                'title' => $this->l('Category'),
                'icon' => 'icon-tags'
            ),
            'input' => array(
             ...
                  // AÑADIMOS EN LA POSICIÓN QUE QUERAMOS EL NUEVO CAMPO
                  array(
                    'type' => 'text',
                    'label' => $this->l('My Field'),
                    'name' => 'my_field',
                    'lang' => true,
                    'required' => false
                  ),
           )
           ...

          ...
          return parent::renderForm();
     }
}

3. Crear el nuevo campo en la base de datos.

Si lo hicieramos en un módulo lo interesante sería crear este campo mediante código en la instalación del módulo y eliminarlo cuando se desinstale, como en nuestro ejemplo no hay módulo nuevo, vamos directamente a hacerlo a través de phpMyAdmin.

Nos logueamos en nuestro gestor de MySQL, vamos a la tabla ps_category_lang (si no requiere de idioma el campo lo crearíamos en la tabla ps_category) y creamos el nuevo campo que debe llamarse exactamente igual que el creado en la clase Category, es decir, my_field, de tipo VARCHAR(255) o TEXT y que sea nullable.

4. Eliminar caché de clases de Prestashop.

Ya sólo nos queda que Prestashop sepa de nuestros override, para ello símplemente debemos eliminar el archivo class_index.php situado en /raiz/proyecto/cache/, una vez eliminado PS lo regenerará al recargar la página y añadirá nuestras nuevas clases a su espacio de nombres.

A estas alturas ya debemos poder guardar el campo desde el back office y sólo quedaría ir a la parte de la plantilla donde queramos mostrar este campo y sacarlo por pantalla:

{ $category->my_field }

Prestashop override Category

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *