【问题标题】:Magento: Observer for order state is completeMagento:订单状态的观察者已完成
【发布时间】:2011-10-28 09:46:10
【问题描述】:

在 Magento 上,我正在开发一个佣金模块,我需要在销售完成而不是下订单时向我的代理支付。

理想情况下,我希望在订单状态变为“完成”时捕获它,但我还没有找到观察者来执行此操作?

我可以将它添加到装运观察器,但一个订单可以有多个装运,因此不正确。

或者,我总是可以启动一个 cron 作业来计算最后一小时的订单,但似乎又不是正确的方法。

关于什么是正确的方法的任何建议。

【问题讨论】:

    标签: magento


    【解决方案1】:

    使用观察者“sales_order_save_commit_after”或“sales_order_invoice_pay”然后您可以获得订单状态,并根据您的状态做您想做的事。这是一个例子:

    // for event sales_order_save_commit_after
    public function commissionCalculationOnComplete($observer)
    {
        $order = $observer->getOrder();
        if($order->getState() == Mage_Sales_Model_Order::STATE_COMPLETE){
        // do your order complete stuff
        }
    }
    

    // Event sales_order_invoice_pay
    public function triggerProvisionCalculation ($observer)
    {
        $invoice = $observer->getEvent()->getInvoice();
        switch ($invoice->getState()) {
            case Mage_Sales_Model_Order_Invoice::STATE_PAID :
                //do your stuff
                break;
        }
        return $this;
    }
    

    您必须检查您没有进行两次计算,因为每次保存订单时都会触发此方法。

    【讨论】:

    • 谢谢。快速提问:我应该使用 sales_order_save_commit_after 还是 sales_order_save_after ?当我在 /app/code/core 上执行 'grep -ri' 时,我找不到调用它们的位置。
    • 保存时从抽象模型触发提交事件,在方法afterCommitCallback()Mage::dispatchEvent($this->_eventPrefix.'_save_commit_after', $this->_getEventData());中。
    • 这两个事件的区别在于提交事件,你可以在数据库中完成提交后执行你的逻辑。这意味着如果您正在保存订单并在提交后使用事件,那么您的数据库是最新的。如果您需要来自数据库而不是直接来自对象的信息,并且您希望确保数据库中的一切正常,这将很有用。如果你使用事件‘sales_order_save_after’,对象$order可能没问题,但是你的数据库的语句仍然被事务锁定,并且可能发生错误并且你的数据的完整性可能不稳定。
    • 谢谢迪格林。扩展有很大帮助。正如您所建议的,使用 commit_after 确保数据库未锁定是最有意义的。非常感谢您的快速而恰当的回应。
    • sales_order_invoice_save_after 事件可能是此用途的更好选择。
    【解决方案2】:

    **magento 订单完成并取消数据库观察者上增量和减量的数量变化 ** 零/SalesOderafter/config.xml

        <config>
        <modules>
       <Zero_SalesOrderafter>
        <version>0.1.0</version>
      </Zero_SalesOrderafter>
      </modules>
      <global>
       <events>
       <sales_order_save_after>
                <observers>
                     <ordercancel>
                        <type>singleton</type>
                        <class>Zero_SalesOrderafter_Model_Observer</class>
                        <method>canCancelOrder</method>
                     </ordercancel>
                </observers>
         </sales_order_save_after>
       </events>
       </global>
        </config>
    
     path:Zero/SalesOrderafter/Observer.php
      class Wli_SalesOrderafter_Model_Observer 
       {
      public function canCancelOrder( Varien_Event_Observer $observer )
      { 
         $data = $observer->getEvent()->getOrder();
       if($data->getId())
        {
         $ProdustIds=array();
        foreach ($data->getAllVisibleItems() as $item)
         {
          $ProdustIds= $item->getProductId();
          }        
         } 
          $qty = $data->getData('total_qty_ordered');
          $order_status = $data->getStatus();
          $incrementId = $data->getData('increment_id');
        }       
    
         }
         ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多