Come riscrivere una classe che è già stato riscritto?
-
16-10-2019 - |
Domanda
Aggiornamento: ho scoperto che la classe in realtà ho bisogno di riscrittura è SMDesign_SMDZoom_Block_Product_View_Media
e non SMDesign_ColorswatchProductView_Block_Product_View_Media
come ho inizialmente pensato. Tuttavia, lo stesso identico problema si applica ancora.
L'estensione SMDesign SMDZoom riscrive classe block 'Catalogo / product_view_media'. L'XML per che 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 ancora una volta questa classe. Voglio riscrivere la classe del catalogo / product_view_media che questo modulo smdzoom sta riscrivendo. Può essere fatto? Quale sarebbe l'aspetto di configurazione XML come nel mio modulo per fare questo?
Attualmente questo è il mio modulo di file init xml:
<config>
<modules>
<Goorin_SMDZoom>
<active>true</active>
<codePool>local</codePool>
</Goorin_SMDZoom>
<depends>
<Mage_Catalog />
<SMDesign_SMDZoom />
</depends>
</modules>
</config>
e il file del modulo 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>
La mia nuova classe appare semplicemente come questo per il test:
class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
public function _construct() {
parent::_construct();
}
}
sto testando questo visualizzando sentori percorso del modello, e sto vedendo blocco SMDesign ancora in uso sulla pagina di visualizzazione del prodotto. Che cosa sto facendo di sbagliato?
Soluzione
ho messo il nodo <depends>
nella posizione sbagliata nel file xml init del mio modulo. Deve essere nidificato all'interno di 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>
Altri suggerimenti
Questa parte qui:
<colorswatchproductview>
<rewrite>
<product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
</rewrite>
</colorswatchproductview>
solo vi aiuterà se l'istanza originale è fatto tramite createBlock('colorswatchproductview/product_view_media)
questo è improbabile poiché la prima estensione è utilizzando una riscrittura, vale a dire che vogliono essere mostrato ovunque
createBlock('catalog/product_view_media')
viene utilizzato
Una possibilità sarebbe quella di utilizzare 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 blocco estendere l'altro blocco estensione
class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media
Per far funzionare tutto questo proprio interno deve essere caricato dopo il primo. Durante le mie prove qui http://magebase.com/magento-tutorials/magento-extension -clashes-vincitori-e-perdenti / ho lavorato che l'ordine di caricamento si basa su l'ordine alfabetico della vostra app / etc file / modules / xml. In alternativa questo ordine può essere influenzato utilizzando un nodo Dipende (SMDesign_ColorswatchProductView).
Stai visualizzando il messaggio di errore in quanto si sta cercando di rendere il blocco in modo isolato, ma è necessario un prodotto che viene caricato da suo blocco padre:
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;
}
Questo è il motivo per ri-scrittura di classi di base fa schifo.
ripresa da lì hip qui, ma credo che la soluzione migliore sarebbe quella di estendere l'applicazione del campione di colore Mage_Catalog_Blog_Product_View_Media
e poi fare il modulo dipenderà dal modulo di campione di colore.
Alan Tempesta risposto ad una simile domanda qui .
Ancora meglio sarebbe cercare di fare tutto ciò che si sta cercando di fare attraverso un osservatore.