在SALES_ORDER_AFTER_SAVE事件中保存订单自定义字段

早上好,希望您一切都好,我们需要使用测量协议将离线数据发送到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社区分享这一点。希望它可以节省一些人的精力,编程愉快!!!!

希望本文对您有所帮助。请留下您的评论,让我们知道您的想法?谢谢。

相关文章

0 0 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论