在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方法可以做到这一点,或者是注释配置的唯一方法(这是我现在所做的),包括稍后更新该模块时的所有麻烦?
答案 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;
}
}
}
在添加标签时,您可以参考产品编辑标签,将表单字段添加到使用您的模块中。
希望这对某些人有帮助:))