Bonjour @arthurlyon et @arthurshop,
@arthurlyon, tu as bien identifié le problème. La ligne if (!Validate::isLoadedObject($cart)) est tout à fait correcte pour valider l'existence du panier. Le souci, c'est ce qui se passe après cette vérification si elle échoue. Actuellement, le contrôleur ne propose pas de fallback intelligent.
Pour gérer cela proprement sans planter l'interface, on peut modifier le code dans shipmethodrules/controllers/front/simulate.php pour soit créer un panier temporaire si l'ID fourni est invalide, soit renvoyer une réponse AJAX qui indique clairement l'échec de la simulation pour cette raison. Voici une approche simple qui crée un panier vide si celui fourni n'existe pas, permettant de continuer la simulation, même si elle sera moins pertinente :
if (!Validate::isLoadedObject($cart)) {
// Si le panier n'est pas valide, on en crée un nouveau temporaire
$cart = new Cart();
$cart->id_lang = (int) $this->context->language->id;
$cart->id_currency = (int) $this->context->currency->id;
$cart->id_shop = (int) $this->context->shop->id;
$cart->add();
}
Cette modification permettra au reste de la fonction postProcess de s'exécuter avec un objet Cart valide (mais vide), évitant l'erreur AJAX. Si tu as besoin de règles de livraison plus complexes ou de cacher certains transporteurs pour des catégories de produits spécifiques, tu pourrais envisager d' utiliser une solution pour hide express carriers for bulky product categories qui offre plus de flexibilité sans modifier le code directement. Mais pour ce cas précis, le snippet ci-dessus devrait résoudre ton problème immédiat.