Mi enfoque básico aquí sería la creación de un módulo personalizado con un observador para el evento
controller_front_init_before
. En el caso del observador, podrá configurar su autocargador como lo desee. Hay un artículo de Magento Wiki en Setting up Event Observers. El evento controller_front_init_before
es uno de los primeros eventos no genéricos en disparar en Magento. Es por eso que lo estamos usando.
El gran problema que tenemos que resolver es esto: el autocargador de Magento está en la pila primero, y si no encuentra un archivo (que será el caso con las clases EZComponent), su inclusión generará un error que detendrá la ejecución.
Por lo tanto, lo que tenemos que hacer en nuestra observador caso anterior es
Retire la Varien_Autoloader
del spl_autoload stack
registrar nuestro propio cargador automático (vamos a utilizar Zend_Autoloader
, ya que los barcos con Magento y parece familiarizado con él)
volver a agregar el Varien_Autoloader
a la pila
Tendremos que hacer un poco de jactismo adicional ya que la carga de las clases en el espacio de nombre Zend
normalmente es manejada por el autocargador que eliminaremos. Véanse los comentarios para más detalles
//we need to manually include Zend_Loader, or else our zend autoloader
//will try to use it, won't find it, and then try to use Zend_Loader to
//load Zend_Loader
require_once('lib/Zend/Loader.php');
//instantiate a zend autoloader first, since we
//won't be able to do it in an unautoloader universe
$autoLoader = Zend_Loader_Autoloader::getInstance();
//get a list of call the registered autoloader callbacks
//and pull out the Varien_Autoload. It's unlikely there
//are others, but famous last words and all that
$autoloader_callbacks = spl_autoload_functions();
$original_autoload=null;
foreach($autoloader_callbacks as $callback)
{
if(is_array($callback) && $callback[0] instanceof Varien_Autoload)
{
$original_autoload = $callback;
}
}
//remove the Varien_Autoloader from the stack
spl_autoload_unregister($original_autoload);
//register our autoloader, which gets on the stack first
require_once('library/EZComponents/Base/src/base.php');
$autoLoader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
//lets just make sure we can instantiate an EZ class
#$test = new ezcBaseFile();
#var_dump(get_class($test));
//IMPORANT: add the Varien_Autoloader back to the stack
spl_autoload_register($original_autoload);
poner el código anterior en un método de observador y usted debe ser bueno para ir.
El otro enfoque que podría tomar, uno que se ajustaría más a los patrones de Magento, sería crear un módulo personalizado que implementara un cargador EZComponent.
$o = Mypackage_Mymodule_Loader::getModel('ezcBaseFile');
Se podría entonces poner en práctica el estilo cargador automático requiere código en su método getModel estática, y lo utilizan cada vez que quería una clase ezcBaseFile. Probablemente desee métodos para cargar una clase sin instanciar un objeto en caso de que desee llamar a un método estático en una clase base ezcBaseFile
.
$o = Mypackage_Mymodule_Loader::getLoadclass('ezcBaseFile');
Bueno, implementó una solución, añadiendo lo siguiente a funcionar de carga automática() en Varien_Autoload: [code] si (substr ($ clase, 0, 3) == 'EZC') { require_once ('EZComponents/Base/src/base.php'); return ezcBase :: autoload ($ class); } [/ code] Considero que esto es un hack muy malo, porque se sobrescribirá al actualizar Magento. ¿Alguien tiene una mejor idea? – volka