Bonjour @julienshop, @leatech52, @juliette_fr,
Le problème que vous décrivez est un classique sur les versions plus anciennes de PrestaShop 1.7, notamment avec des hooks comme ActionValidateOrderBefore. Le contexte du panier n'est pas toujours entièrement hydraté ou l'objet Cart peut ne pas être directement accessible ou être d'un type inattendu si d'autres modules ou des overrides s'en mêlent juste avant.
La ligne !($params['cart'] instanceof Cart) est correcte pour valider l'objet, mais si le panier est validé par un processus en arrière-plan ou par un module de paiement tiers qui ne passe pas un objet Cart entièrement formé, cela peut poser problème.
Pour rendre la vérification plus robuste et éviter les retours prématurés lorsque le panier est techniquement là mais pas en tant qu'instance Cart directe, on peut ajouter une vérification supplémentaire ou s'assurer que l'objet est bien chargé. Voici une version légèrement modifiée qui s'assure que le panier est un objet et tente de le charger si ce n'est pas le cas, ou au moins de ne pas bloquer si un ID de panier est présent.
function hookActionValidateOrderBefore($params)
{
if (!(int) Configuration::get('SHIPMETHODRULES_ENABLED')) {
return;
}
if (!isset($params['cart']) || !Validate::isLoadedObject($params['cart'])) {
// Tente de charger l'objet Cart si seulement l'ID est passé
if (isset($params['cart']->id) && $params['cart']->id > 0) {
$params['cart'] = new Cart((int)$params['cart']->id);
} else {
Ici, j'ai remplacé !($params['cart'] instanceof Cart) par !Validate::isLoadedObject($params['cart']) qui est plus souple et j'ai ajouté une petite logique pour recharger le panier si nous n'avons que son ID, ce qui arrive parfois. Cela permet de s'assurer que l'objet Cart est bien utilisable.
Pour une gestion plus avancée et maintenable de vos règles de livraison sans avoir à modifier directement le code des modules, je vous recommande d'explorer un module advanced shipping rules qui gère ces scénarios de manière plus robuste et centralisée.