Bob van Luijt
Bob van Luijt

Reputation: 7588

Magento trigger observer with custom orderstatus

I'm creating a Magento module and I want the Observer to trigger when my custom orderstatus is chosen.

Practical situation: People select: 'Payment Received' the //DO STUFF in the Observer is triggered.

This ain't working, so what is wrong here? (the status shows up correctly though) :-(

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>

And my Observer.php looks like:

class MOD_PaidStatus_Model_Observer {

public function observeAttributeChange($observer){
    $attribute = $observer->getEvent()->getAttribute();
    if  ($attribute->getAttributeCode() == 'status') {
        mail('[email protected]', 'testcase', 'foo bar?');
    }
}

}

Upvotes: 0

Views: 1337

Answers (2)

Oleg Ishenko
Oleg Ishenko

Reputation: 2233

In order to be able to execute some actions on changing the order's attribute "status" it is preferable to observe an event. In this case the event would be sales_order_resource_save_attribute_after. The observer function could be set up as follows:

class YourPackage_YourModule_Model_Observer {

public function observeAttributeChange($observer) 
{

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

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

In your config.xml enter the necessary observer configuration

<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>

Upvotes: 1

dagfr
dagfr

Reputation: 2384

You can do this with rewriting or observer.

You do a kind of mix of these 2 concepts.

To use rewrite, do not name your file Observer, use something like Order.php :

class MOD_PaidStatus_Model_**Order** extends Mage_Sales_Model_Order

and in your config.xml, in the global node, add this :

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

If you want to go through an Observer, use the name Observer.php and the classname should be :

MOD_PaidStatus_Model_Observer

and it shouldn't extends anything.

The function is more like

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

But your should listen for a order_status_changed_after event that doesn't exist, so you add to trigger it too... Very big stuff if you're not a confirmed developer.

If you want something like this, you need an event node in your config.xml file to associate your Observer and its method to the event. Make some search about event handling in Magento

Regards,

Edit.: for observer and event way, look the previous post. But handling such a generic event is a very resource consuming way.

Upvotes: 0

Related Questions