Come riscrivere una classe che è già stata riscritta?


15

Aggiornamento: ho scoperto che la classe che ho effettivamente bisogno di riscrivere è SMDesign_SMDZoom_Block_Product_View_Mediae non SMDesign_ColorswatchProductView_Block_Product_View_Mediacome pensavo inizialmente. Tuttavia, si applica ancora lo stesso identico problema.

L'estensione SMDZoom di SMDesign riscrive la classe di blocco 'catalog / product_view_media'. L'xml per questo assomiglia a questo:

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

Voglio riscrivere di nuovo questa lezione. Voglio riscrivere la classe catalog / product_view_media che questo modulo smdzoom sta riscrivendo. Può essere fatto? Come sarebbe il file XML di configurazione nel mio modulo per fare questo?

Attualmente questo è il mio file init xml del modulo:

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

e il file config.xml del modulo:

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

La mia nuova classe assomiglia semplicemente a questa per i test:

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

Lo sto testando visualizzando i suggerimenti sul percorso del modello e vedo il blocco SMDesign ancora utilizzato nella pagina di visualizzazione del prodotto. Che cosa sto facendo di sbagliato?

Risposte:


13

Ho messo il <depends>nodo nella posizione sbagliata nel file init xml del mio modulo. Deve essere nidificato nel nodo del nome del modulo, in questo modo:

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

10

Questa parte qui:

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

ti aiuterà solo se l'istanza originale viene eseguita tramite createBlock('colorswatchproductview/product_view_media)
questo è improbabile poiché la prima estensione utilizza una riscrittura, cioè vogliono essere mostrati ovunque
createBlock('catalog/product_view_media')sia usato

Un'opzione sarebbe quella di usare una riscrittura per lo stesso blocco

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

e poi nella tua classe di blocco estendi l'altro blocco di estensione

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Perché questo funzioni l'estensione deve essere caricata dopo la prima. Durante i miei test qui http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ Ho scoperto che l'ordine di caricamento si basa sull'ordine alfabetico della tua app / etc / modules / file xml . In alternativa, questo ordine può essere influenzato utilizzando un nodo Depends (SMDesign_ColorswatchProductView).

Viene visualizzato il messaggio di errore poiché si sta tentando di eseguire il rendering del blocco in modo isolato ma necessita di un prodotto, che viene caricato dal blocco principale:

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

Sono andato via dalle tue istruzioni e non posso riscrivere la classe, anche con il nodo dipendente.
Nick Rolando,

Prova a rinominare il tuo file init xml del modulo in z.xml seguito da un aggiornamento della cache.
Kristof a Fooman il

Scusa se non ci torno da un po '. Ho rinominato il file init xml in zzz.xml e la riscrittura ha funzionato! Quindi suppongo di dover capire perché il <depends>nodo non funziona ...
Nick Rolando l'

I +1 grazie per l'aiuto e per avermi portato alla risposta :)
Nick Rolando l'

3

Ecco perché riscrivere le classi principali fa schifo.

Riprendendo da qui, ma penso che la soluzione migliore sarebbe estendere l'implementazione del campione di colore Mage_Catalog_Blog_Product_View_Mediae quindi fare in modo che il modulo dipenda dal modulo di campione di colore.

Alan Storm ha risposto a una domanda simile qui .

Ancora meglio sarebbe provare a fare qualunque cosa tu stia cercando di fare attraverso un osservatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.