覆盖多个模块中的magento块(以及如何忽略其他模块)

时间:2010-01-29 12:47:40

标签: php magento customization

在Magento中,您可以从另一个模块(最常见的是Magento Adminhtml模块)中覆盖一个块(或帮助器或模型等)。现在我遇到的问题是我想要覆盖已经被其他扩展覆盖的块。有没有办法告诉magento忽略其他一些模块配置中的<rewrite>标签,类似于布局更新中的<remove>标签?

以下是其他扩展程序的配置:

    <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方法可以做到这一点,或者是注释配置的唯一方法(这是我现在所做的),包括稍后更新该模块时的所有麻烦?

4 个答案:

答案 0 :(得分:9)

如果您将模块设置为“依赖”同时进行重写的模块,那么您的配置将被最后读取并且重写应该保持在app / etc / modules中的相应文件中,您应该具有:

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

答案 1 :(得分: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_Block_Catalog_Product(您可以轻松覆盖),但也在Mage_Adminhtml_Catalog_ProductController(d'oh!)。根据您的使用情况,请考虑覆盖目录产品块并将_prepareLayout()功能替换为您自己的功能块。如果您还要覆盖控制器,则需要创建自己的控制器(从Mage_Adminhtml_Catalog_ProductController开始)并在配置中定义重写以将admin/catalog/product/grid引导至您的操作。痛苦,但至少可以实现你的目标。

希望有所帮助,

答案 2 :(得分:0)

为什么不在Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid上进行扩展,而不是重写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>

当然,比你的app / etc / modules文件中的依赖项更合适。

答案 3 :(得分: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;
    }
  }
}

在添加标签时,您可以参考产品编辑标签,将表单字段添加到使用您的模块中。

希望这对某些人有帮助:))