Bonjour @laetitia_store,
Le souci que vous décrivez est pertinent. La fonction getProducts() de l'objet Order est censée retourner un tableau d'arrays, mais dans des cas spécifiques (parfois avec des modules tiers, des environnements PHP ou des données corrompues), elle peut retourner un objet ou une valeur null/false même si des produits existent. L'opérateur ternaire is_array($products) ? $products : array() gère le cas null/false en passant un tableau vide, ce qui est correct si aucun produit n'est trouvé, mais problématique si un objet non-array est retourné et contient des données.
Pour garantir que PscCacheInvalidator::fromOrderProducts reçoive toujours un tableau exploitable, même si getProducts() renvoie un objet inattendu, une conversion explicite peut être appliquée. Cela force le retour à être un tableau, et si c'est un objet avec des propriétés, celles-ci seront converties en éléments du tableau. Si c'est null ou false, ça deviendra un tableau vide, ce qui est le comportement désiré dans l'absence de produits.
Voici la correction à appliquer dans votre fichier prestaspeedcache/prestaspeedcache.php:
function hookActionValidateOrder($params)
{
if (empty($params['order']) || !($params['order'] instanceof Order)) {
return;
}
$products = (array) $params['order']->getProducts(); // S'assure que $products est toujours un tableau
PscCacheInvalidator::fromOrderProducts($products);
}
Cette modification garantira que PscCacheInvalidator reçoit toujours un tableau. Pour une gestion du cache plus robuste et maintenable sur une boutique en production, où ce genre d'ajustements manuels peut être écrasé par des mises à jour, il est souvent préférable d'utiliser un module store performance optimization and full cache dédié qui gère ces cas limites de manière plus sophistiquée.