Magento – How to update the layout file in observer

event-observerlayoutlayout-updatemagento-1.9

public function CodeOrdeStatus(Varien_Event_Observer $observer)
        {       
            $order = $observer->getEvent()->getPayment()->getOrder();
            $order=Mage::getModel('sales/order')->load($order->getEntityId());
            $order->setState(Mage_Sales_Model_Order::STATE_CANCELED, true);
            $order->setStatus("canceled");
            $order->save();
            Mage::log($order->getState(),true,'cancelorder.log');


        }

i want to update the my custom layout file inside this event

<checkout_cart_index>
    <reference name="content">   
      <block type="orderscancel/index" name="orderscancel_index" template="orderscancel/cart.phtml"/>   
    </reference>    
</checkout_cart_index>  

I tried

Mage::app()->getLayout()->getUpdate()->addUpdate('Mage::app()->getLayout()->getUpdate()->addUpdate('<reference name="head">
            <action method="addJs">
                <js>path/to/rahul.js</js>
            </action>
        </reference>
    </default>');
    Mage::app()->getLayout()->generateXml();

I have used the event sales_order_payment_cancel in config.xml

<events>
    <sales_order_payment_cancel>
        <observers>
            <change_order_status>
                <class>Ipp_Orderscancel_Model_Observer</class>
                <method>CodeOrdeStatus</method>
            </change_order_status>
        </observers>
    </sales_order_payment_cancel>
</events>

But it didn’t worked, please help me.
Thanks

Best Answer

You're on the wrong path here. To manipulate the layout programmatically, you don't need to write XML.

This XML code

<reference name="head">
    <action method="addJs">
        <js>path/to/rahul.js</js>
    </action>
</reference>

translates to this PHP code:

Mage::app()->getLayout()->getBlock('head')->addJs('path/to/rahul.js');

(provided that loadLayout() has been called before, so that the "head" block already exists, but is not rendered yet)

Related Topic