だから私は文字通り何時間もグーグルで読んだり、電気ショック療法を勉強したりしましたが、誰も(アランストームさえも)これを私に綴った人はいません。インターネット全体がMagento 2の特定のページにJSまたはCSSを追加することに関心があるようですが、私が探しているのは、JS / CSSを特定のブロックに追加することです。
だから、ここに一言で私の質問があります:
特定のブロックにJS(およびCSS)を追加する最良の方法は何ですか。ブロックがページ(*)に存在する場合、JS / CSSがロードされ、ブロックがそこにない場合、CSS / JSはありません。 ?
*つまり、layout.xmlを介してページ/テンプレートに、モジュールのカスタムページに、ブロック/ページのtoHtmlメソッドを介して、または最も重要なこととして、カテゴリのWYSIWYGに埋め込まれたブロックを設定できます。 /製品の説明/ CMSブロック/ CMSページ。
私はアランの素晴らしい記事の ALOTを読みました(この人に再び賞賛します!)、これに関する他の記事の連は言うまでもありませんが、誰もが特定のページに追加したいと思うような気がします。ブロックが使用されます。
私はさまざまなテクニックに精通しているように感じますが、ここで何か不足している可能性があるので、コミュニティからのコンセンサス、およびおそらくすべてのフロントエンドからフルスタックの開発者までの看板を少し探してください。私と同じような質問と選択肢を考えます。
以前は、Magento 1では、ブロックコンストラクターを調べ、レイアウトを取得し、ヘッド参照を取得して、そこでaddJs / addCssを呼び出すか、可能であれば、layout.xmlのメソッドを使用していました。これは、JSがブロックコンストラクターのリソースリストに「追加」されたことを意味します(テーマレベルがヘッドブロックを出力する前に)。しかし、これは今では不可能のようです。
私はJS / CSSを追加する方法について読みました(これは単純な「方法は?」ではありません。これはより簡潔な「正しい/ mag2の方法は何ですか???」)、これらに精通しています。テクニック:
- /view/[area]/layout/[default/page_id].xmlテクニック、
<head></head>
ルート要素を使用 - モジュールにHeadブロックを追加し、head.additionalに追加し、ブロックが読み込まれているかどうかに関する何らかのロジックを追加する
- \ Asset \ GroupedCollectionオブジェクトと\ Asset \ Repositoryオブジェクトを使用して、ページ/テンプレートのcustructorから挿入します(ただし、これはブロックとorkしていないようです)。
- RequireJSを使用してrequireJS構成をモジュールに適用する
何か逃したことがありますか?
正しい方法は、RequireJSライブラリと、x-magento-init属性を使用するかrequire("my_module", function(){ ... })
、インラインスクリプトに構文を持つスクリプトだけを使用することだと考えています。しかし、これは私には不器用に思えますか?私はスクリプトをロードするためにスクリプトをセットアップする必要があり、少なくとも私のJSのいくつかをインライン化することを余儀なくされていますが、これを私のphtmlにポップすることによって、「ここが私のブロックです。
ただし、PHPを介してこれを実行できるようにしたいのですが、JSをカプセル化し、(理想的には)フロントエンドチームがこれを好きなように書けるようにするバックエンド/スタックプログラマーとして理想的です。要するに、ロードの処理に注意してください(バックエンド開発からフロントエンド開発までは「phtmlをここに置き、必要に応じてテーマでオーバーライドします。同様に、jsファイル、その依存ライブラリ、およびブロックのCSSをここに置きます」)。
これは、__construct
資産システムに依存性を注入する方法を示唆しています。ただし、これを機能させることはできません。これは、ここのAlan Stormsのクイック記事で確認されているようです:Magento Quickies:Magento 2:プログラムによるフロントエンドアセットファイルの追加
「したがって、フロントエンドアセットを一緒に運ぶブロックを作成することについての考えは窓の外にあります」に注意してください。...つまらない:(
お読みいただき、ご検討いただき、ありがとうございます。ご返信をお待ちしております。
PS>明らかに、これはStackExchangeなので、私が達成しようとしていること(特定のリソースの読み込みをブロックする)の最良のコースとして回答をマークしますが、すべての回答を投稿の下部に参照としてリストするように努力しますディスカッションに追加するか、解決策を提案します!