magento sales_order_place_after observer
Asked Answered
C

4

14

I'm trying to write an observer that will export order data when an order is placed. I haven't written any modules before. Basing my implementation on this article: http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method

so far I'm just trying to trigger some dummy code to write to a file. I'm not getting anything showing in my log, and the file's not being modified. The apache user has permission for the directory. I've disabled configuration caching in the Magento settings. I'm a little confused on some of the naming conventions; I just tried to follow the example. Anyone know where I'm going wrong?

in magento/app/etc/modules/Feed.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Feed_Sales>
            <codePool>local</codePool>
            <active>true</active>
        </Feed_Sales>
    </modules>
</config>

in magento/app/code/local/Feed/Sales/etc/config.xml:

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <feedsales>
                <class>Feed_Sales_Model</class>
            </feedsales>
        </models>
        <events>
            <sales_order_place_after>
                <observers>
                    <feed_sales_order_observer>
                        <type>singleton</type>
                        <class>sales/order_observer</class><!-- I've also tried Feed_Sales_Model_Order_Observer here -->
                        <method>export_new_order</method>
                    </feed_sales_order_observer>
                </observers>
            </sales_order_place_after>
        </events>
    </global>
</config>

in magento/app/code/local/Feed/Sales/Model/Order/Observer.php:

<?php
class Feed_Sales_Model_Order_Observer
{
    public function __contruct()
    {

    }

    /**
     * Exports new orders to an xml file
     * @param Varien_Event_Observer $observer
     * @return Feed_Sales_Model_Order_Observer
     */
    public function export_new_order($observer)
    {
        Mage::log("reached export_new_order");
        try
        {
            $dumpFile = fopen('/home/jorelli/new_orders/testdump', 'w+');
            fwrite($dumpFile, 'this is a test!');
        }
        catch (Exception $e)
        {
            Mage::log("order export failed.\n");
        }
        return $this;
    }
}
?>  

Magento 1.4 on Debian Lenny with Apache2 if it should matter for any reason.

Choleric answered 30/6, 2010 at 23:9 Comment(0)
C
0

Holy crap. I was stupid. I tested it out with a command line script, like I do with a lot of things, but that particular file was only writeable by the command line interpreter, not the Apache interpreter. I should have left the office earlier last night.

Well for the record, this is how you trigger an action on order placement. I'll leave it up for posterity.

Choleric answered 1/7, 2010 at 14:29 Comment(0)
H
14

Read my articles, they'll help you understand what's going on from a naming convention standpoint and get you grounded in some of Magento's conventions/assumptions.

Looking at the samples above, you have a few things not quite right.

First, your file in the etc folder is named wrong

magento/app/etc/modules/Feed.xml

This file needs to be named Packagename_Modulename, so you probably want

magento/app/etc/modules/Feed_Sales.xml

Look at System -> Configuration -> Advanced to see if your module shows up. If it does, you'll have named this file correctly. Without this, the module you created isn't being loaded into the system, and your code never has a chance to run.

Next, you're specifying the class incorrectly. You say

sales/order_observer

but that first part of the URI (sales) is incorrect. You defined your models section as

    <models>
        <feedsales> <!-- this is your model part -->
            <class>Feed_Sales_Model</class>
        </feedsales>
    </models>

which means you want

feedsales/order_observer

Checkout the Class/URI tab of Commerce Bug and try entering some URIs (like sales/order) to get a better idea of what's going on here.

Another quick tip, when you're trying to get your handler setup, do it for an event that fires on every page load. Then, once you have your method being called, you can switch it to the specific event you want and not have to go through the entire purchase process.

Finally, and I realize you were copying examples, consider putting your module in a folder named something other than Sales. I find mimicking the names of Magento core folders only add an extra layer of confusion, which is not what you need while you're learning the system.

Holley answered 1/7, 2010 at 15:46 Comment(0)
C
4

