Ich habe buchstäblich Stunden damit verbracht, zu googeln, zu lesen, ect zu studieren, aber niemand (nicht einmal Alan Storm!) Hat mir das erklärt. Es scheint, dass das gesamte Internet daran interessiert ist, JS oder CSS zu einer bestimmten Seite von Magento 2 hinzuzufügen, aber ich suche nach dem Hinzufügen von JS / CSS zu einem bestimmten Block .
Also, hier ist meine Frage auf den Punkt gebracht:
Was ist der beste Weg, um JS (und zusätzlich CSS) zu einem bestimmten Block hinzuzufügen , sodass, wenn der Block auf der Seite (*) vorhanden ist, das JS / CSS geladen wird, wenn der Block nicht vorhanden ist, kein CSS / JS? ?
* Dies bedeutet, dass jeder Block auf einer Seite / Vorlage über layout.xml, auf einer benutzerdefinierten Seite aus meinem Modul, über die toHtml-Methode eines Blocks / einer Seite oder vor allem eines in ein WYSIWYG einer Kategorie eingebetteten Blocks eingerichtet werden kann / Produktbeschreibung / CMS Block / CMS Seite.
Ich habe VIELE von Alans großartigen Artikeln gelesen (nochmals ein großes Lob an diesen Kerl !!), ganz zu schweigen von den Unmengen anderer Artikel , aber ich habe das Gefühl, dass jeder einer Seite, einer bestimmten Seite, hinzufügen möchte, nicht wo immer die Block wird verwendet.
Ich fühle mich mit den verschiedenen Techniken vertraut, aber hier fehlt mir möglicherweise etwas, daher möchte ich einen Konsens aus der Community sowie einen kleinen Wegweiser für alle Front-Ender, die Entwickler mit vollem Stapel suchen ähnliche Fragen und Nachdenken über die Optionen wie ich.
Zuvor habe ich in Magento 1 nach dem Blockkonstruktor gesucht, das Layout abgerufen, die Kopfreferenz abgerufen und dort addJs / addCss aufgerufen oder wenn möglich die Methoden in der Datei layout.xml verwendet. Dies würde bedeuten, dass der JS zur Ressourcenliste im Blockkonstruktor "hinzugefügt" wurde (bevor die Themenebene den Kopfblock ausgeben würde). Aber das scheint jetzt nicht möglich zu sein.
Ich habe gelesen, wie man JS / CSS hinzufügt (dies ist kein einfaches "Wie mache ich ???", dies ist ein präziseres "Was ist der richtige / mag2-Weg ???") und bin mit diesen vertraut Techniken:
- /view/[area]/layout/[default/page_id].xml Technik, die unter Verwendung von
<head></head>
Stammelementen - Hinzufügen eines Head- Blocks zu meinem Modul, der in head.additional angehängt ist, mit einer Art Logik, ob mein Block geladen ist
- Verwenden Sie die Objekte \ Asset \ GroupedCollection und \ Asset \ Repository, um sie vom Custructor einer Seite / Vorlage einzufügen (dies scheint jedoch nicht mit Blöcken zu funktionieren), möglicherweise die Reihenfolge des Ladens?
- Verwenden von RequireJS und Anwenden einer requireJS-Konfiguration auf mein Modul
Habe ich etwas verpasst?
Man glaubt, der richtige Weg wäre, die RequireJS-Bibliothek und entweder x-magento-init-Attribute oder nur ein Skript mit einer require("my_module", function(){ ... })
Syntax in einem Inline-Skript zu verwenden. Aber das scheint mir klunky? Ich müsste Skripte einrichten, um Skripte zu laden, bin gezwungen, zumindest einige meiner JS zu inline, aber es scheint die naheliegendste Art zu sein, zu sagen: "Hier ist mein Block, jetzt benötige ich JS", indem ich dies in mein HTML einfüge.
Ich würde dies jedoch gerne über PHP tun können, da ich als Backend / Stack-Programmierer die JS idealerweise wegkapseln und (im Idealfall) meinem Front-End-Team erlauben würde, dies so zu schreiben, wie sie es wollen. Kurz gesagt, kümmern Sie sich um das Laden (Back End Dev zu Frond End Dev "hier ist das HTML, überschreiben Sie das Thema, wenn Sie möchten, hier ist auch die js-Datei, ihre abhängigen Bibliotheken und hier ist das CSS für den Block").
Dies legt die __construct
Methode mit injizierten Abhängigkeiten vom Assets-System nahe. Ich kann dies jedoch nicht zum Laufen bringen. Dies scheint in Alan Storms Kurzartikel hier bestätigt zu sein: Magento Quickies: Magento 2: Programmgesteuertes Hinzufügen von Frontend-Asset-Dateien
Beachten Sie die Abmeldung "Alle Gedanken daran, Blöcke zu erstellen, die ihre Frontend-Assets mit sich führen, sind aus dem Fenster." ... Mist :(
Vielen Dank, dass Sie sich die Zeit zum Lesen und Überlegen genommen haben . Ich freue mich auf Ihre Antworten!
PS> Offensichtlich ist dies StackExchange, daher werde ich die Antwort als den besten Kurs für das markieren, was ich erreichen möchte (blockspezifisches Laden von Ressourcen). Ich werde mich jedoch bemühen, alle Antworten am Ende meines Beitrags als Referenzen aufzulisten das entweder zur Diskussion beitragen oder eine solide Lösung vorschlagen!
quelle
{{block}}
Direktiven im Seiteninhalt enthalten sind , da der Kopfabschnitt bereits gerendert wird, wenn die Blockklasse instanziiert wird.