Hola @miriam24, el problema que describes es muy común y @valeria9483 y @rodrigohub16 han señalado el camino correcto. Tu snippet en ProductController solo afecta a la página de detalle del producto porque ahí es donde ese controlador es activo y id_product tiene un valor. Para las listas, necesitas modificar el proceso que construye la lista de productos.
En PrestaShop 1.7.8.2, que asumo que es tu versión (corrígeme si me equivoco, pero tu código es de esa línea), la mejor aproximación sin tocar directamente el core de forma destructiva es extender Product para añadir un método que recupere los accesorios de forma más eficiente para cada producto en el contexto de una lista.
Aquí tienes una forma de extender la clase Product para incluir los accesorios. Crea un archivo override/classes/Product.php con el siguiente contenido. Luego, limpia la caché de PrestaShop para que el override se compile.
class Product extends ProductCore
{
public $accessories_data;
public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
{
parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
if ($id_product) {
$this->accessories_data = $this->getAccessories($id_lang);
}
}
// Asegúrate de que este override se compile. Elimina cache/class_index.php
}
Explicación:
- Hemos añadido una propiedad
$accessories_data a la clase Product.
- En el constructor, si se carga un producto (
$id_product), se llama a getAccessories() y se guarda el resultado en $accessories_data. Esto hace que los accesorios estén disponibles cuando se instancia un objeto Product.
Una vez hecho esto, en tus archivos .tpl de listado de productos (por ejemplo, themes/classic/templates/catalog/_partials/miniatures/product.tpl), puedes acceder a los accesorios de cada producto así:
{if !empty($product.accessories_data)}
<div class="product-accessories">
{foreach from=$product.accessories_data item=accessory}
<a href="{$accessory.link}">{$accessory.name}</a>
{/foreach}
</div>
{/if}
Este enfoque inyecta los accesorios directamente en el objeto Product cuando se carga, haciéndolos accesibles en cualquier plantilla donde se use ese objeto. Sin embargo, para una solución más robusta y que no tengas que mantener en cada actualización, considera un módulo dedicado. Para una automatización de accesorios en lista existen soluciones que gestionan esto de forma más limpia y con menos riesgo de conflictos.