Adakah yang bisa menjelaskan perbedaan antara peristiwa ini. Tolong, cepat dan kotor saja. Terima kasih.
Saya memiliki metode Pengamat seperti:
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);
}
}
Itu tidak sampai ke sendStatusMail()
Saya mengaitkan ke acara:
<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>
Haruskah saya menggunakan: catalog_product_save_commit_after
TUJUAN:
Minta email dikirim setelah produk dinonaktifkan.
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
metode ini
sumber
sumber
<catalog_product_status_update>
Jawaban:
Penghematan terjadi dalam transaksi MySQL dan
save_after
acara tersebut dipicu sebelum transaksi dilakukan, sehingga Anda dapat melakukan pembaruan tambahan dalam database dalam transaksi yang sama.The
save_commit_after
event dipicu setelah transaksi telah dilakukan, yaitu ketika perubahan ditulis ke database.Selain itu, aktif
save_commit_after
,_hasDataChanges
properti sudah disetel ulangfalse
, jadi cek Anda tidak akan berfungsi. Di sisi lain, jika tidak ada perubahan, kedua peristiwa bahkan tidak akan dipicu, karena Mage_Core_Model_Abstract :: save () tidak melakukan apa-apa jika tidak ada perubahan data:Yang sedang berkata, saya tidak melihat mengapa kode Anda seharusnya tidak berfungsi.
sumber
Mari kita lihat entitas produk tabungan.
Berikut adalah kode fungsi komit:
Mari kita lihat contoh kita lebih dekat.
$this->getConnection()->commit();
masukkan nilai ke dalam DB untuk level 1 kami (ini Stock). Jika sesuatu yang buruk terjadi di sini, pengecualian akan dilemparkan dan semua perubahan akan dibatalkan.Kemudian ia pergi untuk memproses panggilan balik. Karena kita saat ini di level 1, tidak ada panggilan balik yang akan dipanggil. Dan kami pindah dari catalog_product_after_save acara untuk melakukan perubahan produk (0 level).
$this->getConnection()->commit();
memasukkan nilai ke dalam DB untuk level 0 kami (itu Produk itu sendiri). Jika sesuatu yang buruk terjadi di sini pengecualian juga akan dibuang dan semua perubahan juga akan dibatalkan.Kemudian kami akan beralih ke eksekusi callback. Sekarang kita berada di level 0 dan callback akan dijalankan. Apa pun di dalam diri Anda yang buruk
call_user_func($callback);
akan ditangkap dan baru saja dicatat. Tidak ada yang akan dibatalkan jika panggilan balik menyebabkan pengecualiansumber