すでに書き換えられたクラスを書き換える方法は?


15

更新:実際に書き換える必要があるクラスはSMDesign_SMDZoom_Block_Product_View_MediaSMDesign_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モジュールが書き換えているcatalog / product_view_mediaクラスを書き換えたいです。これはできますか?これを行うために私のモジュールではconfig 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ブロックがまだ使用されているのがわかります。何が間違っていますか?

回答:


13

<depends>モジュールのinit xmlファイルの間違った場所にノードを配置しました。次のように、モジュール名のノード内にネストする必要があります。

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>

10

ここのこの部分:

        <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-and-loosers/読み込み順序はapp / etc / modules / xmlファイルのアルファベット順に基づいていることがわかりました。あるいは、Dependsノード(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;
    }

私はあなたの指示に従わず、dependsノードがあってもクラスを書き換えることはできません。
ニックロランド

モジュールの初期化xmlファイルの名前をz.xmlに変更してから、キャッシュを更新してください。
フリストンのクリストフ

申し訳ありませんが、しばらくの間これに戻っていません。init xmlファイルの名前をzzz.xmlに変更すると、書き換えが機能しました!私は私が把握する必要が推測するので、なぜ<depends>ノードが..動作していない
ニック・ローランド

私は助けに感謝し、答えに私を導く:)
ニックロランド

3

これが、コアクラスの書き直しが下手な理由です。

ヒップから撮影しますが、色見本の実装を拡張し、Mage_Catalog_Blog_Product_View_Mediaモジュールを色見本モジュールに依存させるのが最善の策だと思います。

アラン・ストームは、ここで同様の質問に答えました。

さらに良いことは、あなたがオブザーバーを通してやろうとしていることなら何でもやってみることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.