注:これは、ブロックの書き換えがどのように機能するかを完全に説明する標準的な質問であり、「ブロックXをオーバーライドする方法」または「書き換えが機能しない理由」の質問の重複ターゲットとして使用できます。
たとえば、カスタムモジュールのコアブロッククラスを変更する必要がある(メソッドの変更またはメソッドの追加)。これをどのようにして段階的に行うのですか?
注:これは、ブロックの書き換えがどのように機能するかを完全に説明する標準的な質問であり、「ブロックXをオーバーライドする方法」または「書き換えが機能しない理由」の質問の重複ターゲットとして使用できます。
たとえば、カスタムモジュールのコアブロッククラスを変更する必要がある(メソッドの変更またはメソッドの追加)。これをどのようにして段階的に行うのですか?
回答:
すべてのブロックまたはブロックのグループは、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_here
class_name_here
catalog/class_name_here
Mage_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_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
。あなたがそれに応じてあなたの答えを変えるならば、私は賛成票を投じます。
私の視点では、これらの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..
}
ここで追加することが重要なのは、ブロックの書き換え(およびMagentoモジュールの他のすべての書き換え)はメンテナンス作業が多いことを意味するため、構成操作、イベント、テーマのカスタマイズ後に機能を拡張する最後の機会と見なす必要があります。
潜在的な問題1:自分または他のメンテナがMagentoのソースファイルを更新しても、書き換えられたテンプレートは更新されません。セキュリティの修正または改善がコードに適用されないことを意味します。同じことが、ブロックを含む他の書き換えられたクラスにも当てはまりますが、書き換えの量によって異なります(以下を参照)。
潜在的な問題2:書き換えられたブロック(または他のクラス)が、自分または他のメンテナがインストールしようとする別の拡張機能によって書き換えられたように見える場合があります。次に、この競合を解決する必要があります。
代替案1:イベントを使用します。つまり、書き換えようとしているコードを調べて、目的の機能を実現するために使用できるイベントがあるかどうかを確認します。
代替案2:スマートに書き換える、つまり周囲を見回す:書き換えるクラスがインスタンス化される場所を確認し、構成またはイベントを介して選択されるクラスに影響を与えることができるかどうかを確認します。おそらく、元のクラスから書き換えられたクラスに30行のメソッドをコピーする代わりに、3行のメソッドをオーバーライドしてクラス名を置き換えることができるクラスがあるかもしれません。
Mage_Catalog_Block_Product_View_Options_Type_Select
して\コード\ローカル\ WR \ EPO \ブロック\カタログ\ブロック\製品\ビュー\オプション\タイプ\ Select.phpアプリ。私は次のように試してみました:codepen.io/anon/pen/WYOqBr