Wie schreibe ich eine Klasse um, die bereits umgeschrieben wurde?

15

Update: Ich habe festgestellt, dass die Klasse, die ich neu schreiben muss, SMDesign_SMDZoom_Block_Product_View_Medianicht so ist, SMDesign_ColorswatchProductView_Block_Product_View_Mediawie ich es ursprünglich gedacht habe. Es gilt jedoch genau dasselbe.

Die Erweiterung SMDesign SMDZoom schreibt die Blockklasse 'catalog / product_view_media' um. Die XML dafür sieht so aus:

       <global>
    ...         
       <blocks>
        <smdzoom>
            <class>SMDesign_SMDZoom_Block</class>
        </smdzoom>
    </blocks>
    <blocks>
        <catalog>
            <rewrite>
                <product_view_media>SMDesign_SMDZoom_Block_Product_View_Media</product_view_media>
            </rewrite>
        </catalog>
    </blocks>
           ....
       </global>

Ich möchte diese Klasse noch einmal umschreiben. Ich möchte die Klasse catalog / product_view_media neu schreiben, die dieses smdzoom-Modul neu schreibt. Kann das gemacht werden? Wie würde die XML-Konfiguration in meinem Modul dafür aussehen?

Derzeit ist dies meine Modul-Init-XML-Datei:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
        </Goorin_SMDZoom>
        <depends>
            <Mage_Catalog />
            <SMDesign_SMDZoom />
        </depends>
    </modules>
</config>

und die Datei config.xml des Moduls:

<global>
        <blocks>
            <gbismdzoom>
                <class>Goorin_SMDZoom_Block</class>
            </gbismdzoom>
            <catalog>
                <rewrite>
                    <product_view_media>Goorin_SMDZoom_Block_Product_View_Media</product_view_media>
                </rewrite>
            </catalog>
        </blocks>
    </global>

Meine neue Klasse sieht zum Testen einfach so aus:

class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
    public function _construct() {
        parent::_construct();
    }
}

Ich teste dies durch Anzeigen von Vorlagenpfadhinweisen und sehe, dass der SMDesign-Block immer noch auf der Produktansichtsseite verwendet wird. Was mache ich falsch?

Nick Rolando
quelle

Antworten:

13

Ich habe den <depends>Knoten an der falschen Stelle in der Init-XML-Datei meines Moduls abgelegt. Es muss wie folgt im Knoten des Modulnamens verschachtelt sein:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>
Nick Rolando
quelle
9

Dieser Teil hier:

        <colorswatchproductview>
            <rewrite>
                <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
            </rewrite>
        </colorswatchproductview>

wird Ihnen nur weiterhelfen, wenn die ursprüngliche Instanziierung über createBlock('colorswatchproductview/product_view_media)
diese erfolgt, ist unwahrscheinlich, da die erste Erweiterung ein Umschreiben verwendet, dh sie möchten überall dort angezeigt werden, wo sie
createBlock('catalog/product_view_media')verwendet wird

Eine Möglichkeit wäre die Verwendung eines Neuschreibens für denselben Block

  <catalog>
    <rewrite>
      <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
    </rewrite>
  </catalog>

und erweitern Sie dann in Ihrer Blockklasse den anderen Erweiterungsblock

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Damit dies funktioniert, muss Ihre Erweiterung nach der ersten geladen werden. Während meiner Tests hier http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ habe ich herausgefunden, dass die Ladereihenfolge auf der alphabetischen Reihenfolge Ihrer app / etc / modules / xml-Dateien basiert . Alternativ kann diese Reihenfolge über einen Depends-Knoten (SMDesign_ColorswatchProductView) beeinflusst werden.

Sie sehen die Fehlermeldung, da Sie versuchen, den Block isoliert zu rendern, aber ein Produkt benötigt, das vom übergeordneten Block geladen wird:

abstract class Mage_Catalog_Block_Product_View_Abstract extends Mage_Catalog_Block_Product_Abstract
{
    /**
     * Retrive product
     *
     * @return Mage_Catalog_Model_Product
     */
    public function getProduct()
    {
        $product = parent::getProduct();
        if (is_null($product->getTypeInstance(true)->getStoreFilter($product))) {
            $product->getTypeInstance(true)->setStoreFilter(Mage::app()->getStore(), $product);
        }

        return $product;
    }
Kristof bei Fooman
quelle
Ich habe Ihre Anweisungen nicht befolgt und kann die Klasse nicht umschreiben, selbst mit dem abhängigen Knoten.
Nick Rolando
Versuchen Sie, Ihre Modul-Init-XML-Datei in z.xml umzubenennen, gefolgt von einer Cache-Aktualisierung.
Kristof bei Fooman
Tut mir leid, dass ich eine Weile nicht mehr darauf zurückgekommen bin. Ich habe die Init-XML-Datei in zzz.xml umbenannt und das Umschreiben hat funktioniert! Also muss ich wohl herausfinden, warum der <depends>Knoten nicht funktioniert.
Nick Rolando
Ich +1 danke für die Hilfe und führte mich zur Antwort :)
Nick Rolando
3

Das ist der Grund, warum das Umschreiben von Kernklassen scheiße ist.

Von dort aus zu drehen ist hier angesagt, aber ich denke, Ihre beste Wahl wäre, die Implementierung von Farbfeldern zu erweitern Mage_Catalog_Blog_Product_View_Mediaund dann Ihr Modul vom Farbfeldmodul abhängig zu machen.

Alan Sturm beantwortet eine ähnliche Frage hier .

Noch besser wäre es, zu versuchen, alles, was Sie versuchen, durch einen Beobachter zu tun.

wlvrn
quelle