Magento 1でブロッククラスをオーバーライド/書き換えするにはどうすればよいですか?


12

注:これは、ブロックの書き換えがどのように機能するかを完全に説明する標準的な質問であり、「ブロックXをオーバーライドする方法」または「書き換えが機能しない理由」の質問の重複ターゲットとして使用できます。

参照:Magento 1のオーバーライドに関する正規の質問を探す

たとえば、カスタムモジュールのコアブロッククラスを変更する必要がある(メソッドの変更またはメソッドの追加)。これをどのようにして段階的に行うのですか?

回答:


23

すべてのブロックまたはブロックのグループは、config.xmlこのようなモジュールのファイルで(<global>タグ内で)宣言されます。
これは、カタログモジュールの例です

    <blocks><!-- marks definition of a block group -->
        <catalog><!-- unique alias for blocks in the module -->
            <class>Mage_Catalog_Block</class><!-- class prefix for all blocks -->
        </catalog>
    </blocks>

ブロックエイリアス使用してインスタンス化することができることをこれは、クラスパスの残りの部分はプレフィックスから開始されます。 つまり、デフォルトでにマッピングされます。 catalog/class_name_hereclass_name_here
catalog/class_name_hereMage_Catalog_Block_Class_Name_Here

ブロックを書き換えるには、変更するモジュールに依存するモジュールを作成する必要があります(Magento_Catalog私の例では)。
そして、これをタグのconfig.xml下に追加する必要があります<global>

<blocks>
    <catalog><!-- alias of the block group you are rewriting -->
        <rewrite><!-- reserved tag: specify that you are rewriting something -->
             <class_name_here>YourNamespace_YourModule_Block_Your_New_Class_Here</class_name_here> <!-- tag: the rest of the alias of the class you are rewriting. value: the name of your class that rewrites the core class -->
        </rewrite>
    </catalog>
</blocks>

次にYourNamespace_YourModule_Block_Your_New_Class_Here(ZFフォルダー構造に従って)クラスを作成し、このクラスに元のクラスを拡張させます。

class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
    //your awesome code here
}

完了したら、コンパイルを無効にして再度有効にし(必要な場合)、キャッシュをクリアします。

これは抽象ブロックでは機能しません。
インスタンス化されるクラスに対してのみ機能します。

独自のモジュールMarius_Testにクラスがあるapp \ code \ core \ Mage \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.phpファイルを書き換えたいとします。Mage_Catalog_Block_Product_View_Options_Type_Select

次に、このエントリが必要になりますconfig.xml

<blocks>
    <catalog>
        <rewrite>
            <product_view_options_type_select>Marius_Test_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
        </rewrite>
    </catalog>
</blocks>

app \ code \ local \ Marius \ Test \ Block \ Catalog \ Product \ View \ Options \ Type \ Select.php

class Marius_Test_Block_Catalog_Product_View_Options_Type_Select extends Mage_Catalog_Block_Product_View_Options_Type_Select
{
    //your awesome code here
}

動作しません。私は、クラスを上書きしようとMage_Catalog_Block_Product_View_Options_Type_Selectして\コード\ローカル\ WR \ EPO \ブロック\カタログ\ブロック\製品\ビュー\オプション\タイプ\ Select.phpアプリ。私は次のように試してみました:codepen.io/anon/pen/WYOqBr
Black

それがうまくいかない場合、私の答えは間違っていると思うので、何か間違っているのではないかと考えるのではなく、反対票を投じます。とにかく...これに置き換えて<Mage_Catalog_Block_Product_View_Options_Type_Select> WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select </Mage_Catalog_Block_Product_View_Options_Type_Select><product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>中にスペースがないことを確認してくださいproduct_view_options_type_select
マリウス

あなたの答えが正確でなかったので、私は反対票を投じました。クラス名を使用する必要があると書いていたので、それを使用しても機能しませんでした。product_view_options_type_select実際のクラス名の代わりに使用する必要がありますMage_Catalog_Block_Product_View_Options_Type_Select。あなたがそれに応じてあなたの答えを変えるならば、私は賛成票を投じます。
ブラック

あなたがそれを一歩一歩読んだなら、あなたは一歩逃した。クラスエイリアスとは何かを説明するもの。貼り付けと置換をコピーするだけで動作します。17人が理解した。私はそれを正しく説明したと思います
マリウス

はい。ただし、適切な例が欠けているため、私たちはあなたの理論を正しく理解していたと
Black

4

私の視点では、これらの2つのオーバーライドとリライトは異なります。

オーバーライド:

デザインフォールバックメカニズムを使用する場合は、オーバーライドを行います

リライト:

クラス内のmagento Coreクラスを書き換えると、書き換えが行われます。

1)オーバーライドの例:

app/code/core/Mage/Catalog/Block/Product/List.phpファイルをオーバーライドする必要がある場合は、以下に示す同じパスを使用してローカルモジュールにコピーしますapp/code/local/Mage/Catalog/Block/Product/List.php

これはmagentoによって提案されていませんが、その方法で実行できます。

2)書き換え例:

このブロッククラスを書き換えたい場合Mage_Adminhtml_Block_Sales_Order_Createは、モジュールconfig.xmlに以下のようにコーディングします

    <global>
        <blocks>
            <adminhtml>
                <rewrite>

                    <sales_order_create>Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create</sales_order_create>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>

そして私のクラスでは Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

以下のようにコーディングします

class Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create extends Mage_Adminhtml_Block_Sales_Order_Create {
      My Function Or funcions That I want to Rewrite..
}

2

ここで追加することが重要なのは、ブロックの書き換え(およびMagentoモジュールの他のすべての書き換え)はメンテナンス作業が多いことを意味するため、構成操作、イベント、テーマのカスタマイズ後に機能を拡張する最後の機会と見なす必要があります。

潜在的な問題1:自分または他のメンテナがMagentoのソースファイルを更新しても、書き換えられたテンプレートは更新されません。セキュリティの修正または改善がコードに適用されないことを意味します。同じことが、ブロックを含む他の書き換えられたクラスにも当てはまりますが、書き換えの量によって異なります(以下を参照)。

潜在的な問題2:書き換えられたブロック(または他のクラス)が、自分または他のメンテナがインストールしようとする別の拡張機能によって書き換えられたように見える場合があります。次に、この競合を解決する必要があります。

代替案1:イベントを使用します。つまり、書き換えようとしているコードを調べて、目的の機能を実現するために使用できるイベントがあるかどうかを確認します。

代替案2:スマートに書き換える、つまり周囲を見回す書き換えるクラスがインスタンス化される場所を確認し、構成またはイベントを介して選択されるクラスに影響を与えることができるかどうかを確認します。おそらく、元のクラスから書き換えられたクラスに30行のメソッドをコピーする代わりに、3行のメソッドをオーバーライドしてクラス名を置き換えることができるクラスがあるかもしれません。

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