Wie überschreibe / schreibe ich eine Blockklasse in Magento 1 neu?

11

Hinweis: Dies ist als kanonische Frage gedacht, die ausführlich erklärt, wie Blockumschreibungen funktionieren, und als doppeltes Ziel für spezifischere Fragen "Wie überschreibe ich Block X" oder "Warum funktioniert mein Umschreiben nicht?" Verwendet werden kann.

Siehe auch: Auf der Suche nach kanonischen Fragen zu Magento 1-Überschreibungen

Angenommen, ich muss Änderungen an einer Kernblockklasse in einem benutzerdefinierten Modul vornehmen (Methoden ändern oder Methoden hinzufügen). Wie mache ich das Schritt für Schritt?

Fabian Schmengler
quelle

Antworten:

22

Jeder Block oder jede Gruppe von Blöcken wird in der config.xmlDatei eines solchen Moduls (innerhalb des <global>Tags) deklariert .
Hier ist ein Beispiel aus dem Katalogmodul

    <blocks><!-- marks definition of a block group -->
        <catalog><!-- unique alias for blocks in the module -->
            <class>Mage_Catalog_Block</class><!-- class prefix for all blocks -->
        </catalog>
    </blocks>

Dies bedeutet, dass ein Block mithilfe des Alias ​​instanziiert werden kann, catalog/class_name_herewobei class_name_heresich der Rest des Klassenpfads ab dem Präfix befindet.
Dies bedeutet catalog/class_name_here, dass standardmäßig auf zugeordnet wird Mage_Catalog_Block_Class_Name_Here.

Um einen Block neu zu schreiben, müssen Sie ein Modul erstellen, das von dem Modul abhängt, das Sie Magento_Catalogin meinem Beispiel ändern möchten ( ).
Und Sie müssen dies config.xmlunter dem <global>Tag hinzufügen .

<blocks>
    <catalog><!-- alias of the block group you are rewriting -->
        <rewrite><!-- reserved tag: specify that you are rewriting something -->
             <class_name_here>YourNamespace_YourModule_Block_Your_New_Class_Here</class_name_here> <!-- tag: the rest of the alias of the class you are rewriting. value: the name of your class that rewrites the core class -->
        </rewrite>
    </catalog>
</blocks>

Erstellen Sie dann die Klasse YourNamespace_YourModule_Block_Your_New_Class_Here(gemäß der ZF-Ordnerstruktur) und lassen Sie diese Klasse die ursprüngliche Klasse erweitern.

class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
    //your awesome code here
}

Wenn Sie fertig sind, deaktivieren Sie die Kompilierung und aktivieren Sie sie erneut (falls erforderlich) und leeren Sie den Cache.

Dies funktioniert nicht für abstrakte Blöcke.
Es funktioniert nur für Klassen, die instanziiert werden.

Beispiel

Angenommen, Sie möchten die Datei app \ code \ core \ Mage \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.php neu schreiben, die die Klasse Mage_Catalog_Block_Product_View_Options_Type_Selectin Ihrem eigenen Modul Marius_Test enthält .

Dann benötigen Sie diesen Eintrag in Ihrem config.xml:

<blocks>
    <catalog>
        <rewrite>
            <product_view_options_type_select>Marius_Test_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
        </rewrite>
    </catalog>
</blocks>

app \ code \ local \ Marius \ Test \ Block \ Katalog \ Produkt \ Ansicht \ Optionen \ Typ \ Select.php :

