Wir verwenden eine Erweiterung, die den Mage_Catalog_Block_Product_List_Toolbar-Block global überschreibt.
<global>
<blocks>
<catalog>
<rewrite>
<product_list_toolbar>Amasty_Shopby_Block_Catalog_Product_List_Toolbar</product_list_toolbar>
</rewrite>
</catalog>
</blocks>
</global>
Während die Erweiterung im Kontext einer geschichteten Navigationskategorie funktioniert, funktioniert die umgeschriebene Klasse nicht ordnungsgemäß, wenn wir eine beliebige Produktliste in eine andere (benutzerdefinierte) Ansicht in unserem eigenen internen Modul einfügen. Wenn wir die Erweiterung nur zu Testzwecken überschreiben, funktioniert alles einwandfrei.
Wie können wir das Umschreiben einer Erweiterung nur für unseren eigenen Controller rückgängig machen, ohne den Community-Code des Erweiterungsentwicklers zu bearbeiten?
magento-1
extensions
overrides
Aaron Pollock
quelle
quelle
<rewrite>
Nach allem, was ich sagen kann, erlaubt Magento nur eine pro Klasse. Obwohl ich meine eigene Klasse erstellen konnte, um die Kernklasse zu erweitern, bin ich mir nicht sicher, wie ich sie über diegetBlock('catalog/product_list_toolbar')
Factory-Methode zum Laufen bringen würde .Antworten:
Vorsichtsmaßnahmen: Es gibt keine spezielle Methode, um die Anforderungen des Systems zu erfüllen. Das Folgende sollte funktionieren, aber ich habe es auf einem Produktionssystem noch nie ausgiebig ausprobiert, und es kann Situationen geben, in denen es mehr Probleme verursacht, als es sich lohnt. Fahren Sie nur fort, wenn Sie mit dem Debuggen von Problemen im Zusammenhang mit dem Ändern der Umschreibungen eines funktionierenden Systems vertraut sind.
Schritt 1 macht das Neuschreiben rückgängig. Der Magento-Konfigurationsbaum kann zur Laufzeit geändert werden. Also, wenn Sie den folgenden Code ausführen
Dann instanziiert Magento den ursprünglichen
Mage_Catalog_Block_Product_List_Toolbar
Block für den Rest der Anfrage.In Schritt 2 wird entschieden, wo dies in Ihrem Modul aufgerufen werden soll. Da dies nur für Ihren Controller gilt und ein Block neu geschrieben wird, der erst am Ende Ihres Controllers instanziiert wird, füge ich Ihrer Controller-Klasse so etwas wie eine Methode hinzu
Rufen Sie diese Methode zu Beginn jeder Ihrer Aktionen auf
Dies mag etwas klobig erscheinen, aber ich denke, es ist eine gute Idee, klobig (dh offensichtlich) zu sein, wenn Sie mit Magentos Systemobjekten klug sind. Ein anderer Ort dafür könnten die Ereignisse
controller_action_predispatch
oder seincontroller_action_predispatch_front_controller_action
und / oder bedingt angewendet werden.Denken Sie daran, dass das Umschreiben erst dann rückgängig gemacht wird, wenn diese Methode aufgerufen wird. Das heißt, wenn Sie versuchen, einen Block vor dem Aufruf zu instanziieren
_undoRewrites
, wird die neu geschriebene Klasse verwendet, um das Objekt zu instanziieren.quelle
Lösung 1:
Sie können versuchen, die Klasse direkt in Ihrem Controller zu instanziieren (PHP-Methode)
Anstatt von
so etwas wie:
Lösung 2:
Ein anderer Ansatz wäre, in Ihrem Modul eine neue Klasse zu erstellen, die die ursprüngliche Klasse erweitert und diese verwendet.
Lösung 3:
Andernfalls, wenn die Erweiterung nicht verschlüsselt ist (wir alle lieben Open Source :), können Sie herausfinden, warum sie Ihre Inhalte beschädigt
quelle
rewrite
mit derselben Basisklasse machen kann. Daher funktioniert die Factory-Methode nicht (ich glaube, Sie haben dies bereits erkannt). Vielleicht gibt es keinen Magento-Weg, um dies zu tun, aber lasst uns ein bisschen nachsehen, ob es einen besseren Weg gibt.$this->getLayout()->createBlock("Mage_Catalog_Block_Product_List_Toolbar")
in einem Blockklassenkontext). Wenn/
der Parameter keine enthält , verwendet Magento die Zeichenfolge wie sie ist, um nach der Klasse zu suchen.Wenn für denselben Klassenalias mehrere Überschreibungen vorhanden sind, wird die letzte vom Magento-Konfigurationslader aus config.xml "analysiert". Ich würde dieses Problem angreifen, indem ich:
catalog/product_list_toolbar
in Ihrer ErweiterungMage_Catalog_Block_Product_List_Toolbar
Lassen Sie Ihren Block anstelle der Amasty-Klasse verlängern.quelle
Ähnlich dem, was Francesco oben vorgeschlagen hat, aber ich glaube, Sie können den vollständigen Klassennamen tatsächlich an getModel übergeben. Auf diese Weise machen Sie immer noch das Gleiche, verwenden jedoch die Kernmethoden, um dies zu tun. Ich bin mir nicht ganz sicher, welche Vor- und Nachteile diese Methode hat, aber ich dachte, ich würde das als Idee rausschmeißen.
Ich bin der Meinung, dass dies die Standardmethode zum Laden von Klassen in Magento2 sein wird.
quelle
Ich fürchte, Sie müssen den Erweiterungscode geringfügig ändern. Schreiben Sie die Klasse nicht
config.xml
mehr in Ihrer eigenen um , sondern ändern Sie sieAmasty_Shopby_Block_Catalog_Product_List_Toolbar
, um die Klasse zu erweitern, die sich wiederum erweitertMage_Catalog_Block_Product_List_Toolbar
.quelle