¿Cómo hacer un Override de Clase en Prestashop?

¿Cómo hacer un Override de Clase en Prestashop?

5/5 (1)

Vamos a aprender los conceptos básicos para poder hacer los overrides en classes de Prestashop.

Primero de todo, si quieres saber qué es un Override de Prestashop puedes leer más información en el post destinado a ello:

Una vez sabemos qué es un Override y tenemos claro qué queremos hacer, vamos a ver cómo hacerlo.

El resultado final va a ser un archivo en la carpeta override/classes de tu prestashop.

Mi recomendación es que hagas las pruebas en una web que no esté en producción porque esto puede crear muchos problemas.

Vamos a usar como ejemplo un Override de la classe Product.php.

Lo primero que haremos será abrir la clase original la cual está situada en classes/Product.php

Cuando lo abrimos, vemos cómo está declarado:

class ProductCore extends ObjectModel
{
   ...
}

Para hacer el Override lo que tenemos que definir es que hacermos un class Product que extiende la clase ProductCore. De esta manera:

class Product extends ProductCore
{
   ...
}

Ahora, si guardamos el archivo dentro de la carpeta override/classes ya le estaremos diciendo a Prestashop que hay un archivo de la classe Product que hay que tener en cuenta antes que utilizar el original.

Añadir variable en Override de Clase

La clase Product, en este ejemplo, tiene una serie de variables. Si queremos añadir una variable nueva, por ejemplo temporada, lo haríamos de la siguiente manera:

Primero de todo, hay que entender que las clases de Prestashop actúan directamente a la base de datos. Sabremos qué tabla está usando en la $definition de la classe:

public static $definition = array(
    'table' => 'product',
    'primary' => 'id_product',
    'multilang' => true,
    'multilang_shop' => true,
    'fields' => array(...)
);

En este caso vemos que la tabla de la clase Product se llama ps_product. Que utiliza multilang (así que tiene la tabla ps_product_lang) y que utiliza multishop (así que también tiene la tabla product_shop).

Para poder definir un campo extra en una clase lo que deberemos hacer es crearlo en la Base de Datos (por lo menos en la principal, ps_product). Y, una vez creado, ya podremos definirlo en el Override de Clase.

Vamos a definirlo:

class Product extends ProductCore
{
    public $temporada;
}

Lo siguiente que debemos hacer es añadir esta variable $temporada a los campos de la $definition. Así, que vamos a definir qué es la variable temporada. En este caso será un texto con validación isGenericName y no va a usar ni multilang ni multishop.

Para poder llegar a la static $definition deberemos usar el parámetro self::$definition. De esta manera:

self::$definition['fields']['temporada'] = array(
    'type' => self::TYPE_STRING,
    'validate' => 'isGenericName',
    'lang' => false,
    'shop' => false,
);

¡Ya lo tenemos! Ahora la clase Product tiene en la Base de Datos el campo ‘temporada’ y está directamente asignado a la class Product.php.

De esta manera ya podemos acceder a la temporada del Producto de la siguiente manera:

$product = new Product();
$product->temporada;

De igual manera podemos guardar los datos de diferentes maneras:

Guardar la variable directamente a través de un save():

$product->temporada = '2020';
$product->save();

Así lo que hacemos es guardar todo el Product y se va a ejecutar el hook de guardado de Producto.

Esto servirá perfectamente pero si queremos hacer un cambio masivo de temporadas podría sobrecargar la web debido a que guardaría cada uno de los campos del producto.

Vamos a ver un método menos agresivo para la web:

Guardar la variable a través de una static function:

Hay las funciones static (estáticas) dentro de Prestashop que nos permiten utilizar las funciones sin tener el objeto creado. Esto es muy útil para optimizar el rendimiento de la web.

Un ejemplo de public static function sería public static function getProductName($id_product, $id_product_attribute = null, $id_lang = null)

La cual le pasamos el id del producto, del atributo y del idioma y nos devuelve el nombre del Producto. Así sólo cogemos una variable de la base de datos y no creamos un objeto con su precio, sus características, sus categorías… Es un nombre en vez de todo un objeto de producto.

Vamos a ello. Vamos a crear la función para guardar la temporada de forma estática y mejorar el rendimiento de la web:

La llamaremos updateTemporada($id_product, $temporada) y le pasaremos el id del Producto y la temporada que queremos pasarle:

public static function updateTemporada($id_product, $temporada)
{
...
}

Lo que haremos en esta función es simplemente actualizar el campo temporada de la tabla ps_product dónde el id_product sea el que toque.

Antes, pero, vamos a hacer uso de la clase Validation para validar que la temporada sea tipo GenericName y, de paso, validaremos que sea un id el id_product:

public static function updateTemporada($id_product, $temporada)
{
    if (Validate::isGenericName($temporada) && Validate::isUnsignedInt($id_product)) {
        Db::getInstance()->update(
            'product',
            array('temporada' => $temporada),
            'id_product = '.(int)$id_product
        );
        return true;
    } else {
        return false;
    }
}

Si quieres saber cómo usar las funciones de base de datos de Prestashop mira esta guía:

Ahora, desde cualquier parte de Prestashop podremos usar la función Product::updateTemporada($id_product, $temporada) y acutalizaremos la temporada del producto de manera efectiva. Además si el resultado es true significará que todo ha funcionado correctamente y si es false es que ha habido algún error.

Valoración de la Información

Deja una respuesta

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