Spędziłem więc dosłownie godziny godzin na googlowaniu, czytaniu, studiowaniu ect, ale nikt (nawet Alan Storm!) Nie powiedział mi tego. Wygląda na to, że cały internet jest zainteresowany dodaniem JS lub CSS do konkretnej strony Magento 2, ale to, czego szukam, to dodanie JS / CSS do określonego bloku .
Oto moje pytanie w skrócie:
Jaki jest najlepszy sposób dodania JS (i dodatkowo CSS) do określonego bloku , aby jeśli blok był obecny na stronie (*), JS / CSS jest ładowany, jeśli bloku nie ma, nie ma CSS / JS? ?
* Oznacza to, że gdziekolwiek można ustawić blok, na stronie / szablonie za pośrednictwem layout.xml, na stronie niestandardowej z mojego modułu, za pomocą metody toHtml bloku / strony lub, co najważniejsze, bloku osadzonego w WYSIWYG kategorii / opis produktu / Blok CMS / Strona CMS.
Przeczytałem DUŻO świetnych artykułów Alana (ponownie Kudos temu facetowi !!), nie wspominając o ryzach innych artykułów wokół tego , jednak mam wrażenie, że każdy chce dodać do strony, konkretnej strony, nie gdziekolwiek blok jest używany.
Wydaje mi się, że znam różne techniki, ale może coś mi tu brakuje, więc chciałbym uzyskać concensus od społeczności, a także być może trochę szyldu dla wszystkich czołowych graczy, aż do pełnych stosów deweloperów szukających podobne pytania i zastanawianie się nad opcjami tak jak ja.
Wcześniej w Magento 1 szukałem konstruktora bloków, pobierałem układ, uzyskiwałem odniesienie do głowy i wywoływałem tam addJs / addCss lub, jeśli to możliwe, korzystałem z metod w layout.xml. Oznaczałoby to, że JS został „dodany” do listy zasobów konstruktora bloków (zanim poziom kompozycji wyśle blok główny). Ale teraz nie wydaje się to możliwe.
Przeczytałem o tym, jak przejść na temat dodawania JS / CSS (to nie jest proste „jak to zrobić?”, To jest bardziej zrozumiały „jaki jest prawidłowy / mag2 sposób ???”) i znam je techniki:
- /view/[area]/layout/[default/page_id].xml technika, przy użyciu
<head></head>
elementów głównych - Dodanie bloku Head do mojego modułu, dołączonego do head.additional, z pewną logiką dotyczącą tego, czy mój blok jest załadowany
- za pomocą obiektów \ Asset \ GroupedCollection i \ Asset \ Repository, aby wstrzyknąć od konstruktora strony / szablonu (nie wydaje się to jednak, że blokuje się blokami), potencjalnie kolejność ładowania?
- Używanie RequireJS i stosowanie konfiguracji requJS do mojego modułu
Czy coś przeoczyłem?
Uważa się, że poprawnym sposobem byłoby użycie biblioteki RequireJS i atrybutów x-magento-init lub po prostu skryptu ze require("my_module", function(){ ... })
składnią w skrypcie wbudowanym. Ale to wydaje mi się niezdarne? Musiałbym skonfigurować skrypty do ładowania skryptów, jestem zmuszony wstawić co najmniej część mojego JS, jednak wydaje się, że jest to najbardziej podejrzany sposób powiedzenia „oto mój blok, teraz potrzebuję trochę JS”, poprzez włożenie tego do mojego phtml.
Chciałbym jednak naprawdę móc to zrobić za pośrednictwem PHP, jako programista zaplecza / stosu idealnie chciałbym zamknąć JS i (najlepiej) pozwolić zespołowi frontonu napisać to, jak chcą. W skrócie, zajmij się ładowaniem (Back End Dev to Frond End Dev "heres phtml, przesłonięcie w temacie, jeśli chcesz, podobnie heres pliku js, jego zależnych bibliotek i heres css dla bloku").
Sugeruje to __construct
metodę z wtryskiem zależności w systemie zasobów. Nie mogę jednak tego uruchomić, wydaje się to potwierdzone w szybkim artykule Alan Storms tutaj: Magento Quickies: Magento 2: Programowe dodawanie plików zasobów interfejsu użytkownika
Zwróć uwagę na podpis „Więc wszelkie myśli o tworzeniu bloków, które niosą ze sobą zasoby frontendu, są poza oknem”. ... porażka :(
Dziękuję wam za poświęcenie czasu na przeczytanie i przemyślenie . Czekam na Wasze odpowiedzi!
PS> Oczywiście jest to StackExchange, więc zaznaczę odpowiedź jako najlepszy kurs do tego, co próbuję osiągnąć (zablokuj ładowanie określonych zasobów), jednak postaram się również podać jako poprawkę na dole mojego postu wszelkie odpowiedzi które albo dodają do dyskusji, albo sugerują solidne rozwiązanie!
źródło
{{block}}
dyrektyw, ponieważ sekcja nagłówka jest już renderowana po utworzeniu instancji klasy bloku.