Может кто-нибудь объяснить разницу между этими событиями. Просто быстро и грязно, пожалуйста. Спасибо.
У меня есть метод Observer, например, так:
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);
}
}
Это не добраться до sendStatusMail()
Я подключаюсь к событию:
<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>
Должен ли я использовать: catalog_product_save_commit_after
ЦЕЛЬ:
Получите электронное письмо после отключения продукта.
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
Этот способ
источник
источник
<catalog_product_status_update>
Ответы:
Сохранение происходит в транзакции MySQL, и
save_after
событие инициируется до фиксации транзакции, так что вы можете делать дополнительные обновления в базе данных в рамках той же транзакции.save_commit_after
Событие срабатывает после того, как сделка была совершена, то есть , когда изменения были записаны в базу данных.Кроме того
save_commit_after
,_hasDataChanges
свойство уже сброшеноfalse
, поэтому проверка не будет работать. С другой стороны, если бы не было никаких изменений, оба события даже не были бы вызваны, потому что Mage_Core_Model_Abstract :: save () ничего не делает, если не было никаких изменений данных:При этом я не понимаю, почему ваш код не должен работать.
источник
Давайте посмотрим на сохранение сущности продукта.
Вот код функции коммита:
Давайте посмотрим на наш пример более подробно.
$this->getConnection()->commit();
положить значения в БД для нашего 1-го уровня (это запас). Если здесь произойдет что-то плохое, будет сгенерировано исключение, и все изменения будут отменены.Затем идет обработка обратных вызовов. Поскольку мы в настоящее время на 1-м уровне, никакие обратные вызовы не будут вызываться. И мы выходим из события catalog_product_after_save, чтобы зафиксировать изменения продукта (уровень 0).
$this->getConnection()->commit();
положить значения в БД для нашего уровня 0 (это сам продукт). Если что-то плохое случится, исключение также будет сгенерировано, и все изменения также будут отменены.Затем мы переходим к выполнению обратных вызовов. Теперь мы на нулевом уровне, и обратные вызовы будут выполняться. Все, что вы плохо внутри,
call_user_func($callback);
будет поймано и просто зарегистрировано. Ничто не будет отменено, если обратный вызов вызовет исключениеисточник