すでに書き直されたクラスを書き直す方法は?
-
16-10-2019 - |
質問
アップデート: 私は実際に書き直す必要があるクラスは SMDesign_SMDZoom_Block_Product_View_Media
そしてそうではありません SMDesign_ColorswatchProductView_Block_Product_View_Media
私が最初に思ったように。ただし、まったく同じ問題がまだ適用されます。
SMDESIGN SMDZOOM拡張機能は、ブロッククラスの「CATALOG/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>
私のモジュールのinit 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')
使用されている
1つのオプションは、同じブロックの書き換えを使用することです
<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-dloosers/ ロード順は、アプリ/etc/modules/xmlファイルのアルファベット順に基づいていることを確認しました。あるいは、この順序は、depenss node(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
そして、モジュールをカラースウォッチモジュールに依存させます。
アラン・ストームは同様の質問に答えました ここ.
さらに良いことに、オブザーバーを通してやろうとしていることは何でもしようとすることです。