2013-02-05 35 views
0

我创建一个Magento模块,我希望观察者触发时,我的自定义orderstatus被选中。Magento触发观察者与自定义orderstatus

实际情况: 人们选择:'Payment Received'在观察者中//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('[email protected]', 'testcase', 'foo bar?'); 
    } 
} 

}

回答

1

为了能够在更改订单的属性“状态”时执行某些操作,最好观察一个e发泄。在这种情况下,事件将是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> 
+0

谢谢,我已经更新了问题中的代码,但我不确定我是否理解。我仍然没有收到电子邮件:[email protected] –

+0

你可以检查是否调用了“observeAttributeChange($ observer)”函数吗? (使用调试器或插入日志调用)。如果是,attributeCode是否等于'状态'? –

0

你可以重写或观察员做到这一点。

你对这两个概念做了一些混合。

要使用重写,不命名您的文件观察,使用类似订购 .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文件中的一个事件节点来将你的Observer及其方法与事件关联起来。请有关事件的一些搜索在Magento处理

问候,

编辑:观察员和事件的方式,看看以前的帖子。但是处理这样的通用事件是非常耗资源的方式。

+0

感谢您的回答,我更新了这篇文章,但我仍然没有收到电子邮件,我看不到这里有什么问题:-S –