2010-01-29 94 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; 
    } 
    } 
} 

同时添加标签,然后你可以把产品标签编辑参考使用你模块,表单字段添加到这一点。

希望这将有助于有人:)