Kann jemand den Unterschied zwischen diesen Ereignissen erklären. Nur das schnelle und dreckige bitte. Vielen Dank.
Ich habe eine Observer-Methode wie folgt:
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);
}
}
Es kommt nicht zum sendStatusMail()
Ich bin an der Veranstaltung beteiligt:
<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>
Sollte ich verwenden: catalog_product_save_commit_after
TOR:
Lassen Sie sich eine E-Mail senden, nachdem das Produkt deaktiviert wurde.
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
diese Methode
quelle
quelle
<catalog_product_status_update>
Antworten:
Das Speichern erfolgt in einer MySQL-Transaktion und das
save_after
Ereignis wird ausgelöst, bevor die Transaktion festgeschrieben wird, sodass Sie innerhalb derselben Transaktion zusätzliche Aktualisierungen in der Datenbank vornehmen können.Das
save_commit_after
Ereignis wird ausgelöst, nachdem die Transaktion festgeschrieben wurde, dh als die Änderungen in die Datenbank geschrieben wurden.Außerdem wurde
save_commit_after
die_hasDataChanges
Eigenschaft bereits auf zurückgesetztfalse
, sodass Ihre Prüfung nicht funktioniert. Wenn es keine Änderungen gäbe, würden beide Ereignisse nicht einmal ausgelöst, da Mage_Core_Model_Abstract :: save () nichts tut, wenn es keine Datenänderungen gäbe:Davon abgesehen verstehe ich nicht, warum Ihr Code nicht funktionieren sollte.
quelle
Lassen Sie uns einen Blick auf das Speichern der Produktentität werfen.
Hier ist der Code der Festschreibungsfunktion:
Schauen wir uns unser Beispiel genauer an.
$this->getConnection()->commit();
Geben Sie Werte in die DB für unser 1. Level ein (es ist Stock). Wenn hier etwas Schlimmes passiert, wird eine Ausnahme ausgelöst und alle Änderungen werden zurückgesetzt.Dann werden Rückrufe verarbeitet. Da wir uns derzeit auf der 1. Ebene befinden, werden keine Rückrufe aufgerufen. Und wir verlassen das Ereignis catalog_product_after_save, um Produktänderungen (Stufe 0) festzuschreiben.
$this->getConnection()->commit();
Geben Sie Werte für unsere 0-Ebene in die Datenbank ein (es ist das Produkt selbst). Wenn hier etwas Schlimmes passiert, wird auch eine Ausnahme ausgelöst und alle Änderungen werden ebenfalls zurückgesetzt.Dann gehen wir zur Ausführung von Rückrufen über. Jetzt sind wir auf 0 und Rückrufe werden ausgeführt. Alles, was Sie drinnen schlecht
call_user_func($callback);
finden, wird eingeholt und nur protokolliert. Nichts wird zurückgesetzt, wenn ein Rückruf eine Ausnahme verursachtquelle