代码之家  ›  专栏  ›  技术社区  ›  jorelli

magento销售\u订单\u放置\u后观察者

  •  14
  • jorelli  · 技术社区  · 14 年前

    http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method

    在magento/app/etc/modules/Feed.xml中:

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

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

    <?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关于Debian Lenny和Apache2,如果出于任何原因有关系的话。

    3 回复  |  直到 14 年前
        1
  •  14
  •   Alana Storm    14 年前

    my articles ,它们将帮助您从命名约定的角度理解正在发生的事情,并让您了解Magento的一些约定/假设。

    看看上面的例子,你有一些不太正确的地方。

    首先,etc文件夹中的文件命名错误

    magento/app/etc/modules/Feed.xml
    

    Packagename_Modulename ,所以你可能想

    magento/app/etc/modules/Feed_Sales.xml
    

    接下来,您将错误地指定类。你说呢

    sales/order_observer
    

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

    也就是说你想要

    feedsales/order_observer
    

    Class/URI tab of Commerce Bug 并尝试输入一些uri(如 sales/order )为了更好地了解这里发生了什么。

    另一个快速提示是,当您尝试设置处理程序时,请针对每次页面加载时触发的事件执行此操作。然后,一旦调用了方法,就可以将其切换到所需的特定事件,而不必经历整个购买过程。

    最后,我意识到您在复制示例,请考虑将模块放在一个名为 Sales

        2
  •  4
  •   Joe Mastey    14 年前

    问题似乎出在你的观察员声明上。试一试:

        <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>
    
        3
  •  0
  •   Chris jorelli    8 年前

    好吧,记录在案,这是你如何触发一个行动的顺序安排。我要留给后人。

        4
  •  0
  •   Rohit Chauhan    5 年前

    最好使用此事件而不是销售\订单\保存后和签出\一页\控制器\成功\操作

    checkout_submit_all_after
    

    它将工作,即使网站没有重定向到成功页面,因为一些错误,如互联网问题和所有。

    试着用下面的代码我的要求也一样

     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));
                    }           
            }
        }
    

    希望对你有帮助!