Lors de la création d'une extension à usage commercial, ce serait bien si cela fonctionne sur plusieurs versions de Magento, peut-être aussi CE et EE.
Mais parfois, cela ne fonctionne pas comme prévu car le noyau change d'une version à l'autre.
Ma question concerne, comment dois-je gérer les petits changements de base qui affectent mon extension. Je ne parle pas d'énormes changements qui nécessitent une refactorisation.
Voici un exemple pour le rendre plus clair.
À partir de CE 1.8.1 (et EE 1.13.1), la méthode a Varien_Io_File::writechangé son fonctionnement (la signature est la même) et la méthode filePutContentest apparue qui fait quelque chose de similaire à ce qui était writeutilisé auparavant.
En ce moment, je fais quelque chose de hacky et vérifie la version de Magento afin de savoir quelle méthode utiliser pour obtenir le même résultat
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
Maintenant, je veux que cela fonctionne aussi sur EE. Cela devient encore plus laid car 1.8.1 est spécifique à CE. Ainsi, le code ci-dessus devient
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
où la méthode getCurrentVersionressemble à ceci
public function getCurrentVersion()
{
if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
return '1.13.1';
}
return '1.8.1';
}
Le code ci-dessus est un peu simplifié (j'utilise des constantes appropriées pour les versions de mon vrai code )
Mais cela fonctionne pour CE 1.7 et supérieur lorsque la méthode a Mage::getEdition()été introduite. Si je veux qu'il fonctionne sur la version antérieure à ce 1.7, cela devient encore plus fou.
Imaginez maintenant que cela change à nouveau dans les versions CE 1.11 et EE 1.16. Le chaos est inévitable.
Existe-t-il une façon plus propre de le faire sans faire ifni casedéclarations?
method_exists(method_exists ( mixed $object , string $method_name )), qui est moins restrictive et plus fiable.