Quelqu'un peut-il expliquer la différence entre ces événements. Juste rapide et sale s'il vous plaît. Je vous remercie.
J'ai une méthode Observer comme ça:
public function detectProductChanges($observer)
{
$product = $observer->getProduct();
$old = $product->getOrigData();
$new = $product->getData();
if ($product->hasDataChanges() && $old['status'] == 1 && $new['status'] == 2) {
$this->_sendStatusMail($product);
}
}
Il ne s'agit pas de sendStatusMail()
Je suis accro à l'événement:
<events>
<catalog_product_save_after>
<observers>
<productchange>
<type>singleton</type>
<class>A_ProductNotification_Model_Observer</class>
<method>detectProductChanges</method>
</productchange>
</observers>
</catalog_product_save_after>
</events>
Dois-je utiliser: catalog_product_save_commit_after
OBJECTIF:
Faites envoyer un e-mail après la désactivation du produit.
private function _sendStatusMail($product)
{
if (!Mage::getStoreConfig('trans_email/ident_custom3/email')) return false;
$emailTemplate = Mage::getModel('core/email_template');
$emailTemplate->loadDefault('elec_productnotification_tpl');
$emailTemplate->setTemplateSubject('Product has been disabled');
$emailTemplate->setSenderEmail($salesData['email']);
$emailTemplateVariables['style_number'] = $product->getElecStyle();
$emailTemplateVariables['frame_color'] = $product->getAttributeText('frame_color');
$emailTemplateVariables['size'] = $product->getAttributeText('size');
$emailTemplateVariables['elec_color'] = $product->getAttributeText('elec_color');
$emailTemplateVariables['store_name'] = Mage::getModel('core/store')->load($product->getStoreId())->getName();
$emailTemplateVariables['product_name'] = Mage::getModel('catalog/product')->load($product->getId())->getName();
$emailTemplateVariables['product_sku'] = $product->getSku();
$emailTemplateVariables['dates'] = date("F jS Y h:i:sA", strtotime('-7 hours'));
// Get General email address (Admin->Configuration->General->Store Email Addresses)
$emails = explode(',', Mage::getStoreConfig('trans_email/ident_custom3/email'));
foreach ($emails as $email) $emailTemplate->send($email, $product->getStoreId(), $emailTemplateVariables);
}
}
event-observer
ee-1.12
ee-1.12.0.2
cette méthode
la source
la source
<catalog_product_status_update>
Réponses:
L'enregistrement se produit dans une transaction MySQL et l'
save_after
événement est déclenché avant que la transaction ne soit validée, afin que vous puissiez effectuer des mises à jour supplémentaires dans la base de données au sein de la même transaction.L'
save_commit_after
événement est déclenché après la validation de la transaction, c'est-à-dire lorsque les modifications ont été écrites dans la base de données.De plus, le
save_commit_after
, la_hasDataChanges
propriété a déjà été réinitialiséefalse
, donc votre chèque ne fonctionnera pas. En revanche, s'il n'y avait pas de changements, les deux événements ne seraient même pas déclenchés, car Mage_Core_Model_Abstract :: save () ne fait rien s'il n'y avait pas de changements de données:Cela étant dit, je ne vois pas pourquoi votre code ne devrait pas fonctionner.
la source
Jetons un coup d'œil à la sauvegarde de l'entité produit.
Voici le code de la fonction commit:
Examinons notre exemple de plus près.
$this->getConnection()->commit();
mettre des valeurs dans DB pour notre 1er niveau (c'est Stock). Si quelque chose de mauvais se produit ici, une exception sera levée et toutes les modifications seront annulées.Ensuite, il va traiter les rappels. Comme nous sommes actuellement au 1er niveau, aucun rappel ne sera appelé. Et nous quittons l'événement catalog_product_after_save pour valider les modifications de produit (niveau 0).
$this->getConnection()->commit();
mettre des valeurs dans DB pour notre niveau 0 (c'est le produit lui-même). Si quelque chose de mauvais se produit ici, une exception sera également levée et toutes les modifications seront également annulées.Ensuite, nous passons à l'exécution des rappels. Nous sommes maintenant au niveau 0 et les rappels seront exécutés. Tout ce que vous avez de mal à l'intérieur
call_user_func($callback);
sera rattrapé et simplement enregistré. Rien ne sera annulé si le rappel provoque une exceptionla source