Ich stecke in Magento2 im Überschreiben von Kernmodellen, Blöcken und Controllern. Kann mir jemand dabei helfen?
Nehmen wir als Beispiel die Listen-Symbolleiste, in der ich eine neue Sortieroption namens Nach den beliebtesten sortieren hinzufügen muss . Wie füge ich es hinzu? Ich denke, dafür müssen wir die Option in der Blockebene und die Bedingung in der List.php
Sammlungsebene hinzufügen .
Antworten:
Magento2 gab ein sehr gutes Konzept namens Plugin
Wir können alles tun, was nach und vor der Kernfunktion passiert, und wir haben eine weitere Funktion, die sowohl vor als auch nach dem Code ausgeführt wird, der alle Informationen abdeckt
Erstellen Sie eine Datei di.xml in Mymodule / etc / di.xml
In diesem Beispiel habe ich das Produktmodell und den Produktansichtsblock genommen
Ich habe in der Produktansicht einen Block verwendet, bei dem es sich um eine Funktion handelt, die ein Präfix enthält. Stellen Sie dann sicher, dass 2 Parameter vorhanden sind. Als erstes wird angegeben, welches Objekt Sie verwenden. Closure, das alte Rückgabeinformationen beibehält
In Modell i wird davor und danach verwendet
Auf diese Weise können wir alten Code behalten. Wenn also der Magento-Kerncode morgen aktualisiert wird, haben wir sowohl neuen aktualisierten Code als auch unsere benutzerdefinierte Logik. Wenn wir den Code direkt überschreiben, haben wir den neuen aktualisierten Code dieser Funktion oder Datei verloren :-)
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
quelle
Endlich hab ich es !!!!
Ich folge den Schritten unten, um Block, Controller und Modell zu überschreiben. Ich habe ein Beispiel für das Produktmodell und die Produktansicht Block und Controller / Aktion anzeigen genommen
Erstellen Sie eine Datei mit dem Namen di.xml in Ihrer Datei /etc/di.xml
Dann habe ich Model File in /Model/Product.php erstellt
Dann habe ich eine Block-Datei in /Block/Product/View.php erstellt
Erstellen Sie nun den Product View Controller /Controller/Product/View.php
Es funktioniert gut für mich :-)
quelle
Es gibt zwei Schritte, um die Block-, Modell- und Controller-Datei zu überschreiben
1) Präferenz in di.xml hinzufügen
2) Erstellen Sie eine Block-, Modell- und Steuerungsdatei in Ihrem Modul
1) Erstellen Sie die Datei di.xml im Ordner
Prince/Helloworld/etc
2) Erstellen Sie ListProduct.php im Ordner
Prince/Helloworld/Block/Rewrite/Product
1) Fügen Sie Präferenz in di.xml bei hinzu
Prince/Helloworld/etc
2) Erstellen Sie die Model-Datei Product.php im Ordner
Prince/Helloworld/Model/Rewrite/Catalog
1) Fügen Sie Präferenz in di.xml bei hinzu
Prince/Helloworld/etc
2) Erstellen Sie View.php im Ordner
Prince/Helloworld/Controller/Rewrite/Product
Sie können andere Bausteine, Modelle und Steuerungen auf dieselbe Weise überschreiben.
quelle
Kleine Korrektur aber große nützlich, wir müssen keine n Anzahl von Dateien für jede Funktion im Plugin-Konzept erstellen. Für ein Modul ist eine Plugin-Datei ausreichend, damit Sie alle Module, alle Modelle und Blöcke sowie den Controller von Magento selbst erweitern können
und im Plugin PHP-Datei
Magento2 Rocks
quelle
Uncaught Error: Call to undefined method Magento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor::getEntityId()
Hier\Clousure $proceed
bekommen obejct ausMagento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor
Sie können die Block- oder Controller-Klasse von magento in Ihrem benutzerdefinierten Block oder Controller direkt erweitern. Wenn Sie beispielsweise das PDF-Rechnungsmodell in meinem benutzerdefinierten Modul erweitern, um das Logo des PDF-Rechnungsgenerators zu ändern, können Sie Block oder Controller auf dieselbe Weise überschreiben um eine di.xml-Datei zu erstellen und keine Einstellungen vornehmen zu müssen.
}
quelle
di.xml
. Ich vermisse diesen wichtigen Teil in Ihrer Antwort ...Entwickler / Helloworld / registration.php
Entwickler / Helloworld / etc / module.xml
Entwickler / Helloworld / etc / di.xml
quelle
Eine Aktionsklasse kann auf die gleiche Weise wie in Magento 1 umgeschrieben werden. In Magento 1 hatten wir
before
Attribute um Tags<routers>..<args><modules><... before="Mage_Catalog">Namespace_MyModule ..
In
[module path]/etc/[nothing|adminhtml|frontend]/routes.xml
:Und die Actionklasse
\Namespace\MyModule\Controller\[same path of action as in core module]\SameActionName.php
woclass SameActionName.php extends \Magento\Catalog\...\SameActionName
Dies ist das Magento_Catalog-Modul,
Magento\Catalog\etc\adminhtml\routes.xml
das eine neue Route in admin registriert:http://devdocs.magento.com/guides/v2.1/extension-dev-guide/routing.html
Ich glaube nicht, dass Einstellungen oder Plugins für Action-Klassen eine gute Idee für Magento-Best Practices sind. Und vielleicht steckt noch mehr dahinter.
quelle
Um eine Klasse direkt zu überschreiben, müssen Sie Einstellungen verwenden. Weitere Informationen zu dev docs finden Sie unter: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/di-xml-file.html#abstraction-implementation-mappings
Für die meiste Zeit verwenden wir Interceptors (Plugins), da dies die beste Vorgehensweise ist, um einen Teil Ihrer Änderungen neu zu schreiben oder hinzuzufügen. Siehe dev docs: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
Indem Sie Ihr Beispiel für das Sortieren von Listenelementen beibehalten, indem Sie die neue Sortierreihenfolge "Am beliebtesten" hinzufügen, die ich Ihnen zur Verfügung stelle die beste Art, das Ergebnis zu verändern.
Erstellen Sie ein benutzerdefiniertes Modul und erstellen Sie die Konfiguration
app/code/Arsal/SortOption/etc/module.xml
:Registrieren Sie jetzt Ihr Modul
app/code/Arsal/SortOption/registration.php
:Jetzt erstelle di.xml
app/code/Arsal/SortOption/etc/di.xml
:Erstellen Sie nun eine Blockklasse
Arsal\SortOption\Block\Product\ProductListToolbar.php
:Dadurch wird der Liste der Sortierreihenfolgen eine benutzerdefinierte Sortierreihenfolge hinzugefügt. }
quelle