W Magento 1 mogłem skopiować klasę abstrakcyjną do katalogu lokalnego lub społeczności i Magento używał jej, gdy ładowanie automatyczne ładowało tę klasę.
Czy istnieje jakieś rozwiązanie, aby Magento zamiast tego ładował moją klasę vendor/magento/framework/Model/AbstractModel.php
?
Preferencje di.xml
dla klas abstrakcyjnych nie działają. Tylko wtyczki?
Pełne rozwiązanie: dołącz zastąpione klasy przed automatycznym załadowaniem ich przez Magento. Więc krok po kroku:
W pliku
app/etc/NonComposerComponentRegistration.php
dodaj wierszW
app/etc
pliku miejsceClassReplacer.php
z zawartościąMiejsce w
app/code/Magento
jakiejś klasie, która zostanie zastąpiona, npapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php
źródło
Jeśli klasa abstrakcyjna ma jakąkolwiek publiczną lub chronioną metodę, którą chcesz zastąpić, istnieje sposób, jeśli nie możesz użyć wtyczek.
Musiałem zastąpić metodę
_processDownload
wewnątrz\Magento\Downloadable\Controller\Download
, dodając trochę „jeśli-to” w środku. (Jeśli ktoś ma pomysł, jak dodać coś takiego do tej metody za pomocą wtyczek, będę wdzięczny). Klasa jest abstrakcyjna, więc preferencje nie działały. Wtyczki też, ponieważ metoda jest chroniona. To, co musiałem zrobić, to zastąpić wszystkie klasy rozszerzające sięDownload
, używając preferencji. Te klasy:Magento\Downloadable\Controller\Download\Link
Magento\Downloadable\Controller\Download\LinkSample
Magento\Downloadable\Controller\Download\Sample
A w nich przepisz metodę z klasy nadrzędnej (tej, którą miałem zastąpić). Tak więc kod zastąpionych metod został skopiowany do trzech miejsc i był dokładnie taki sam.
To nie jest idealne, ale działa.
źródło
Możesz spróbować użyć wtyczki Magento do ulepszenia istniejącej funkcjonalności dowolnej klasy Abstract, chociaż zakres tej funkcji powinien być publiczny. Ostatnio pracowałem nad tym samym problemem, w którym muszę wykluczyć produkty z przypisanym niestandardowym atrybutem z listy ostatnio oglądanych produktów .
Użyłem wtyczki dla funkcji o nazwie getItemsCollection z klasy Magento \ Reports \ Block \ Product \ AbstractProduct, stosując następującą składnię:
plik: app \ code \ Package \ Module \ etc \ frontend \ di.xml
plik: app \ code \ Package \ Module \ Block \ Obejrzane.php
Możesz korzystać zarówno z wtyczek, jak i przed nimi. Mam nadzieję, że ta praca dla ciebie.
źródło