2010-06-30 109 views
14

我正在嘗試編寫一個觀察者,在下訂單時將導出訂單數據。我以前沒有寫過任何模塊。基於這篇文章我的實現:http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_methodmagento sales_order_place_after觀察員

到目前爲止我只是試圖觸發一些虛擬代碼寫入文件。我沒有看到我的日誌中顯示的任何內容,並且該文件未被修改。 apache用戶擁有該目錄的權限。我已經禁用了Magento設置中的配置緩存。我對一些命名約定有點困惑;我只是試圖效仿這個例子。任何人都知道我要去哪裏錯了?

在Magento /應用的/ etc /模塊

/Feed.xml:

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Feed_Sales> 
      <codePool>local</codePool> 
      <active>true</active> 
     </Feed_Sales> 
    </modules> 
</config> 
在Magento /應用程序/代碼/本地/飼料/銷售的/ 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 /應用/代碼/本地/供稿/銷售/型號/訂購/ 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; 
    } 
} 
?> 

在Debian萊尼與Apache2的Magento的1.4,如果它應該的問題,對於任何r陳奕迅。

回答

0

廢話。我犯傻了。我用命令行腳本對它進行了測試,就像我處理很多事情一樣,但該特定文件只能由命令行解釋器寫入,而不能由Apache解釋器寫入。我應該在昨晚早些時候離開辦公室。

對於記錄來說,這就是您如何觸發訂單放置操作。我會留給子孫後代。

3

該問題似乎與您的觀察員聲明。試試這個:

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

感謝您的建議。沒有注意到任何更改: - \ – jorelli 2010-07-01 14:24:01

+0

在查找更改之前,請確保清除了配置高速緩存。在每次頁面加載時都不讀取XML。 – 2010-07-01 14:53:59

+0

是的,我只是暫時完全禁用配置緩存。這是值得一提的,但^ _^ 記錄,你是完全正確的關於特定的類別。 'feedsales/order_observer'起作用。使用'Feed_Sales_Model_Order_Observer'的文字類名稱的 也適用。 但'sales/order_observer'不起作用。 – jorelli 2010-07-01 15:30:04

14

閱讀my articles,它們將幫助您從命名約定的角度理解發生了什麼,並使您瞭解了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 

結帳的Class/URI tab of Commerce Bug和嘗試輸入一些的URI(如sales/order)來獲取怎麼在這裏上的一個更好的主意。

另一個快速提示,當您嘗試獲取您的處理程序設置時,請爲每個頁面加載時觸發的事件執行此操作。然後,一旦你調用了你的方法,你可以將它切換到你想要的特定事件,而不必經歷整個購買過程。

最後,我意識到您正在複製示例,請考慮將您的模塊放在名稱不是Sales的文件夾中。我發現模仿Magento核心文件夾的名字只會增加一層額外的混亂,這並不是你在學習系統時需要的。