当扩展程序在全球范围内覆盖班级并且我想使用原始课程时该怎么办?

magento.stackexchange https://magento.stackexchange.com/questions/9

  •  16-10-2019
  •  | 
  •  

我们正在使用一个扩展程序,该扩展名覆盖mage_catalog_block_product_list_toolbar块。

<global>
    <blocks>
        <catalog>
            <rewrite>
                <product_list_toolbar>Amasty_Shopby_Block_Catalog_Product_List_Toolbar</product_list_toolbar>
            </rewrite>
        </catalog>
    </blocks>
</global>

尽管扩展名在分层导航类别的上下文中工作,但当我们将任意产品列表插入我们自己的内部模块中时,重写类不正常工作。如果我们仅出于测试目的进行扩展覆盖物,则一切正常。

在不编辑扩展开发人员的社区代码的情况下,我们如何仅针对我们自己的控制器撤消扩展程序的重写?

有帮助吗?

解决方案

警告:没有设计方法来完成系统中的要求。以下内容应该有效,但是我从未在生产系统上进行广泛尝试,并且在某些情况下可能会造成更多的麻烦。仅当您舒适地调试与更改工作系统重写有关的问题时,才继续进行。

步骤1正在取消重写。可以在运行时更改Magento配置树。因此,如果您运行以下代码

$config = Mage::getConfig();        
$config->setNode(
    'global/blocks/catalog/rewrite/product_list_toolbar',
    'Mage_Catalog_Block_Product_List_Toolbar'
);

然后Magento将实例化原始 Mage_Catalog_Block_Product_List_Toolbar 剩余请求的块。

步骤2在您的模块中决定在哪里调用。由于这仅适用于您的控制器,它正在重写一个块,该块直到控制器结束时才会实例化,我将在您的控制器类中添加一种方法

protected function _undoRewrites()
{
    $config = Mage::getConfig();        
    $config->setNode(
        'global/blocks/catalog/rewrite/product_list_toolbar',
        'Mage_Catalog_Block_Product_List_Toolbar'
    );    
}

然后只需在您的每个动作开始时调用此方法

public function indexAction()
{
    $this->_undoRewrites();
    $test = Mage::getSingleton('core/layout')->createBlock('catalog/product_list_toolbar');        
    var_dump($test);
}

这似乎有些笨拙,但是当您对Magento的系统对象变得聪明时,我认为笨拙(即显而易见)是个好主意。另一个地方可能是 controller_action_predispatch 或者 controller_action_predispatch_front_controller_action 事件和/或有条件地应用。

请记住,在调用此方法之前,不会撤消重写。这意味着如果您试图在致电之前实例化块 _undoRewrites, ,重写类将用于实例化对象。

其他提示

解决方案1:
您可以尝试在控制器中直接实例化类(PHP方式)

代替

$this->getLayout()->createBlock('catalog/product_list_toolbar');

就像是:

$block = New Magento_Catalog_Product_List_Toolbar;
$this->getLayout()->addBlock(....);

解决方案2:
另一种方法是在您的模块中创建一个新类,该类别扩展了原始类并使用该类。

解决方案3:
否则,如果扩展名没有地下水

如果同一类别名存在多个重写,则最后一个从config.xml“ wins”中解析了Magento Config Loader。我会通过:

  1. 创建自己的新扩展。
  2. 重写 catalog/product_list_toolbar 在您的扩展中
  3. 让您的块扩展 Mage_Catalog_Block_Product_List_Toolbar 而不是安排班。
  4. 自由评论您的班级解释,这种改写冲突是有意的。您不希望另一个运行Magerun尝试并“修复”您刚刚创建的重写冲突的开发人员。
  5. 在扩展程序的应用程序/etc/模块/blah.xml文件中添加依赖项,以确保在Amasty之后加载扩展名。

类似于弗朗切斯科(Francesco)上面建议的内容,但我相信您实际上可以将完整的班级名称传递给GetModel。这样,您仍在做同样的事情,但是使用核心方法来做到这一点。我不完全确定这种方法的利弊,但认为我会把它作为一个想法。

Mage::getModel('Mage_Catalog_Block_Product_List_Toolbar');

附带说明,我相信这将是在Magento2中加载类的标准方法。

恐怕您确实需要对扩展代码进行一些更改。不要自己重写班级 config.xml 再改变了 Amasty_Shopby_Block_Catalog_Product_List_Toolbar 延长您的课程,反过来延伸 Mage_Catalog_Block_Product_List_Toolbar.

许可以下: CC-BY-SA归因
scroll top