¿Alguien puede explicar la diferencia entre estos eventos? Solo lo rápido y sucio por favor. Gracias.
Tengo un método Observador como este:
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);
}
}
No está llegando al sendStatusMail()
Me estoy enganchando al 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>
¿Debería estar usando: catalog_product_save_commit_after
OBJETIVO:
Enviar un correo electrónico después de que el producto esté deshabilitado.
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
fuente
fuente
<catalog_product_status_update>
Respuestas:
El guardado ocurre en una transacción MySQL y el
save_after
evento se activa antes de que se confirme la transacción, para que pueda realizar actualizaciones adicionales en la base de datos dentro de la misma transacción.El
save_commit_after
evento se desencadena después de que se haya confirmado la transacción, es decir, cuando los cambios se escribieron en la base de datos.Además, en
save_commit_after
, la_hasDataChanges
propiedad ya se ha restablecidofalse
, por lo que su cheque no funcionaría. Por otro lado, si no hubiera cambios, ambos eventos ni siquiera se activarían , porque Mage_Core_Model_Abstract :: save () no hace nada si no hubo cambios en los datos:Dicho esto, no veo por qué su código no debería funcionar.
fuente
Echemos un vistazo a guardar la entidad del producto.
Aquí está el código de la función commit:
Echemos un vistazo a nuestro ejemplo más de cerca.
$this->getConnection()->commit();
poner valores en DB para nuestro primer nivel (es Stock). Si sucede algo malo aquí, se lanzará una excepción y todos los cambios se revertirán.Luego se va a procesar devoluciones de llamada. Como actualmente estamos en el 1er nivel, no se llamarán devoluciones de llamada. Y nos estamos mudando del evento catalog_product_after_save para confirmar los cambios del producto (nivel 0).
$this->getConnection()->commit();
poner valores en DB para nuestro nivel 0 (es el producto en sí). Si sucede algo malo aquí, también se generará una excepción y todos los cambios también se revertirán.Luego nos estamos moviendo a la ejecución de devoluciones de llamada. Ahora estamos en el nivel 0 y se ejecutarán devoluciones de llamada. Todo lo que sea malo en su interior
call_user_func($callback);
se pondrá al día y se registrará. No se revertirá nada si la devolución de llamada causa una excepciónfuente