早上好,希望您一切都好,我们需要使用测量协议将离线数据发送到Google Analytics(分析)后,在某个模块中设置一个标记。要设置此标志,我们通过在config.xml中添加条目来调用sales_order_after_save事件。
<event>
<sales_order_save_after>
<observers>
<scommerce_universalanalytics_order>
<class>scommerce_universalanalytics/observer</class>
<method>sendOrderDataToGoogle</method>
</scommerce_universalanalytics_order>
</observers>
</sales_order_save_after>
</events>
然后我们创建observer.php并定义config.xml中提到的sendOrderDataToGoogle函数,以更新订单自定义字段,即sales_flat_order中的send_data_to_google,该字段是作为sql升级脚本的一部分而创建的,作为sales_order_save_after调度事件的一部分。
/**
* Send order data to GA only on order creation
*
* @return void
*/
public function sendOrderDataToGoogle(Varien_Event_Observer $observer)
{
$objOrder = $observer->getEvent()->getOrder();
if (($order->getStatus() == Mage_Sales_Model_Order::STATE_PENDING_PAYMENT)|| ($order->getStatus() == Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW)) {
$objOrder->setSentDataToGoogle(1)
->save();
return;
}
......
}
但是每次调用此函数时,我们都会遇到内存耗尽错误,并且我们很难弄清楚原因,因为它应该可以正常工作。经过数小时的调试,我们发现在该时间点该订单尚未物理保存在数据库中,并且在执行保存功能时,该订单进入无限循环,从而导致超时或耗尽内存。
然后,我们终于找到解决问题的解决方案,我们更改了以下两行-:
从
$objOrder->setSentDataToGoogle(1)
->save();
至
$objOrder->setSentDataToGoogle(1);
$objOrder->getResource()->saveAttribute($objOrder, "sent_data_to_google");
瞧,send_data_to_google订单自定义字段被保存为sales_flat_order表中的值1,而没有更多的超时或内存耗尽的问题。由于这是几个小时的痛苦,我们认为我们应该与我们的Magento社区分享这一点。希望它可以节省一些人的精力,编程愉快!!!!
希望本文对您有所帮助。请留下您的评论,让我们知道您的想法?谢谢。