2010-01-29 115 views
7

在Magento中,您可以從另一個模塊中的一個模塊(最常見的是Magento Adminhtml模塊)重寫一個塊(或助手,或模型等) 。現在我遇到了一個問題,我想覆蓋已被其他擴展覆蓋的塊。有什麼辦法可以告訴magento在佈局更新中忽略與<remove>標籤類似的其他模塊配置中的<rewrite>標籤?覆蓋多個模塊中的magento塊(以及如何忽略其他模塊)

下面是其他擴展的配置:

<blocks> 
     <adminhtml> 
      <rewrite> 
        <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
      </rewrite> 
     </adminhtml> 
    </blocks> 

這裏我擴展的配置:

<blocks> 
     <adminhtml> 
      <rewrite> 
        <catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
      </rewrite> 
     </adminhtml> 
    </blocks> 

我綜合了塊的功能從Symmetrics_DeliveryTime到我自己的塊,現在我希望magento忽略來自該模塊的重寫塊。

是否有任何magento的方式來做到這一點,或者是唯一的方式來評論配置(這是我現在所做的),包括所有的麻煩,同時更新模塊?

回答

9

如果你的模塊設置在一個說的也是這樣做的重寫「依賴」,你的配置將被放在最後閱讀並重寫要堅持,在適當的應用程序的/ etc /模塊中的文件,你應該有:

<config> 
    <modules> 
    <Your_Module> 
     <active>true</active> 
     <codePool>local</codePool> 
     <depends> 
     <Other_Module/> 
     </depends> 
    </Your_Module> 
    <modules> 
<config> 
+0

優良工程......但現在還有其他的模塊和Magento的一個「真實」的依賴會抱怨,如果沒有安裝其他的模塊...在我的情況下,這是可以的,但在magento中多次重寫的乾淨解決方案將會很好......也許有一天;) – 2010-02-03 20:45:17

0

我看了一下類加載,它看起來不像是一個乾淨的解決方案。相關的類名加載代碼是這樣的:

if (isset($this->_classNameCache[$groupRootNode][$group][$class])) { 
     return $this->_classNameCache[$groupRootNode][$group][$class]; 
    } 

    ... 

    if (isset($config->rewrite->$class)) { 
     $className = (string)$config->rewrite->$class; 

所以看起來好像沒有重寫改寫那樣的東西。被放入配置數組的那個被加載,一旦被緩存,它就會根據請求返回。我也沒有看到簡單的方法來破解緩存。你可以試着優先考慮你的模塊(我假設它是按字母順序重命名的),但這是一個徹頭徹尾的黑客攻擊,可能會在以後神祕地失敗。這殺死了配置的可能性。同樣令人討厭:它看起來像Magento只需要在(您可以輕鬆覆蓋)內的兩個地方請求網格,但也可以在Mage_Adminhtml_Catalog_ProductController(d'oh!)內請求網格。根據您的使用情況,考慮覆蓋產品目錄塊並用您自己的功能替換_prepareLayout()功能。如果您想要重寫控制器,則需要創建自己的控制器(從Mage_Adminhtml_Catalog_ProductController開始),並在您的配置中定義一個重寫,以便將admin/catalog/product/grid引導至您的操作。痛苦,但至少可以達到你的目標。

希望幫助,

0

不是重寫catalog_product_grid,爲什麼不上Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid延長?這樣Symmetrics模塊將保持所有功能,並且可以添加你的功能。

所以不是:

<blocks> 
    <adminhtml> 
     <rewrite> 
       <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
     </rewrite> 
    </adminhtml> 
</blocks> 

做到這一點:

<blocks> 
    <adminhtml> 
     <rewrite> 
       <deliverytime_catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</deliverytime_catalog_product_grid> 
     </rewrite> 
    </adminhtml> 
</blocks> 

當然不是依賴於你的應用程序的/ etc/modules文件將配件。

0

最好的方法來解決這個問題,使用,觀察者之前或之後的佈局。

應用程序/代碼/本地/我/模塊的/ etc/config.xml中

<config> 
<adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_before> 
      <observers> 
       <mymodule> 
        <!-- Add column to catalog product grid --> 
        <class>mymodule/adminhtml_observer</class> 
        <method>onBlockHtmlBefore</method> 
       </mymodule> 
      </observers> 
     </core_block_abstract_prepare_layout_before> 
    </events> 
</adminhtml> 

或可以使用事件:core_block_abstract_prepare_layout_after

而且在觀察報:

class My_Module_Model_Adminhtml_Observer 
{ 
    public function onBlockHtmlBefore(Varien_Event_Observer $observer) { 
    $block = $observer->getBlock(); 
    if (!isset($block)) return; 

    switch ($block->getType()) { 
     case 'adminhtml/catalog_product_grid': //or here you can put any other block 

      /*For example i am using Mage_Adminhtml_Block_Catalog_Product_Grid, and want to add a column*/ 

      $block->addColumn('COLUMN_ID', array(
       'header' => Mage::helper('mymodule')->__('COLUMN HEADER'), 
       'index' => 'COLUMN_ID', 
      )); 
      break; 

      case 'adminhtml/catalog_product_edit_tabs': 

      /*Or i want to add new tab to admin product edit*/ 
       /* @var $block Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs */ 
      $block->addTab('tab_name', array(
         'label'  => Mage::helper('catalog')->__('Tab Tilte'), 
         'content' => $block->getLayout()->createBlock('modulename/adminhtml_product_edit_tabname')->toHtml(), 
         'after'  => 'inventory', 
      )); 
      break; 
    } 
    } 
} 

同時添加標籤,然後你可以把產品標籤編輯參考使用你模塊,表單字段添加到這一點。

希望這將有助於有人:)