class Marius_Test_Block_Catalog_Product_View_Options_Type_Select extends Mage_Catalog_Block_Product_View_Options_Type_Select
{
    //your awesome code here
}
Marius
quelle
Funktioniert nicht. Ich versuche, die Klasse Mage_Catalog_Block_Product_View_Options_Type_Selectin app \ code \ local \ WR \ EPO \ Block \ Katalog \ Block \ Produkt \ Ansicht \ Optionen \ Typ \ Select.php zu überschreiben . Ich habe es so versucht: codepen.io/anon/pen/WYOqBr
Black
Und wenn es nicht funktioniert, denkst du, dass meine Antwort falsch ist, also stimmst du sie ab, anstatt zu denken, dass du vielleicht etwas falsch machst. Wie auch immer ... ersetzen Sie dies <Mage_Catalog_Block_Product_View_Options_Type_Select> WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select </Mage_Catalog_Block_Product_View_Options_Type_Select>durch <product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>und stellen Sie sicher, dass keine Leerzeichen vorhanden sindproduct_view_options_type_select
Marius
Ich habe abgelehnt, weil Ihre Antwort nicht präzise war und obwohl ich sie Schritt für Schritt befolgt habe, nicht das richtige Ergebnis erzielt hat. Sie haben geschrieben, dass wir den Klassennamen verwenden müssen, also habe ich ihn verwendet und es hat nicht funktioniert. Wir müssen product_view_options_type_selectanstelle des echten Klassennamens verwenden Mage_Catalog_Block_Product_View_Options_Type_Select. Wenn Sie Ihre Antwort entsprechend ändern, werde ich abstimmen.
Schwarz
Wenn Sie es Schritt für Schritt lesen, haben Sie einen Schritt verpasst. Der, in dem ich erkläre, was der Klassenalias ist. Wenn Sie nur kopieren und ersetzen, wird es funktionieren. 17 Leute verstanden. Ich denke, ich habe es richtig erklärt
Marius
Ja, aber ein gutes Beispiel fehlt, damit wir sicherstellen können, dass wir Ihre Theorie richtig verstanden haben
Black
4

Für My Point of View überschreiben und schreiben Sie diese beiden Dinge unterschiedlich.

Überschreiben:

Wenn wir einen Design-Fallback-Mechanismus verwenden, überschreiben wir ihn

Umschreiben:

Wenn wir Magento Core-Klassen in unserer Klasse umschreiben, schreiben wir neu.

1) Beispiel für das Überschreiben:

Wenn ich die app/code/core/Mage/Catalog/Block/Product/List.phpDatei überschreiben muss, kopiere ich sie in mein lokales Modul mit demselben Pfad wie unten gezeigtapp/code/local/Mage/Catalog/Block/Product/List.php

Dies wird von Magento nicht empfohlen. Sie können dies jedoch tun.

2) Beispiel für ein Umschreiben:

Wenn ich diese Blockklasse neu schreiben möchte, Mage_Adminhtml_Block_Sales_Order_Createcodiere ich in meinem Modul config.xml wie unten

    <global>
        <blocks>
            <adminhtml>
                <rewrite>

                    <sales_order_create>Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create</sales_order_create>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>

Und in meiner Klasse Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

Ich codiere wie unten

class Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create extends Mage_Adminhtml_Block_Sales_Order_Create {
      My Function Or funcions That I want to Rewrite..
}
Murtuza Zabuawala
quelle
2

Es ist wichtig, hier hinzuzufügen, dass Blockumschreibungen (sowie alle anderen Umschreibungen von Magento-Modulen) den höheren Wartungsaufwand bedeuten und daher als letzte Chance zur Erweiterung der Funktionalität nach Konfigurationsmanipulation, Ereignissen und Themenanpassung betrachtet werden sollten.

Mögliches Problem 1: Die neu geschriebene Vorlage wird nicht aktualisiert, wenn Sie oder ein anderer Betreuer die Quelldateien von Magento aktualisieren. Bedeutet, dass die Sicherheitsupdates oder -verbesserungen nicht auf Ihren Code angewendet werden. Gleiches gilt für andere neu geschriebene Klassen, einschließlich Blöcke, hängt jedoch davon ab, wie viel neu geschrieben wurde (siehe unten).

Mögliches Problem 2: Der neu geschriebene Block (oder eine andere Klasse) wird möglicherweise von einer anderen Erweiterung neu geschrieben, die Sie oder ein anderer Betreuer zu installieren versuchen. Dann müssen Sie diesen Konflikt lösen.

Alternative 1: Verwenden Sie Ereignisse, dh durchsuchen Sie den Code, den Sie gerade umschreiben möchten, und prüfen Sie, ob Ereignisse vorhanden sind, mit denen die gewünschte Funktionalität erreicht werden kann.

Alternative 2: Smart umschreiben, dh umschauen: Überprüfen Sie möglicherweise die Stelle, an der die Klasse, die Sie umschreiben möchten, instanziiert ist, und prüfen Sie, ob Sie beeinflussen können, welche Klasse über config oder events ausgewählt wird. Möglicherweise gibt es eine Klasse, um die Sie eine 3-Zeilen-Methode überschreiben können, um den Klassennamen zu ersetzen, anstatt die 30-Zeilen-Methode von der ursprünglichen Klasse in die neu geschriebene zu kopieren.

Anton Boritskiy
quelle