Comment réécrire une classe qui a déjà été réécrite?
-
16-10-2019 - |
Question
Mise à jour: J'ai trouvé qui est SMDesign_SMDZoom_Block_Product_View_Media
et non SMDesign_ColorswatchProductView_Block_Product_View_Media
comme je pensais à l'origine de la classe I réellement besoin de réécrire. Cependant, exactement le même problème est toujours valable.
L'extension SMDesign SMDZoom classe récrit bloc 'catalogue / product_view_media'. Le xml pour qui 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 à nouveau cette classe. Je veux réécrire la classe catalogue / product_view_media que ce module smdzoom est en train de réécrire. Cela peut-il être fait? Qu'est-ce que l'apparence xml config comme dans mon module pour le faire?
À l'heure actuelle c'est mon module fichier xml init:
<config>
<modules>
<Goorin_SMDZoom>
<active>true</active>
<codePool>local</codePool>
</Goorin_SMDZoom>
<depends>
<Mage_Catalog />
<SMDesign_SMDZoom />
</depends>
</modules>
</config>
et le fichier config.xml du module:
<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 tester:
class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
public function _construct() {
parent::_construct();
}
}
Je teste ce en affichant des notes de chemin de modèle, et je vois bloc SMDesign encore utilisé sur la page d'affichage du produit. Qu'est-ce que je fais mal?
La solution
Je mets le noeud <depends>
au mauvais endroit dans le fichier xml init mon module. Il doit être imbriqué dans le nœud du nom du module, comme suit:
<config>
<modules>
<Goorin_SMDZoom>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Catalog />
<SMDesign_SMDZoom />
</depends>
</Goorin_SMDZoom>
</modules>
</config>
Autres conseils
Cette partie ici:
<colorswatchproductview>
<rewrite>
<product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
</rewrite>
</colorswatchproductview>
ne vous aider si l'instanciation d'origine se fait via createBlock('colorswatchproductview/product_view_media)
il est peu probable depuis la première extension avec une réécriture, à savoir qu'ils veulent être montré 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 étendre 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é après le premier. Au cours de mes tests ici http://magebase.com/magento-tutorials/magento-extension -clashes-gagnants-et-loosers / J'ai travaillé que l'ordre de charge est basé sur l'ordre alphabétique de votre application / etc / modules / fichiers xml. En variante, cette commande peut être influencée à l'aide d'un noeud Depends (SMDesign_ColorswatchProductView).
Vous voyez le message d'erreur puisque vous essayez de rendre le bloc en vase clos, mais il a besoin d'un produit, il charge 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;
}
C'est pourquoi les classes de base ré-écriture suce.
Tir de là hanche ici, mais je pense que le mieux serait d'étendre la mise en œuvre de la couleur de swatch Mage_Catalog_Blog_Product_View_Media
puis faire votre module dépend du module nuancier de couleurs.
Alan tempête a répondu à une question similaire ici .
Encore mieux serait d'essayer de faire tout ce que vous essayez de le faire par un observateur.