Comment gérer les classes désapprouvées « mysql4 » lors de la réécriture des modèles de ressources
-
16-10-2019 - |
Question
Je dois réécrire Mage_Catalog_Model_Resource_Category_Flat
.
L'ancienne classe des ressources Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Flat
est toujours là dans Magento 1.7 pour la compatibilité ascendante et prolonge la nouvelle.
Une recherche dans la base de code pour l'alias de modèle complet resource_eav_mysql4_category_flat
n'a donné aucun résultat. Mais le config.xml
de Mage_Catalog contient cette ligne:
<deprecatedNode>catalog_resource_eav_mysql4</deprecatedNode>
Et je ne sais pas où et comment deprecatedNode
est utilisé.
Quelles sont les difficultés sont là pour attendre lors de la réécriture d'un tel modèle de ressources? Dois-je réécrire les deux classes? Ou puis-je ignorer en toute sécurité la classe mysql4?
La solution
Si vous développez une extension pour un usage personnel qui est censé fonctionner uniquement pour votre projet de construction sur Magento 1.6+ alors il n'y a pas de soucis. Vous ne devez remplacer Mage_Catalog_Model_Resource_Category_Flat
en ajoutant ceci dans le fichier config.xml
de votre extension:
<models>
<catalog_resource>
<rewrite>
<category_flat>Namespace_Module_Model_Resource_Category_Flat</category_flat>
</rewrite>
</catalog_resource>
</models>
Si vous construisez une extension et vous voulez travailler sur la version avant 1.6 vous devez remplacer la classe de Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Flat
aussi. Dans ce cas, votre section config.xml
devrait ressembler à ceci:
<models>
<catalog_resource><!--used for 1.6+ -->
<rewrite>
<category_flat>Namespace_Module_Model_Resource_Category_Flat</category_flat>
</rewrite>
</catalog_resource>
<catalog_resource_eav_mysql4><!-- used for versions before 1.6 -->
<rewrite>
<category_flat>Namespace_Module_Model_Resource_Eav_Mysql4_Category_Flat</category_flat>
</rewrite>
</catalog_resource_eav_mysql4>
</models>
Vous devriez mettre toute votre logique Namespace_Module_Model_Resource_Category_Flat
et la classe pour les versions antérieures à 1.6 devrait ressembler à ceci:
class Namespace_Module_Model_Resource_Eav_Mysql4_Category_Flat extends Namespace_Module_Model_Resource_Category_Flat
{
}
De cette façon, les deux versions utilisent le même code.
Autres conseils
deprecatedNode
est utilisé par Magento pour essayer le modèle de charge des ressources mysql4*
si resource*
n'a pas été trouvé. Référence les commentaires de Mage_Core_Model_Config::getGroupedClassName
et Mage_Core_Model_Resource::getEntity
:
/** * Backwards compatibility for pre-MMDB extensions. * In MMDB release resource nodes <..._mysql4> were renamed to <..._resource>. So <deprecatedNode> is left * to keep name of previously used nodes, that still may be used by non-updated extensions. */
En cas de modèle resource*
vous devez le réécrire, sinon réécrire d'une mysql4*
. Exemple de réécriture modèle de ressources mysql4*
:
<config>
<global>
<models>
<review_mysql4>
<rewrite>
<review_collection>AW_AdvancedReviews_Model_Mysql4_Review_Collection</review_collection>
<review>AW_AdvancedReviews_Model_Mysql4_Review</review>
</rewrite>
</review_mysql4>
</models>
</global>
</config>
Les classes mysql4*
ne sont là que pour la compatibilité ascendante pour les implémentations existantes qui ont déjà les étendues. C'est à dire. shell cours pour éviter de forcer le code existant à mettre à jour l'étend sur tout pour continuer à travailler.