web-dev-qa-db-ja.com

magento sales_order_place_afterobserver

注文時に注文データをエクスポートするオブザーバーを作成しようとしています。私はこれまでモジュールを書いたことがありません。この記事に基づいて実装: http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method

これまでのところ、ファイルに書き込むためにダミーコードをトリガーしようとしています。ログに何も表示されず、ファイルが変更されていません。 Apacheユーザーには、ディレクトリに対する権限があります。 Magentoの設定で構成のキャッシュを無効にしました。いくつかの命名規則について少し混乱しています。私はちょうど例に従おうとしました。誰かが私がどこで間違っているのか知っていますか?

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>

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

何らかの理由で問題が発生した場合は、Apache2を使用したDebianLenny上のMagento1.4。

14
jorelli

神聖ながらくた。私は愚かでした。多くのことを行うように、コマンドラインスクリプトでテストしましたが、その特定のファイルは、Apacheインタープリターではなく、コマンドラインインタープリターによってのみ書き込み可能でした。私は昨夜早くオフィスを出るべきだった。

ちなみに、これは注文時にアクションをトリガーする方法です。後世のために残しておきます。

0
jorelli

私の記事 を読んでください。命名規則の観点から何が起こっているのかを理解し、Magentoの規則/仮定のいくつかに基礎を置くのに役立ちます。

上記のサンプルを見ると、正しくないことがいくつかあります。

まず、etcフォルダ内のファイルの名前が間違っています

magento/app/etc/modules/Feed.xml

このファイルにはPackagename_Modulenameという名前を付ける必要があるため、おそらく

magento/app/etc/modules/Feed_Sales.xml

[システム]-> [構成]-> [詳細]を見て、モジュールが表示されるかどうかを確認します。もしそうなら、あなたはこのファイルに正しく名前を付けているでしょう。これがないと、作成したモジュールがシステムに読み込まれず、コードを実行する機会がありません。

次に、クラスを誤って指定しています。あなたは言う

sales/order_observer

しかし、URI(販売)の最初の部分は正しくありません。モデルセクションを次のように定義しました

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

つまり、あなたが欲しい

feedsales/order_observer

コマースバグの[クラス/ URI]タブ をチェックアウトし、いくつかのURI(sales/orderなど)を入力して、ここで何が起こっているかをよりよく理解してください。

もう1つの簡単なヒントは、ハンドラーをセットアップしようとしているときに、ページが読み込まれるたびに発生するイベントに対してそれを行うことです。次に、メソッドが呼び出されたら、それを必要な特定のイベントに切り替えることができ、購入プロセス全体を実行する必要はありません。

最後に、例をコピーしていることに気づきました。モジュールをSales以外の名前のフォルダーに配置することを検討してください。 Magentoのコアフォルダーの名前を模倣すると、混乱がさらに増えるだけで、システムの学習中に必要なものではありません。

14
Alan Storm

問題はオブザーバーの宣言にあるようです。これを試してみてください:

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

sales_order_save_afterとcheckout_onepage_controller_success_actionの代わりにこのイベントを使用することをお勧めします

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

それがあなたを助けることを願っています!

ハッピーコーディング!!

0
Rohit Chauhan