ブロックを書き換えるときにMagento2でテンプレートを書き換える必要がありますか?


8

この質問は、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.stackexchange.com/q/112749/2380
デジタルPianismでラファエル

1
面白い。接頭辞がの場合、テンプレートは元のモジュールから引き続きロードできますがMagento_Theme::github.com / magento / magento2 / blob / develop / app / code / Magento / Theme / …これは本当に意図的に
David Verholen、

@RaphaelatDigitalPianismありがとう。リンクしたスレッドはプラグインに関するものです。私のシナリオは異なります。
mstojanov 2016年

ええ、それが私があなたの問題が何であるかを理解したときに私が見つけたものです 間違いなく私にはバグのように聞こえます
Digital PianismのRaphael、2016年

GitHubでこの問題に対処する問題を作成しました:github.com/magento/magento2/issues/4564は、開発チームからの回答を待っており、バグである場合はPRを作成します。
デジタルピアニズムのラファエル、

回答:


4

プルリクエスト(https://github.com/magento/magento2/pull/1895)で提案されたソリューションに関する議論があるため、元のブロッククラス名を変更する場合は、元のテンプレートを「固定」する必要があるだけです。

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>

これは良い提案ですが、特定のブロックでは非常に多くのレイアウトで使用されているため、せいぜい実用的ではありません(Catalog\Block\Product\View)。OPの提案は、その場合でも依然として最善の解決策だと思います。
Erfan

3

このファイルにコードを1つ追加するだけです

app/design/frontend/chop/misty/Magento_Theme/layout/default.xml

と:

<referenceBlock name="catalog.topnav" class="Company_name\Override\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>

オーバーライドモジュールファイル名に以下のコードを追加します。

app/code/Aims/Override/etc/di.xml

コード:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Topmenu" type="Company_name\Override\Block\Html\Topmenu" />
    <preference for="Magento\Paypal\Model\Config" type="Company_name\Override\Model\Paypal\Config" />
</config>

追加Topmenu.phpファイル内のファイルを:app/code/Company_name/Override/Block/Html/Topmenu.php あなたが上書きしたい機能を何でも追加することができます。

ありがとう

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