In Magento 1 konnte ich die abstrakte Klasse in ein lokales oder Community-Verzeichnis kopieren und Magento verwendete sie, wenn Autoload diese Klasse lud.
Gibt es eine Lösung, um zu machen, dass Magento stattdessen meine Klasse lädt vendor/magento/framework/Model/AbstractModel.php
?
Einstellungen di.xml
für abstrakte Klassen funktionieren nicht. Nur Plugins?
Vollständige Lösung: Schließen Sie ersetzte Klassen ein, bevor Sie sie von Magento automatisch laden. Also Schritt für Schritt:
In Datei
app/etc/NonComposerComponentRegistration.php
Zeile hinzufügenIn-
app/etc
Place-DateiClassReplacer.php
mit InhaltPlatz für
app/code/Magento
eine Klasse, die ersetzt wird, zapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php
quelle
Wenn abstrakte Klassen über eine öffentliche oder geschützte Methode verfügen, die Sie überschreiben möchten, gibt es tatsächlich eine Möglichkeit, wenn Sie keine Plugins verwenden können.
Ich musste die Methode
_processDownload
inside\Magento\Downloadable\Controller\Download
überschreiben und ein paar 'if-s' hinzufügen. (Wenn jemand eine Idee hat, wie ich mit Plugins so etwas hinzufügen kann, bin ich dankbar). Klasse ist abstrakt, Präferenz hat nicht funktioniert. Plugins auch, da Methode geschützt ist. Das, was ich tun musste, war, alle Klassen außer Kraft zu setzen, vonDownload
denen aus ich sie bevorzugte. Diese Klassen:Magento\Downloadable\Controller\Download\Link
Magento\Downloadable\Controller\Download\LinkSample
Magento\Downloadable\Controller\Download\Sample
Und in ihnen schreiben Sie die Methode aus der Elternklasse um (die, die ich überschreiben sollte). Der Code der überschriebenen Methoden wurde also an drei Stellen kopiert und war genau derselbe.
Es ist nicht ideal, aber es funktioniert.
quelle
Sie können versuchen, mit dem Magento-Plug-in die vorhandene Funktionalität einer Abstract-Klasse zu erweitern. Der Funktionsumfang sollte jedoch Public sein. Vor kurzem habe ich an demselben Problem gearbeitet, bei dem ich Produkte mit benutzerdefinierten Attributen aus der Liste der zuletzt angezeigten Produkte ausschließen muss .
Ich habe das Plugin für die Funktion getItemsCollection aus der Klasse Magento \ Reports \ Block \ Product \ AbstractProduct mit der folgenden Syntax verwendet:
Datei: app \ code \ Package \ Module \ etc \ frontend \ di.xml
Datei: App \ Code \ Package \ Module \ Block \ Viewing.php
Sie können sowohl vor als auch um Plugins verwenden. Hoffe diese Arbeit für dich.
quelle