Corriger l'alerte de disponibilité sur les produits configurables dans Magento
⏲️ ~2 min de lecture
Lors d'une itération sur un projet client, nous avons été confrontés à une anomalie non répertoriée sur le bugtracker de Magento concernant l'alerte de disponibilité d'un produit configurable. Ce bug semble être présent depuis le début de l'implémentation de cette fonctionnalité. Nous avons donc ouvert un ticket pour alerter la core team de ce problème. Après une séance de pair-programming, nous avons trouvé une solution.
L'anomalie #
Lorsqu'un utilisateur demande à être notifié de la disponibilité d'un produit configurable actuellement épuisé, lors de la nouvelle disponibilité du produit, il ne reçoit pas l'alerte mail.
Ce problème est dû au contexte d’exécution de la tâche CRON qui lors de la vérification de la disponibilité des produits enfants va charger le storeId
de l'administration. Le stock des produits enfants n'est pas retourné lors de l'appel de la méthode isSalable()
. L'alerte de disponibilité n'est donc pas envoyée par mail.
Le correctif #
Nous allons donc devoir émuler un contexte de magasin public pour pouvoir récupérer les bonnes informations.
Magento utilise dans l'observer Mage_ProductAlert_Model_Observer
l'émulation pour charger les thèmes par boutique lors d'envoi des emails transactionnels dans une tâche CRON. Pour information l'émulation des magasins est en place depuis Magento 1.5.
Pour corriger ce problème, nous allons donc réécrire l'observer Mage_ProductAlert_Model_Observer
pour surcharger la méthode _processStock()
:
protected function _processStock(Mage_ProductAlert_Model_Email $email) { /* On se place dans un contexte de vue magasin publique */ $appEmulation = Mage::getSingleton('core/app_emulation'); foreach ($this->_getWebsites() as $website) { /* @var $website Mage_Core_Model_Website */ $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($website->getDefaultStore()->getId()); ... ... $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo); } return $this; }
Avec ces trois petites lignes de code, on rétabli le comportement attendu :)
Nous espérons que cette anomalie sera corrigée dans une prochaine version de Magento.
Cet article vous a plu ? Sachez que nous recrutons !