0

我正在创建一个 Magento 模块,我希望观察者在选择我的自定义订单状态时触发。

实际情况: 人们选择:'Payment Received'//DO STUFF在观察者中被触发。

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

配置.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?');
    }
}

}

4

2 回答 2

1

为了能够在更改订单的属性“状态”时执行一些操作,最好观察一个事件。在这种情况下,事件将是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>
于 2013-02-05T13:32:06.613 回答
0

您可以通过重写或观察者来做到这一点。

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

要使用重写,请不要将文件命名为 Observer,请使用Order .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.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 文件中的一个事件节点来将你的观察者及其方法与事件相关联。对 Magento 中的事件处理进行一些搜索

问候,

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

于 2013-02-05T13:34:38.323 回答