Was mache ich, wenn eine Erweiterung eine Klasse weltweit überschreibt und ich das Original verwenden möchte?

magento.stackexchange https://magento.stackexchange.com/questions/9

  •  16-10-2019
  •  | 
  •  

Frage

Wir verwenden eine Erweiterung, die den mage_catalog_block_product_list_toolbar block weltweit ü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 das Erweiterungsüberschreib nur zu Testzwecken herausnehmen, 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?

War es hilfreich?

Lösung

Vorbehalte: Es gibt keine Art, das zu tun, was Sie im System fragen. Das Folgende sollte funktionieren, aber ich habe es nie ausgiebig in einem Produktionssystem ausprobiert, und es kann Situationen geben, in denen es mehr Probleme verursacht, die es wert ist. Gehen Sie nur dann fort, wenn Sie sich bequeme Probleme im Zusammenhang mit der Änderung der Umschreibungen eines Arbeitssystems bequem haben.

Schritt 1 schließt das Umschreiben auf. Der Magento -Konfigurationsbaum kann zur Laufzeit geändert werden. Wenn Sie also den folgenden Code ausführen

$config = Mage::getConfig();        
$config->setNode(
    'global/blocks/catalog/rewrite/product_list_toolbar',
    'Mage_Catalog_Block_Product_List_Toolbar'
);

Dann wird Magento das Original instanziieren Mage_Catalog_Block_Product_List_Toolbar Block für den Rest der Anfrage.

Schritt 2 entscheidet, wo Sie dies in Ihrem Modul nennen sollen. Da dies nur für Ihren Controller ist und einen Block umschreibt, der erst am Ende Ihres Controllers instanziiert wird, würde ich Ihrer Controller -Klasse eine Methode hinzufügen

protected function _undoRewrites()
{
    $config = Mage::getConfig();        
    $config->setNode(
        'global/blocks/catalog/rewrite/product_list_toolbar',
        'Mage_Catalog_Block_Product_List_Toolbar'
    );    
}

und nennen Sie diese Methode dann zu Beginn jeder Ihrer Aktionen

public function indexAction()
{
    $this->_undoRewrites();
    $test = Mage::getSingleton('core/layout')->createBlock('catalog/product_list_toolbar');        
    var_dump($test);
}

Das mag ein wenig 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önnte der sein controller_action_predispatch oder controller_action_predispatch_front_controller_action Ereignisse und/oder bedingt angewendet.

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 Anruf zu instanziieren _undoRewrites, Die umgeschriebene Klasse wird verwendet, um das Objekt zu instanziieren.

Andere Tipps

Lösung 1:
Sie können versuchen, die Klasse direkt (PHP -Weg) in Ihrem Controller zu instanziieren

Anstatt von

$this->getLayout()->createBlock('catalog/product_list_toolbar');

etwas wie:

$block = New Magento_Catalog_Product_List_Toolbar;
$this->getLayout()->addBlock(....);

Lösung 2:
Ein weiterer Ansatz wäre, eine neue Klasse in Ihrem Modul zu erstellen, die die ursprüngliche Klasse erweitert und diese verwenden.

Lösung 3:
Andernfalls, wenn die Erweiterung nicht kryptiert ist (wir alle lieben Open Source :) Sie können versuchen herauszufinden, warum sie Ihre Sachen bricht

Wenn für denselben alias derselben Klasse mehrere Umschreibungen vorhanden sind, enthält der Magento -Konfigurationsloader von config.xml "gewinnt". Ich würde dieses Problem angreifen von:

  1. Erstellen Sie eine eigene neue Erweiterung.
  2. Schreiben Sie das um catalog/product_list_toolbar in Ihrer Erweiterung
  3. Lassen Sie Ihren Block verlaufen Mage_Catalog_Block_Product_List_Toolbar anstelle der Amasty -Klasse.
  4. Kommentieren Sie Ihre Klasse großzügig und erklären Sie, dass dieser Umschreibungskonflikt beabsichtigt ist. Sie möchten nicht, dass ein anderer Entwickler, der Magerun betreibt, den von Ihnen gerade erstellten Umschreibkonflikt "beheben".
  5. Fügen Sie eine Abhängigkeit in die App/etc/modules/bla.xml -Datei Ihrer Erweiterung hinzu, um sicherzustellen, dass Ihre Erweiterung nach der Amasty -Einrichtung geladen wird.

Ähnlich wie das oben vorgeschlagene Francesco, aber ich glaube, Sie können den vollständigen Klassennamen in GetModel übergeben. Auf diese Weise tun Sie noch etwas immer noch dasselbe, aber mit Kernmethoden, um dies zu tun. Ich bin mir der Vor-/Nachteile dieser Methode nicht ganz sicher, dachte aber, ich würde das als Idee dort rauswerfen.

Mage::getModel('Mage_Catalog_Block_Product_List_Toolbar');

Nebenbei bemerkt, ich glaube, dies wird die Standardmethode sein, um Klassen in Magento2 zu laden.

Sie müssen eine leichte Änderung des Erweiterungscode vornehmen, den ich fürchte. Schreiben Sie die Klasse nicht in Ihrem eigenen um config.xml Wechseln Sie einfach mehr Amasty_Shopby_Block_Catalog_Product_List_Toolbar Um Ihre Klasse zu erweitern, die sich wiederum erstreckt Mage_Catalog_Block_Product_List_Toolbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top