Hola @martaadmin y @miguelpro,
@martaadmin, el problema que describes es un clásico con la flexibilidad de PrestaShop al devolver colecciones de datos. Order::getProducts() puede retornar una PrestaShopCollection de objetos OrderProduct en ciertos contextos, especialmente cuando se accede al pedido de una forma más orientada a objetos en vez de a través de métodos que fuerzan un array.
La PrestaShopCollection es iterable, pero is_array() devuelve false, lo que causa que la función PscCacheInvalidator::fromOrderProducts reciba un array vacío y no invalide nada.
La solución es asegurar que siempre le pasemos un array iterable de productos, convirtiendo cualquier objeto iterable a un array si no lo es ya. Puedes modificar el fragmento de código así:
function hookActionValidateOrder($params)
{
if (empty($params['order']) || !($params['order'] instanceof Order)) {
return;
}
$products = $params['order']->getProducts();
// Aseguramos que $products sea siempre un array iterable
$productsArray = is_array($products) ? $products : iterator_to_array($products);
PscCacheInvalidator::fromOrderProducts($productsArray);
}
Con iterator_to_array($products), si $products es una PrestaShopCollection (o cualquier otro objeto iterable), se convertirá en un array de sus elementos, lo cual es lo que PscCacheInvalidator necesita. Si ya es un array, is_array() se encargará y pasará el array directamente.