Magento使用自定义orderstatus触发观察者

时间:2013-02-05 13:09:07

标签: magento observers

我正在创建一个Magento模块,我想在选择自定义orderstatus时触发Observer。

实际情况: 人们选择:“收到付款”,“观察员”中的//DO STUFF被触发。

这不行,所以这里有什么问题? (虽然状态正确显示): - (

config.xml中:

    <?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MOD_PaidStatus>
            <version>1.0.0</version>
        </MOD_PaidStatus>
    </modules>
    <global>
        <sales>
            <order>
                <statuses>
                    <payment_received translate="label"><label>Payment Received</label></payment_received>
                </statuses>
                <states>
                    <processing translate="label">
                        <label>Processing</label>
                        <statuses>
                            <processing default="1"/>
                            <payment_received default="2" />
                        </statuses>
                        <visible_on_front/>
                    </processing>
                    <pending translate="label">
                        <label>Pending</label>
                        <statuses>
                            <pending default="1"/>
                            <payment_received default="2" />
                        </statuses>
                        <visible_on_front/>
                    </pending>
                </states>                  
            </order>            
        </sales> 
        <events>
                <sales_order_resource_save_attribute_after>
                        <observers>
                                <PaidStatus>                                        
                                        <class>MOD_PaidStatus/observer</class>         
                                        <method>observeAttributeChange</method>
                                        <type>singleton</type>
                                </PaidStatus>
                        </observers>
                </sales_order_resource_save_attribute_after>
        </events>
    </global>
</config>

我的 Observer.php 看起来像:

class MOD_PaidStatus_Model_Observer {

public function observeAttributeChange($observer){
    $attribute = $observer->getEvent()->getAttribute();
    if  ($attribute->getAttributeCode() == 'status') {
        mail('test@testcase.com', 'testcase', 'foo bar?');
    }
}

}

2 个答案:

答案 0 :(得分:1)

为了能够在更改订单属性“status”时执行某些操作,最好观察事件。在这种情况下,事件将是sales_order_resource_save_attribute_after。观察者功能可以设置如下:

class YourPackage_YourModule_Model_Observer {

public function observeAttributeChange($observer) 
{

    $attribute = $observer->getEvent()->getAttribute();

    if  ($attribute->getAttributeCode() == 'status') {
    // DO STUFF
    }
}

在config.xml中输入必要的观察者配置

<global>
        <events>
                <sales_order_resource_save_attribute_after>
                        <observers>
                                <your_observer_node_name>                                        
                                        <class>yourpackage_yourmodule/observer</class>         
                                        <method>observeAttributeChange</method>
                                        <type>singleton</type>
                                </your_observer_node_name>
                        </observers>
                </sales_order_resource_save_attribute_after>
        </events>
</global>

答案 1 :(得分:0)

你可以用重写或观察者来做到这一点。

你将这两个概念混合在一起。

要使用重写,请不要将文件命名为Observer,使用类似订单 .php的内容:

class MOD_PaidStatus_Model_**Order** extends Mage_Sales_Model_Order

并在config.xml中的全局节点中添加:

<models>
    <sales>
         <rewrite>
             <order>MOD_PaidStatus_Model_Order</order>
         </rewrite>
    </sales>
</models>

如果您想浏览Observer,请使用名称Observer.php,类名应为:

MOD_PaidStatus_Model_Observer

它不应该扩展任何东西。

该功能更像是

public function myEventHandling($event)
{
    $order = $event->getOrder();
    $status = $order->getStatus();
    //DO YOUR STUFF here
}

但你应该听一个不存在的order_status_changed_after事件,所以你也要添加来触发它......如果你不是一个确认的开发者,那就太大了。

如果你想要这样的东西,你需要在config.xml文件中有一个事件节点来将你的Observer及其方法与事件相关联。在Magento进行一些关于事件处理的搜索

此致

编辑:对于观察者和事件方式,请查看上一篇文章。但处理这样的通用事件是一种非常耗费资源的方式。