Share

Cómo usar el sistema de anulación de PrestaShop sin romper el núcleo

How to Use PrestaShop's Override System Without Breaking Core with Knowband

El sistema de anulaciones de PrestaShop permite personalizar el comportamiento principal sin modificar los archivos originales. Sin embargo, si se usa de forma descuidada, crea tiendas frágiles que fallan al actualizar. Esta guía de Knowband explica cómo funcionan las anulaciones, cuándo usarlas y tres problemas críticos que todo desarrollador debe conocer.

¿Qué es el sistema de anulación?

PrestaShop usa la herencia de PHP para permitirte incorporar tu propia versión de cualquier clase principal sin modificar las originales. Cada clase principal se nombra con el sufijo “Core”, por ejemplo, “ProductCore”. Si creas /override/classes/Product.php con una clase llamada “Product” que extiende “ProductCore”, PrestaShop cargará tu versión. Lo mismo ocurre con los controladores.

Anule solo los métodos específicos que necesite modificar; nunca copie un archivo de clase completo. Esto simplifica la anulación y reduce la probabilidad de conflictos con futuras actualizaciones.

Ejemplo, exponer el nombre del controlador actual a su plantilla de encabezado:

Dónde colocar los archivos de anulación

Las anulaciones pueden residir en dos ubicaciones. El directorio global /override/ en la raíz de la instalación se activa inmediatamente después de borrar la caché. La mejor estrategia es agrupar las anulaciones dentro de un módulo.

Al colocar una anulación dentro de un módulo (p. ej., /modules/mymodule/override/classes/Product.php), PrestaShop la copia a /override/ durante la instalación y la elimina sin problemas al desinstalarla. Este es el enfoque recomendado.

Un ejemplo rápido de anulación de clase. Supongamos que desea exponer el nombre del controlador actual a su plantilla de encabezado:

// /anular/clases/controladores/FrontController.php

clase FrontController extiende FrontControllerCore {

    función pública initHeader() {

        self::$smarty->assign('controladoractual', obtener_clase($esto));

        devolver padre::initHeader();

    }}

Llama siempre al método padre a menos que tengas una razón deliberada para no hacerlo. Omitirlo interrumpirá silenciosamente la funcionalidad principal.

Anulación de clases de módulos y controladores

Desde PrestaShop 1.6, también puedes sobrescribir las clases de módulo. Añade “Override” al nombre de la clase (por ejemplo, BlockUserInfoOverride que extiende BlockUserInfo) y colócala en /override/modules/. El mismo patrón se aplica a los controladores de módulo. Después de cualquier sobreescritura, borra la caché, en concreto /cache/class_index.php, o no surtirá efecto.

Cuándo NO utilizar anulaciones

Las anulaciones son exclusivas: solo puede haber una por clase. También están prohibidas en los módulos del mercado y deben reservarse para personalizaciones de tiendas privadas. Antes de optar por una anulación, considere una de estas alternativas:

  • Manos: PrestaShop activa eventos de enlace cada vez que se carga una página: puedes aprovecharlos desde un módulo para ejecutar código personalizado o enviar contenido a la página sin necesidad de acercarte a una clase principal.
  • Anulaciones de servicios de Symfony: Las partes de PrestaShop migradas a Symfony ofrecen una ruta más limpia a través del contenedor de servicios. Se decora o reemplaza un servicio en lugar de modificar la clase en sí.
  • Modelo de objeto personalizado: ¿Necesitas añadir campos a una entidad principal? Crea tu propio ObjectModel con su propia tabla en lugar de modificar el existente.

Mantener las anulaciones seguras mediante actualizaciones

Las actualizaciones de PrestaShop pueden cambiar silenciosamente las firmas de los métodos, dejando la anulación funcionando con suposiciones obsoletas. Considere cada anulación como algo que debe revisarse después de cada actualización. Comente qué cambió y por qué, revise el registro de cambios y mantenga la anulación lo más pequeña posible. Una anulación limitada y bien comentada que invoque los métodos principales correctamente sobrevive a las actualizaciones. Una copia completa de la clase es un error a punto de aparecer.

La caché “fantasma”: por qué su anulación parece invisible

La principal razón por la que los desarrolladores creen que su anulación falla: PrestaShop no escanea /override/ en cada petición. Compila un mapa de clases en /cache/class_index.php, y hasta que ese archivo se elimine y se regenere, la anulación es invisible, independientemente de lo correcto que sea el código. Borrar la caché de Smarty no es suficiente. Elimine class_index.php manualmente mediante FTP/SSH, desde Parámetros Avanzados > Rendimiento en el back office o desde la consola de Symfony.

Figura 1: El flujo del sistema de anulación de PrestaShop y la función de /cache/class_index.php.

 

El muro de Symfony: Las modificaciones heredadas no funcionan para los controladores modernos

Este sistema PHP heredado solo funciona en la antigua capa ObjectModel de PrestaShop. A partir de PS 1.7, las áreas clave del back office, incluyendo las nuevas pantallas de Página de Producto y Pedido, se han reescrito en Symfony. El sistema de anulación de PHP no afecta a estos controladores Symfony. Para aquellos, utilice Decoración de serviciosEncapsular o reemplazar un servicio mediante el archivo services.yml del módulo. Si una anulación no tiene efecto incluso después de borrar class_index.php, es probable que el controlador esté migrado a Symfony.

Resolución de conflictos: cuando dos módulos quieren la misma clase

Cuando dos módulos sobrescriben la misma clase, PrestaShop genera un error en la segunda instalación y deja la sobreescritura inactiva. La solución es manual: abra ambos archivos, fusione todos los métodos en un solo archivo /override/ que extienda la clase Core y luego elimine class_index.php. Añada comentarios que indiquen qué módulo contribuyó con cada método. Por eso las sobreescrituras están prohibidas en los módulos de la tienda online; los conflictos se convierten en un problema para el vendedor. Si crea para otros, use ganchos.

Figura 2: Cómo surgen los conflictos de anulación cuando dos módulos apuntan a la misma clase y la resolución de la fusión manual.

Sobre Knowband

Knowband es un proveedor confiable de plugins y extensiones de comercio electrónico con años de experiencia ayudando a comerciantes en línea a crear tiendas más rápidas, inteligentes y con más funciones. Ya sea que gestiones tu tienda en PrestaShop, OpenCartShopify, WooCommerce, Magento, o cualquier otra plataforma importante, Knowband ofrece una amplia gama de complementos y extensiones listos para usar que lo ayudan a mejorar la funcionalidad, mejorar el rendimiento y brindar una mejor experiencia de compra, sin necesidad de construir desde cero.