В Magento 1 я мог копировать абстрактный класс в локальный каталог или каталог сообщества, и Magento использовал его, когда автозагрузка загружала этот класс.
Есть ли какое-то решение, чтобы Magento загружал мой класс vendor/magento/framework/Model/AbstractModel.php
?
Предпочтения в di.xml
отношении абстрактных классов не работают. Только плагины?
Полное решение: включите замененные классы перед тем, как magento автоматически загрузит их. Итак, шаг за шагом:
В файле
app/etc/NonComposerComponentRegistration.php
добавить строкуВ
app/etc
месте файлаClassReplacer.php
с содержаниемПоместите в
app/code/Magento
какой-нибудь класс, который будет заменен, напримерapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php
источник
Если у абстрактного класса есть какой-либо открытый или защищенный метод, который вы хотите переопределить, на самом деле есть способ, если вы не можете использовать плагины.
Мне пришлось переопределить метод
_processDownload
внутри\Magento\Downloadable\Controller\Download
, добавив несколько «если-s» внутри. (Если у кого-то есть идея, как я могу добавить что-то подобное в метод с использованием плагинов, я буду благодарен). Класс абстрактный, поэтому предпочтение не сработало. Плагины тоже как метод защищены. То, что я должен был сделать, это переопределить все расширения классаDownload
, используя предпочтения. Эти классы:Magento\Downloadable\Controller\Download\Link
Magento\Downloadable\Controller\Download\LinkSample
Magento\Downloadable\Controller\Download\Sample
И внутри них переписать метод из родительского класса (тот, который я должен был переопределить). Так что на самом деле код переопределенных методов был скопирован в три места и был точно таким же.
Это не идеально, но работает.
источник
Вы можете попробовать использовать плагин Magento для расширения существующей функциональности любого класса Abstract, хотя область действия функции должна быть Public. Недавно я работал над той же проблемой, в которой мне нужно исключить продукты, имеющие собственный атрибут, назначенный из списка недавно просмотренных продуктов .
Я использовал плагин для функции с именем getItemsCollection из класса с именем Magento \ Reports \ Block \ Product \ AbstractProduct, используя следующий синтаксис:
file: app \ code \ Package \ Module \ etc \ frontend \ di.xml
file: app \ code \ Package \ Module \ Block \ Viewed.php
Вы можете использовать как вокруг, так и перед плагинами тоже. Надеюсь, эта работа для вас.
источник