この質問は、Magento2のベストプラクティスに従うことです。
要素の周りにラッパーを追加するために、\ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu()メソッドを書き換える必要がありました。今、それは保護された方法なので、私の理解は設定機能を使わなければならないということです:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
そして私の書き換えでクラスを追加します:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
デフォルトのクラスは書き直されましたが、次のページのリロードで次のエラーが発生しました:
main.CRITICAL:無効なテンプレートファイル:モジュールの 'html / topmenu.phtml': 'MyCompany_Theme'ブロックの名前: 'catalog.topnav' [] []
MagentoはMagento_Themeではなく、私の拡張機能の下でhtml / topmenu.phtmlを検索しようとしています。私はこれが正しい振る舞いであることを理解していますが、私はこれの実際的な側面について考えていました。これは、ブロックを書き換えるときはいつでも、必ずしも関連するHTMLに触れる必要がない場合でも、そのテンプレートも書き換える必要があることを意味しますか?
これを回避する1つの方法は、次のように_toHtml()メソッドも書き換えることです。
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
これで、MagentoはテンプレートファイルのMagento_Themeモジュールをもう一度調べています。しかし、これは私にとってハックのように見えます。
だから、私の質問は、この状況での推奨事項は何ですか?ブロッククラスを書き換えるときは常に関連するテンプレートをコピーする必要がありますか、それとも回避策は問題ありませんか?これにはより良いアプローチがありますか?
Magento_Theme::
、github.com / magento / magento2 / blob / develop / app / code / Magento / Theme / …これは本当に意図的に