Comment réécrire une classe qui a déjà été réécrite?

15

Mise à jour: J'ai trouvé que la classe que j'avais réellement besoin de réécrire ne correspondait SMDesign_SMDZoom_Block_Product_View_Mediapas à ce SMDesign_ColorswatchProductView_Block_Product_View_Mediaque je pensais à l'origine. Cependant, le même problème s'applique toujours.

L'extension SMDesign SMDZoom réécrit la classe de bloc «catalogue / product_view_media». Le xml pour cela ressemble à ceci:

       <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>

Je veux réécrire cette classe à nouveau. Je veux réécrire la classe catalog / product_view_media que ce module smdzoom est en train de réécrire. Cela peut-il être fait? À quoi ressemblerait la configuration xml dans mon module pour ce faire?

Actuellement, voici mon fichier xml de module init:

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

et le fichier module config.xml:

<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>

Ma nouvelle classe ressemble simplement à ceci pour les tests:

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

Je teste cela en affichant des indications de chemin de modèle, et je vois le bloc SMDesign toujours utilisé sur la page d'affichage du produit. Qu'est-ce que je fais mal?

Nick Rolando
la source

Réponses:

13

J'ai placé le <depends>nœud au mauvais endroit dans le fichier init xml de mon module. Il doit être imbriqué dans le nœud du nom du module, comme ceci:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>
Nick Rolando
la source
10

Cette partie ici:

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

ne vous aidera que si l'instanciation d'origine est effectuée via createBlock('colorswatchproductview/product_view_media)
cela est peu probable car la première extension utilise une réécriture, c'est-à-dire qu'ils veulent être affichés partout où
createBlock('catalog/product_view_media')est utilisé

Une option serait d'utiliser une réécriture pour le même bloc

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

puis dans votre classe de bloc, étendez l'autre bloc d'extension

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Pour que cela fonctionne, votre extension doit être chargée après la première. Lors de mes tests ici http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ J'ai découvert que l'ordre de chargement était basé sur l'ordre alphabétique de vos fichiers application / etc / modules / xml . Alternativement, cet ordre peut être influencé en utilisant un nœud Depends (SMDesign_ColorswatchProductView).

Vous voyez le message d'erreur car vous essayez de rendre le bloc de manière isolée mais il a besoin d'un produit qu'il charge à partir de son bloc parent:

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 chez Fooman
la source
J'ai ignoré vos instructions et je ne peux pas réécrire la classe, même avec le nœud dépendant.
Nick Rolando
Essayez de renommer votre fichier xml init de module en z.xml suivi d'une actualisation du cache.
Kristof à Fooman le
Désolé, je n'y suis pas revenu depuis un moment. J'ai renommé le fichier init xml en zzz.xml et la réécriture a fonctionné! Donc je suppose que je dois comprendre pourquoi le <depends>nœud ne fonctionne pas ..
Nick Rolando
Je remercie +1 pour l'aide et m'a conduit à la réponse :)
Nick Rolando
3

C'est pourquoi réécrire les classes de base est nul.

Prise de vue à partir de là, hanche ici, mais je pense que votre meilleur pari serait d'étendre la mise en œuvre de l'échantillon de couleur Mage_Catalog_Blog_Product_View_Mediaet de faire en sorte que votre module dépende du module de l'échantillon de couleur.

Alan Storm a répondu à une question similaire ici .

Encore mieux serait d'essayer de faire tout ce que vous essayez de faire par le biais d'un observateur.

wlvrn
la source