Hola @guillermo_lab,
El análisis de @miriamadmin y @sergioseller97 es correcto. En PrestaShop 9.1.0 y PHP 8.2 (o superior), Order::getProducts() está diseñado para devolver siempre un array (vacío o con productos). Si devuelve false o null, es una situación anómala.
El problema que describes, donde la caché no se vacía si getProducts() devuelve algo que no es un array, es una preocupación válida. Aunque tu código actual ya convierte el valor a un array vacío si no lo es, PscCacheInvalidator::fromOrderProducts probablemente espera un array con IDs de productos para invalidar. Si recibe un array vacío cuando debería haber productos, no realizará ninguna acción de invalidación.
Para asegurar la robustez y clarificar la intención, te sugiero una ligera modificación en el hookActionValidateOrder. Esto fuerza que $products sea siempre un array y luego solo llama al invalidador si hay productos reales en él:
function hookActionValidateOrder($params)
{
if (empty($params['order']) || !($params['order'] instanceof Order)) {
return;
}
$products = (array) $params['order']->getProducts(); // Aseguramos que siempre sea un array
if (!empty($products)) { // Solo invalidamos si hay productos reales
PscCacheInvalidator::fromOrderProducts($products);
}
}
Con esta modificación, la línea $products = (array) $params['order']->getProducts(); garantiza que $products sea siempre un array. Luego, la condición if (!empty($products)) asegura que PscCacheInvalidator::fromOrderProducts solo se llame cuando realmente hay productos asociados al pedido, evitando llamadas innecesarias o fallos silenciosos si getProducts() devolvió un valor que, al convertirse a array, resultó vacío pero el pedido sí tenía productos.
Prueba esto y nos cuentas.