Rozszerzanie / zastępowanie JS w Magento 2

34

Ponieważ Magento2 używa RequireJS do ładowania skryptów i nie ma już folderu skórki , mam problem:

Jak mogę zastąpić plik JS modułu Magento moją zmodyfikowaną wersją?

Na przykład - opc-checkout-method.js, który należy do rozszerzenia Magento_Checkout. O ile widzę, nie jest zdefiniowany w pliku Requjs-config.js.

Moje rozszerzenie jest ładowane po Magento_Checkout , więc jego dane Requjs-config.js są dołączane na końcu wynikowego pliku Requjs-config.

Czy powinienem to zrobić w inny sposób, nie zastępując całego skryptu?

DmitryR
źródło
1
Wyobrażam sobie, że nie powinieneś zastępować pliku tak bardzo, jak zastępowanie funkcji w obiekcie ładowanym przez plik.
Peter O'Callaghan,

Odpowiedzi:

93

Nie ma już folderu skórki, ale nadal możesz używać motywów.

Jako dowód koncepcji posłużyłem wam przykładem op-checkout-method.jsi tym.

Warunki wstępne:

  • Zainstalowano Magento2-beta11
  • Domyślny motyw aktywny (pusty).
  • Brak plików w pub/staticfolderze (usuń folder pub / static / frontend)

Działania:

  • Skopiowano op-checkout-method.jsplik z lokalizacji modułu app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.jsdo pustego motywu doapp/design/frontend/Magento/blank/Magento_Checkout/web/js/opc-checkout-method.js
  • edytował plik klonowania i dodał a console.log('something')lub alert('something')w _createfunkcji mage.opcCheckoutMethodwidżetu.
  • wyczyszczono pamięć podręczną przeglądarki.

Wynik:

  • Po załadowaniu strony kasy widzę mój alert lub tekst zalogowany w konsoli.

Powiązane informacje:

Jeśli uruchomię z cli php dev/tools/Magento/Tools/View/deploy.php(skrypt, który publikuje zasoby statyczne), mój nowy plik js zostanie umieszczonypub/static/frontend/Magento/blank/en_US/Magento_Checkout/js/opc-checkout-method.js

[EDYTOWAĆ]

Znalazłem sposób na zrobienie tego za pomocą modułu.

Na [Namespace]/[Module]/view/frontend/requirejs-config.jsdodatek w tym:

var config = {
    map: {
        '*': {
            'Magento_Checkout/js/opc-checkout-method':'[Namespace]_[Module]/js/opc-checkout-method'
        }
    }
};

Następnie utwórz plik [Namespace]/[Module]/view/frontend/web/js/opc-checkout-method.jsz zawartością.

Do celów testowych sklonowałem oryginalny plik i ponownie dodałem a console.logw _createfunkcji.

Pamiętaj również, aby zregenerować zasoby publiczne dla interfejsu użytkownika.

Marius
źródło
Dzięki, Marius! Czy można robić podobne rzeczy wewnątrz rozszerzenia?
DmitryR
Nie sądzę, żebyś robił to z rozszerzenia. nie było to możliwe w Magento 1, chyba że całkowicie zmieniłeś szablon kasy. Ale szukam sposobu, aby to zrobić.
Marius
Jeszcze raz dziękuję, Marius. Usiłuję zaimplementować niestandardowe pobranie, które zastępuje domyślne, i utknąłem z przesłonięciami JS.
DmitryR
1
@DmitryR. Zobacz moją aktualizację odpowiedzi.
Marius
miejsce na Requjs-config.js jest teraz Vendor / Module / view / frontend / Requjs-config.js
Eugen Bogdanovich
11

Oto oficjalny dokument dotyczący rozszerzania / zastępowania domyślnych komponentów JS: http://devdocs.magento.com/guides/v2.0/javascript-dev-guide/javascript/custom_js.html

Informacje zwrotne są mile widziane!

Alex
źródło
3
Witamy w MagentoSE. Ta odpowiedź byłaby bardziej przydatna dla przyszłych użytkowników, gdybyś dodał tutaj odpowiedź zamiast samego linku. Jeśli link się zepsuje w przyszłości, wyszukiwarki nie znajdą informacji, do których się odwołujesz.
AreDubya,
2
To słuszna kwestia, ale dodajemy 301 przekierowań, gdy tematy się poruszają, więc ryzyko 404 jest zminimalizowane.
Steve Johnson