Quando si crea un'estensione per uso commerciale sarebbe bello se funziona su più versioni di Magento, forse anche CE ed EE.
Ma a volte questo non funziona come previsto perché il nucleo cambia da versione a versione.
La mia domanda riguarda: come devo gestire le piccole modifiche di base che influiscono sulla mia estensione. Non sto parlando di enormi cambiamenti che richiedono un re-factoring.
Ecco un esempio per renderlo più chiaro.
A partire da CE 1.8.1 (e EE 1.13.1) il metodo ha Varien_Io_File::write
cambiato il modo in cui funziona (la firma è la stessa) e il metodo è filePutContent
apparso che fa qualcosa di simile a quello che write
faceva in precedenza.
In questo momento faccio qualcosa di strano e controllo la versione di Magento per sapere quale metodo utilizzare per ottenere lo stesso risultato
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
Ora, voglio che funzioni anche su EE. Diventa ancora più brutto perché 1.8.1 è specifico di CE. Quindi il codice sopra diventa
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
dove il metodo si getCurrentVersion
presenta così
public function getCurrentVersion()
{
if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
return '1.13.1';
}
return '1.8.1';
}
Il codice sopra è un po 'semplificato (uso costanti appropriate per le versioni nel mio codice reale )
Ma questo funziona per CE 1.7 e versioni successive quando è Mage::getEdition()
stato introdotto il metodo . Se voglio che funzioni sulla versione precedente alla ce 1.7 diventa ancora più folle.
Ora immagina di nuovo questo cambiamento nella versione CE 1.11 e EE 1.16. Il caos è destinato a succedere.
C'è un modo più pulito di farlo senza fare if
o case
dichiarazioni?
method_exists
(method_exists ( mixed $object , string $method_name )
), che è meno restrittiva e più affidabile.