ナビゲーションメニュー:page.xml はオーバーライドされたクラス (topmenu.php) を呼び出しません。
-
12-12-2019 - |
質問
編集 :ジョナサン・ハッセーによって解決されました。テンプレートとレイアウトのオーバーライドについて私を助けたい場合は、投稿の最後(または以下)にある別の質問を参照してください:)
補助的な質問 :モジュール内で page.xml、topmenu.phtml、renderer.phtml をオーバーライドできますか、それともテーマ フォルダー内で手動で置き換える必要がありますか?もしそうなら、チュートリアルに案内するか、簡単に説明していただけますか?私のケースに合うチュートリアルは簡単に見つからなかったようです...
topmenu.phtml、renderer.phtml、page.xmlのテンプレートをオーバーライドしたいのですが、 私のモジュール内で, 、 もし可能なら。
これ以上の助けをありがとう:)
私は新しい Magento 開発者なので、単純なことをやろうとしていますが、Magento についての理解は限られています...
私がやりたいのは、独自のモジュールを作成して、ナビゲーション メニュー (上部) を別の方法 (パネル風のドロップダウン) で表示することです。現在のメニューが定義/呼び出された場所を調べて、ファイルを見つけました design/frontend/{mytheme}/default/layout/page.xml
これは次のようになります:
<default translate="label" module="page">
<block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">
<block type="page/html_header" name="header" as="header">
<block type="core/text_list" name="top.menu" as="topMenu" translate="label">
<label>Navigation Bar</label>
<block type="page/html_topmenu" name="catalog.topnav" template="page/html/topmenu.phtml">
<block type="page/html_topmenu_renderer" name="catalog.topnav.renderer" template="page/html/topmenu/renderer.phtml"/>
</block>
</block>
</block>
</block>
</default>
(他にもたくさんありますが、それは不可欠なものです)
<block type="page/html_topmenu" name="catalog.topnav" template="page/html/topmenu.phtml">
<block type="page/html_topmenu_renderer" name="catalog.topnav.renderer" template="page/html/topmenu/renderer.phtml"/>
</block>
これらの行は、クラスが必要であることを示しています Mage_Page_Block_Html_Topmenu
, 、テンプレート ファイルに表示されます design/frontend/{mytheme}/default/template/page/html/topmenu.phtml
, 、 を含む :
<nav id="nav">
<div class="nav-megadropdown col6">
<?php echo $this->getHtml('level-top'); // $this is the a Topmenu object ?>
</div>
<div style="clear:both"></div>
</nav>
方法 getHtml
子ブロックに到達 catalog.topnav.renderer
そしてそのクラスを取得します(Mage_Page_Block_Html_Topmenu_Renderer
そして、テンプレートを使用して render メソッドを呼び出します design/frontend/{mytheme}/default/template/page/html/topmenu/renderer.phtml
これには複雑だが機能するメニュー (Mage クラスとテーマの phtml ファイルを変更して試してみましたが、うまくいきました。).
しかし今、モジュール内のクラスをオーバーライドすることで、それを適切に作成したいと思います(アクティブで次のようになります) Fqu_Supergroup
)。そこで私は config.xml から始めました。
<config>
<modules>
<Fqu_Supergroup>
<version>0.1.0</version>
</Fqu_Supergroup>
</modules>
<global>
<blocks>
<Page>
<rewrite>
<html_topmenu>Fqu_Supergroup_Block_Html_Topmenu</html_topmenu>
</rewrite>
</Page>
</blocks>
</global>
</config>
そして私のクラス(Fqu_Supergroup_Block_Html_Topmenu
) 私のモジュール(local/Fqu/Supergroup/Block/Html/Topmenu.php
) には、オーバーライドされたメソッド (_getRenderedMenuItemAttributes および _getMenuItemClasses) のみが含まれます。
ここで、コードを試すと、ページには壊れたメニューが表示されます。これは、コードが私のクラスを使用していないためです(クラスを var_dump しました(get_class($this)
) メニューをレンダリングするために使用され、返されました Mage_Page_Block_Html_Topmenu
);そして、含まれているファイルを var_dump すると (get_included_files()
)私のモジュールへの参照がまったく表示されません(ただし、管理パネルでアクティブ化されています)...
長い投稿で申し訳ありませんが、ご清聴とご協力に感謝いたします。
補助的な質問 :モジュール内で page.xml、topmenu.phtml、renderer.phtml をオーバーライドできますか、それともテーマ フォルダー内で手動で置き換える必要がありますか?
解決
あなたの投稿を詳細に分析したわけではありませんが、上記を確認して最初に気づいたのは、リライトの宣言が間違っているということです。 Page
代わりにそうすべきです page
. 。この文字列はモジュール名と一致しません。つまり、の Page
で Mage_Page
, 、代わりに、書き換えているモジュールでリソースを宣言するときに使用される文字列と一致します。 config.xml
のために Mage_Page
コアモジュール:
...
<blocks>
<page> <!-- this is the string to match -->
<class>Mage_Page_Block</class>
</page>
</blocks>
...
参照することで page
モジュールとの対戦 Mage_Page
グローバル構成 (基本的には、すべての内容を含む 1 つの巨大な XML ファイルです) を検査することによって決定されます。 config.xml
すべてのモジュールのファイル)。文字列の残りの部分はクラス名に従って決定されるため、 html_topmenu
クラスにマップする Mage_Page_Block_Html_Topmenu
リライトが適用されるクラスです。
追加の質問については、はい、モジュールのレイアウト ファイルを宣言することで、レイアウト ファイルまたはテンプレートをオーバーライドできます。この中で、ブロックのテンプレートの変更など、必要なレイアウト変更を宣言できます。モジュールは常にすべてのコア モジュールの後に読み込まれるため、これらの変更はコア レイアウト ファイルよりも優先されます。