Alguém pode explicar a diferença entre esses eventos. Apenas o rápido e sujo, por favor. Obrigado.
Eu tenho um método Observer assim:
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);
}
}
Não está chegando ao sendStatusMail()
Estou entrando no evento:
<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>
Devo estar usando: catalog_product_save_commit_after
OBJETIVO:
Envie um email após o produto ser desativado.
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
este método
fonte
fonte
<catalog_product_status_update>
Respostas:
O salvamento acontece em uma transação do MySQL e o
save_after
evento é acionado antes que a transação seja confirmada, para que você possa fazer atualizações adicionais no banco de dados dentro da mesma transação.O
save_commit_after
evento é acionado após a transação ser confirmada, ou seja, quando as alterações foram gravadas no banco de dados.Além disso, em
save_commit_after
, a_hasDataChanges
propriedade já foi redefinida parafalse
, portanto, sua verificação não funcionaria. Por outro lado, se não houvesse alterações, os dois eventos nem seriam acionados, porque Mage_Core_Model_Abstract :: save () não fará nada se não houver alterações nos dados:Dito isto, não vejo por que seu código não deve funcionar.
fonte
Vamos dar uma olhada em salvar a entidade do produto.
Aqui está o código da função de confirmação:
Vamos dar uma olhada no nosso exemplo mais de perto.
$this->getConnection()->commit();
coloque valores no DB para o nosso 1º nível (é Estoque). Se algo ruim acontecer aqui, a exceção será lançada e todas as alterações serão revertidas.Em seguida, ele processa retornos de chamada. Como estamos atualmente no 1º nível, nenhum retorno de chamada será chamado. E estamos saindo do evento catalog_product_after_save para confirmar as alterações do produto (nível 0).
$this->getConnection()->commit();
coloque valores no DB para o nosso nível 0 (é o próprio produto). Se algo ruim acontecer aqui, a exceção também será lançada e todas as alterações também serão revertidas.Então, estamos migrando para a execução de retornos de chamada. Agora estamos no nível 0 e os retornos de chamada serão executados. Qualquer coisa ruim dentro dele
call_user_func($callback);
será alcançada e registrada. Nada será revertido se o retorno de chamada causar uma exceçãofonte