如何重写已经重写的课程?
-
16-10-2019 - |
题
更新: 我发现我实际上需要重写的课程是 SMDesign_SMDZoom_Block_Product_View_Media
并不是 SMDesign_ColorswatchProductView_Block_Product_View_Media
就像我最初想的那样。但是,同样的问题仍然适用。
SMDESIGN SMDZOOM扩展重写块类“目录/product_view_media”。这样的XML看起来像这样:
<global>
...
<blocks>
<smdzoom>
<class>SMDesign_SMDZoom_Block</class>
</smdzoom>
</blocks>
<blocks>
<catalog>
<rewrite>
<product_view_media>SMDesign_SMDZoom_Block_Product_View_Media</product_view_media>
</rewrite>
</catalog>
</blocks>
....
</global>
我想再次重写此课程。我想重写该SMDZoom模块正在重写的目录/product_view_media类。可以做到吗?我的模块中的配置XML会是什么样?
当前,这是我的模块init xml文件:
<config>
<modules>
<Goorin_SMDZoom>
<active>true</active>
<codePool>local</codePool>
</Goorin_SMDZoom>
<depends>
<Mage_Catalog />
<SMDesign_SMDZoom />
</depends>
</modules>
</config>
和模块config.xml文件:
<global>
<blocks>
<gbismdzoom>
<class>Goorin_SMDZoom_Block</class>
</gbismdzoom>
<catalog>
<rewrite>
<product_view_media>Goorin_SMDZoom_Block_Product_View_Media</product_view_media>
</rewrite>
</catalog>
</blocks>
</global>
我的新课程看起来像是这样的测试:
class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
public function _construct() {
parent::_construct();
}
}
我正在通过显示模板路径提示来测试此内容,并且我看到在产品视图页面上仍在使用Smdesign块。我究竟做错了什么?
解决方案
我说 <depends>
在我的模块的启动XML文件中的错误位置中的节点。它必须嵌套在模块名称的节点中,就像这样:
<config>
<modules>
<Goorin_SMDZoom>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Catalog />
<SMDesign_SMDZoom />
</depends>
</Goorin_SMDZoom>
</modules>
</config>
其他提示
这部分在这里:
<colorswatchproductview>
<rewrite>
<product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
</rewrite>
</colorswatchproductview>
只有在原始实例化完成时,才会为您提供帮助 createBlock('colorswatchproductview/product_view_media)
这是不太可能的,因为第一个扩展程序是使用重写,即他们想在任何地方显示它们
createBlock('catalog/product_view_media')
用来
一种选择是对同一块使用重写
<catalog>
<rewrite>
<product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
</rewrite>
</catalog>
然后在您的块类中扩展其他扩展块
class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media
为此,需要在第一个后加载您的扩展名。在我的测试中 http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-looser/ 我弄清楚加载顺序基于您的应用程序/etc/模块/XML文件的字母顺序。另外,该顺序可以通过使用依赖节点(smdesign_colorswatchproductview)来影响该顺序。
您正在看到错误消息,因为您正在尝试隔离块,但是它需要一种产品,该产品从其父块中加载:
abstract class Mage_Catalog_Block_Product_View_Abstract extends Mage_Catalog_Block_Product_Abstract
{
/**
* Retrive product
*
* @return Mage_Catalog_Model_Product
*/
public function getProduct()
{
$product = parent::getProduct();
if (is_null($product->getTypeInstance(true)->getStoreFilter($product))) {
$product->getTypeInstance(true)->setStoreFilter(Mage::app()->getStore(), $product);
}
return $product;
}
这就是为什么重写核心课程很烂的原因。
从那里拍摄的臀部,但我认为您最好的选择是扩展颜色样本实现 Mage_Catalog_Blog_Product_View_Media
然后使您的模块取决于颜色色板模块。
艾伦·斯托姆(Alan Storm)回答了一个类似的问题 这里.
甚至最好是尝试通过观察者做任何您尝试做的事情。