2012-07-01 59 views
2

我想重載從核心saveAction方法/法師/ Adminhtml /控制器/目錄/ ProductController.php和它不會工作 - 現在我已搜查,並試圖爲一個完整的一天:(Magento:重載Adminhtml/Productcontroller的saveAction方法不起作用...?

背景:我想在產品保存之前更改自定義屬性的值,我發現_initProductSave設置了屬性,我認爲,在init_ProductSave之後更改它們會是一個好點(如果有人知道更好的地方請讓我知道)...

可能請人幫助我... :)

Magento的版本:社區版版本1.7.0.1 沒有擴展名的,沒有安裝的主題,我剛安裝了這個版本完全空白......

版本1:通過複製到本地/法師文件夾 Overwritting控制器

首先,我試圖將文件複製到應用程序/代碼/本地文件夾,在正確的結構內 - 但它不會工作(我已經爲Varient.php做了本地測試系統和商店.php糾正價格bug - 對於它的工作...)

版本2:與擴展Overwritting控制器

我的分機是這樣的:

文件結構:

code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php 
code/local/MyOne/MyExtension/etc/config.xml 
etc/modules/MyOne_MyExtension.xml 

的文件看起來如下: MyOne_MyExtension .xml:

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
     <MyOne_MyExtension> 
      <active>true</active> 
      <codePool>local</codePool> 
     </MyOne_MyExtension> 
    </modules> 
</config> 

代碼/本地/ MyOne/MyExtension的/ etc/config.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
     <MyOne_MyExtension> 
      <version>1.0.0</version> 
     </MyOne_MyExtension> 
    </modules> 
    <admin> 
     <routers> 
      <adminhtml> 
       <args> 
        <modules> 
         <MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension> 
        </modules> 
       </args> 
      </adminhtml> 
     </routers> 
    </admin> 
</config> 

和最後一個,代碼/本地/ MyOne/MyExtension /控制器/目錄/ ProductController.php:

<?php 
require_once 'Mage/Adminhtml/controllers/Catalog/ProductController.php'; 

class MyOne_MyExtension_Catalog_ProductController extends Mage_Adminhtml_Catalog_ProductController 
{ 
    public function saveAction() 
    { 
     // do my stuff 
     die('reached method'); 
     // after pressing on save, there should no be a white screen ... 
    } 
} 
?> 

我用Google搜索和閱讀那麼多,我沒有看到一個錯誤......

任何幫助真的會很棒!

問候, 馬蒂亞斯

回答

5

注:鑑於作爲目標的方法......

Mage_Adminhtml_Catalog_ProductController->_initProductSave() 

...這將是最好的做法,以排除使用adminhtml範圍的觀測消耗catalog_product_save_before事件。


「所有我試圖把文件複製到應用程序/代碼/本地文件夾中,正確的結構中的第一個......」

這不是一種罕見的開發方法,但它將永遠不會工作。 Magento動作控制器類別爲而非由自動加載器加載。它們是通過它們的真實文件系統路徑顯式加載的。因此,所謂的「包含路徑黑客」並不適用。

Ref。 Mage_Core_Controller_Varien_Router_Standard->getControllerFileName()

您的第二種方法 - 使用適當的自定義擴展進行重寫 - 是正確的方法。您只需要瞭解Magento如何找到動作控制器目錄並將動作控制器類與請求URL匹配。

在其config.xml中,所述Mage_Adminhtml模塊配置在管理路由器,它負責匹配所有管理相關的請求:

<admin> 
    <routers> 
     <adminhtml> 
      <use>admin</use> 
      <args> 
       <module>Mage_Adminhtml</module> 
       <frontName>admin</frontName> 
      </args> 
     </adminhtml> 
    </routers> 
</admin> 

前面配置片段做兩兩件事:在<frontName />節點增加一個模塊路由和<module />節點 - 連同已註冊的Mage_Adminhtml<codePool />值(「核心」) - 建立可找到動作控制器類的目錄,在此例中爲/[basepath]/app/code/core/Mage/Adminhtml/controllers/

模塊動作控制器通過向現有模塊路由添加其他候選匹配目錄來重寫工作。這是所有從配置解析:

<admin> 
    <routers> 
     <adminhtml> 
      <args> 
       <modules> 
        <MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension> 
       </modules> 
      </args> 
     </adminhtml> 
    </routers> 
</admin> 

如可以看到的,上述結構只是添加或當配置XML被編譯增加了admin/routers/adminhtml/args/節點。如何解釋和用於請求匹配與控制器匹配的「正常」過程非常相似。在上面的示例中,MyOne_MyExtension模塊有效地將目錄添加到Adminhtml模塊的目錄列表中。假設它在local codePool,上面的例子指向目錄

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/ 

如果在

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/Catalog/ProductController.php 

這在一個名爲

類包含一個 _initProductSave()方法是動作控制器類這會工作
MyOne_MyExtension_Catalog_ProductController_Catalog_ProductController 

希望這個解釋足以看到基於配置的控制器重寫目錄級別的工作,而不是通過指定一個特定的類(這是塊,幫助者和模型重寫的工作方式)。由於此配置添加了一個目錄,因此它不必重寫,因爲它可以用於爲給定模塊添加新操作。最終,只有在其他控制器類匹配「原始」控制器類之前,纔會發生操作控制器重寫。

+0

這一個也是正確的... :) 感謝! (救了我的一天;)) @benmarks:丹尼爾的解決方案也是你很好解釋的結果,不是嗎? – user617965

+0

,當然我也會向觀察員瞭解最佳做法,明天我也會測試那個,:) – user617965

4

由於Magento的只需要知道模塊名,找到路徑匹配的控制器,

變化:

<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension> 

到:

<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension</MyOne_MyExtension> 
+0

測試 - 該解決方案工程... 的我做錯了什麼的完整說明,如下所述。 非常感謝您的幫助! – user617965

+1

這種情況下的代碼是正確的,但解釋不正確。 – benmarks

+0

這是正確的,基於代碼,它的工作原理,基於解釋,你的回答是正確的:) [對不起,daniel;]] – user617965