Magento创建自定义事件(order_status_changed)

时间:2013-10-14 06:48:34

标签: magento events module

我想创建一个事件,以便在订单状态更改为已完成时导出库存。

我创建模块以覆盖 Mage_Sales_Model_Order 并尝试生成事件

(sales_order_status_change)。

当我从magento管理面板查看并订购并更改订单状态以完成时,它的工作意味着在我的扩展类中打印一些东西,它显示,它很好。在这里我生成事件。(问题可能在这里,可能是事件未生成)

我创建了另一个模块来观察此事件。但我无法进入我的Observer课程。我无法打印任何内容并退出,意味着代码无法运行。

但是在同一个观察者类中,如果更改配置并观察其他事件(来自Magento内置事件),它可以工作。就像我测试 catalog_controller_product_view

一样

这是我的事件生成器模块。

应用程序的/ etc /模块/ Gol_Eventgenerator.xml

<?xml version="1.0"?>
<config>
  <modules>
    <Gol_Eventgenerator>
      <active>true</active>
      <codePool>local</codePool>
    </Gol_Eventgenerator>
  </modules>
</config>

应用\代码\本地\高尔\ Eventgenerator \等\ config.xml中

<?xml version="1.0" encoding="utf-8"?>
<config>
    <modules>
        <Gol_Eventgenerator>
            <version>0.1.0</version>
        </Gol_Eventgenerator>
    </modules>
    <global>
        <models>
            <sales>
                <rewrite>
                    <order>Gol_Eventgenerator_Model_Order</order>
                </rewrite>
            </sales>
        </models>
    </global>
</config>

应用\代码\本地\高尔\ Eventgenerator \模型\ Order.php

<?php
class Gol_Eventgenerator_Model_Order extends Mage_Sales_Model_Order
{
    public function setState($state, $status = false, $comment = '', $isCustomerNotified = null)
    {   
        //if I print something here and exit, it does will.
        Mage::dispatchEvent('sales_order_status_change', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified));
        return parent::setState($state, $status, $comment, $isCustomerNotified);
    }
}

以下是观察者模块的详细信息

应用程序的/ etc /模块/ Gol_Inventory.xml

<?xml version="1.0"?>
<config>
  <modules>
    <Gol_Inventory>
      <active>true</active>
      <codePool>local</codePool>
    </Gol_Inventory>
  </modules>
</config>

应用\代码\本地\高尔\库存\等\ config.xml中

<?xml version="1.0" encoding="utf-8"?>
<config>
    <modules>
        <Gol_Inventory>
            <version>0.1.0</version>
        </Gol_Inventory>
    </modules>        
    <global>        
        <events>
            <sales_order_status_change>
                <observers>
                    <Gol_Inventory_observer>
                        <type>singleton</type>
                        <class>Gol_Inventory_Model_Observer</class>
                        <method>exportEnventory</method>
                    </Gol_Inventory_observer>
                </observers>
            </sales_order_status_change>
        </events>
    </global>
</config>

应用\代码\本地\高尔\库存\模型\ Observer.php

<?php
class Gol_Inventory_Model_Observer
{
  public function exportEnventory($observer)
  {   
        echo "Inside exportEvnentory method";
        exit;
      //$order = $observer->getEvent()->getOrder();
      //$state = $observer->getEvent()->getState();
      //$status = $observer->getEvent()->getStatus();
  }
}

为前端和管理员生成事件的方式有什么不同吗???除了

,在配置文件中。

如果我没有遵循一些非常常见的事情,请提前抱歉。 magento新手。

我试图效仿。

THis

1 个答案:

答案 0 :(得分:0)

订单更改状态时没有任何事件,但您可以轻松检查订单是否正在更改状态以及现在的状态:

    public function exportEnventory(Varien_Event_Observer $observer)
    {
        $status = $observer->getEvent()->getOrder()->getStatus();
        $originalData = $observer->getEvent()->getOrder()->getOrigData();
        $previousStatus = $originalData['status'];

        if (($status !== $previousStatus) && ($status == Mage_Sales_Model_Order::STATE_COMPLETE)) {
            //do something when the order changes to status complete
        }
    }

编辑,并在您的config.xml中

<?xml version="1.0" encoding="utf-8"?>
<config>
    <modules>
        <Gol_Inventory>
            <version>0.1.0</version>
        </Gol_Inventory>
    </modules>        
    <global>        
        <events>
            <sales_order_save_after>
                <observers>
                    <Gol_Inventory_observer>
                        <type>singleton</type>
                        <class>Gol_Inventory_Model_Observer</class>
                        <method>exportEnventory</method>
                    </Gol_Inventory_observer>
                </observers>
            </sales_order_save_after>
        </events>
    </global>
</config>