Magento 1.8.1.0 : changements sur l'envoi d'email de confirmation de commande

⏲️ ~3 min de lecture

Publié le par Pierre
Magento

Impact sur statut commandes avec Quadra Cybermut

La version 1.8.1.0 de Magento CE sortie il y a tout juste un mois contient un changement qui est passé inaperçu et peut causer quelques problèmes aux utilisateurs voire des régressions, par exemple le module de paiement Quadra Cybermut.

Cela concerne l'envoi d'emails de confirmation de commandes. Les 4 lignes suivantes ont été ajoutées dans Mage_Sales_Model_Order::sendNewOrderEmail , avec visiblement pour but d'empêcher l'envoi de cet email en double :

$emailSentAttributeValue = $this->load($this->getId())->getData('email_sent');
$this->setEmailSent((bool)$emailSentAttributeValue);
if ($this->getEmailSent()) {
   return $this;
}

Cet ajout pose à priori plusieurs problèmes, et peut vous faire passer quelques heures de débuggage au fin fond de votre application ! Nous sommes passés par là et avons détecté ce problème après une session intensive de pair debugging avec notre voisin Mokadev :)

Régression sur la fiche de commande #

Le premier problème est une régression fonctionnelle sur la page de gestion d'une commande en administration. En effet, le bouton "Envoyer un email" est toujours affiché dans la version 1.8.1.0 bien que les lignes mentionnées precédemment bloquent l'envoi.

dans Magento dans Magento

Sachez donc que le clic sur ce bouton n'aura strictement aucun effet ! L'email ne sera pas renvoyé au client.

Solutions :

Effet de bord dans l'application #

Un autre problème un peu plus fin est l'effet de bord induit par l'ajout de ces lignes (un peu bizarres il faut le dire). En effet, les données du modèle sont entièrement rechargées à la ligne :

$emailSentAttributeValue = $this->load($this->getId())->getData('email_sent');

Une conséquence est donc que l'appel à cette méthode ne doit pas être effectué lorsque vous êtes en train de modifier les données d'une commande. Nous vous invitons donc à vérifier les appels à cette méthode dans vos modules. Ci-dessous un exemple de code issu du module de paiement Cybermut de Quadra pour illustration :

$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, $status, $message);
// [...]
if (!$order->getEmailSent()) {
   $order->sendNewOrderEmail();
}
// [...]
$order->save();

L'appel àsendNewOrderEmail  va ici recharger toutes les données du modèleOrder  et l'appel à $order->save()  ne prendra pas en compte le nouvel état de la commande défini au dessus.

Solution : pour ce cas précis déplacer l'appel à $order->save();  avant l'envoi du mail de confirmation résoud le problème (nous avons d'ailleurs effectué une Pull Request à ce sujet).

Conclusion #

Soyez conscients de ce changement lors des montées en version de vos boutiques actuelles, surtout si vous utilisez Quadra Cybermut et appliquez le patch qui vous semble le plus judicieux à votre contexte.

Voici les extensions de Quadra forkées et corrigées par nos soins (dans l'attente d'acceptation de nos pull requests ?) :

Cet article vous a plu ? Sachez que nous recrutons !

← Accueil