The problem seems to be with your observer declaration. Give this a try:

    <events>
        <sales_order_place_after>
            <observers>
                <feed_sales_order_observer>
                    <type>singleton</type>
                    <class>feedsales/order_observer</class>
                    <method>export_new_order</method>
                </feed_sales_order_observer>
            </observers>
        </sales_order_place_after>
    </events>
Coulombe answered 1/7, 2010 at 3:39 Comment(2)
Make sure that you've cleared your configuration cache before you look for the change. XML is not read on every page load.Coulombe
yeah, I just disabled the config cache entirely for the time being. It's worth mentioning though ^_^ For the record, you were completely right about the particular class alias. feedsales/order_observer works. using the literal class name of Feed_Sales_Model_Order_Observer also works. but sales/order_observer doesn't work.Choleric
C
0

Holy crap. I was stupid. I tested it out with a command line script, like I do with a lot of things, but that particular file was only writeable by the command line interpreter, not the Apache interpreter. I should have left the office earlier last night.

Well for the record, this is how you trigger an action on order placement. I'll leave it up for posterity.

Choleric answered 1/7, 2010 at 14:29 Comment(0)
S
0

better use this event instead of sales_order_save_after and checkout_onepage_controller_success_action

checkout_submit_all_after

it will work even site not redirected to success page because of some errors like internet issue and all.

try to use below code my requirement also same

 namespace Custom\Checkout\Observer;

    use Magento\Framework\Event\Observer as EventObserver;
    use Magento\Framework\Event\ObserverInterface;
    use Magento\Framework\Simplexml\Element as SimpleXMLElement;

    class Afterplaceorder implements ObserverInterface
    {    
        protected $_request;
            protected $_layout;
        protected $_dir;
        protected $jsonHelper;
        protected $timezone;
        protected $_io;
        protected $_RandomBytes;

        public function __construct(
            \Magento\Framework\View\Element\Context $context,
            \Magento\Framework\Filesystem\DirectoryList $dir,
            \Magento\Framework\Json\Helper\Data $jsonHelper,
            \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
            \Magento\Framework\Filesystem\Io\File $io,
            \Magento\Framework\Math\Random $RandomBytes
        ){
            $this->_layout = $context->getLayout();
            $this->_request = $context->getRequest();
            $this->_dir = $dir;
            $this->jsonHelper = $jsonHelper;
            $this->timezone = $timezone;
            $this->_io = $io;
            $this->_RandomBytes = $RandomBytes;
        }


        /**
        * @param \Magento\Framework\Event\Observer $observer
        * @return void
        */
        public function execute(EventObserver $observer)
        {   
            $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/orderdata.log');
            $logger = new \Zend\Log\Logger();
            $logger->addWriter($writer);

            $order  = $observer->getData('order');
            $quote  = $observer->getQuote();

                try{                    
                    // function defination to convert array to xml
                        function array_to_xml( $data, &$xml_data ) {
                            foreach( $data as $key => $value ) {
                                if( is_numeric($key) ){
                                    $key = 'item'.$key; //dealing with <0/>..<n/> issues
                                }
                                if( is_array($value) ) {
                                    $subnode = $xml_data->addChild($key);
                                    array_to_xml($value, $subnode);
                                } else {
                                    $xml_data->addChild("$key",htmlspecialchars("$value"));
                                }
                             }
                        }


                        $data = array('total_stud' => 500);
                        // creating object of SimpleXMLElement
                        $xml_data = new SimpleXMLElement('<?xml version="1.0"?><order></order>');

                        // function call to convert array to xml
                        array_to_xml($orderDeatails,$xml_data);
                        //saving generated xml file;
                        if ( ! file_exists($this->_dir->getPath('var').'/api/order')) {
                            $this->_io->mkdir($this->_dir->getPath('var').'/api/order', 0775); 
                        }
                        $result = $xml_data->asXML($this->_dir->getRoot().'/var/api/order/order_'.$order->getIncrementId().'.xml');

                }catch(\Exception $e){
                    $logger->info(print_r('error-> '.$e->getMessage(),true));
                }           
        }
    }

hope it will help you!

Happy Coding!!

Stewart answered 20/1, 2020 at 14:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.