2010-11-03 21 views
5

en una aplicación de 'nativo' Zend Framework que permitiría el uso de ezComponents añadiendo el cargador automático de ezComponents a Zends cargador automático:Cómo integrar ezComponents con Magento

$autoLoader = Zend_Loader_Autoloader::getInstance(); 
require_once('../library/EZComponents/Base/src/base.php'); 
$autoLoader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc'); 

Ahora, me pregunto cómo pude haz lo mismo con Magento. ¿Hay alguna manera de extender Varien_Autoload (autocargador magentos) para permitir una fácil integración de ezComponents? O: ¿Hay alguna manera de usar el autocargador Zends junto al de Magento sin interferir entre sí?

edición:

Bueno, implementó una solución, añadiendo lo siguiente a funcionar de carga automática() en Varien_Autoload:

if(substr($class, 0, 3) == 'ezc'){ 
     require_once('EZComponents/Base/src/base.php'); 
     return ezcBase::autoload($class); 

    } 

considero esto como un mal corte, sin embargo, ya que será sobreescrito, al actualizar Magento. ¿Alguien tiene una mejor idea?

+0

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

Respuesta

0

Eché un vistazo rápido al código del autocargador de Varien y parece que usa una llamada al spl_autoload_register, que es una pila para realizar autocarga. Aunque no creo que tengas mucho éxito añadiendo al autocargador predeterminado de Magento, esto significa que deberías poder empujar otro autocargador encima de Magento.

Espero que ayude!

Gracias, Joe

+0

Hola Joseph, sí gracias. Intenté eso, pero no funcionó. Quizás lo hice mal. Voy a cavar en eso una segunda vez y darle otra oportunidad. – volka

+0

Parece una buena idea, pero cuando la carga automática de Magento falla al cargar una clase, se genera una advertencia que detiene la ejecución. Como la carga automática de Magento está primero en la pila, esto significa que nunca llega a otros cargadores automáticos. Más información en mi respuesta. –

0

Acabo integrados en la clase Sailthru_Client Magento, pensaron que esto podría ayudar.

Tengo sailthru.php, Sailthru Client API, que contiene Sailthru_Client clase.

Creé la carpeta magentoroot/lib/Sailthru y luego copié sailthru.php en ella, luego renombré a Client.php convirtiéndolo en magentoroot/lib/Sailthru/Client.php. Este patrón se carga automáticamente por la clase Varien_Autoload.

+0

Creo que esto no funcionará con ezComponents (o mejor: no vale la pena el esfuerzo) ya que entonces necesitaría cambiar el nombre de cientos de clases. Y actualizar ezComponents va a ser un desastre entonces. – volka

+0

Creo que esto no funcionará con ezComponents (o mejor: no vale la pena el esfuerzo) ya que entonces necesitaría cambiar el nombre de cientos de clases. Y actualizar ezComponents va a ser un desastre entonces. – volka

16

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

  1. Retire la Varien_Autoloader del spl_autoload stack

  2. registrar nuestro propio cargador automático (vamos a utilizar Zend_Autoloader, ya que los barcos con Magento y parece familiarizado con él)

  3. 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'); 
+0

Muchas gracias @ alan-storm. Esto me ayudó mucho cuando traté de obtener la configuración de DomPdf. No estoy seguro de entender por completo cómo hacer la segunda opción. –

+0

@ dan.codes Escribí esto hace más de un año; en estos días solo me quedaba con la opción 1. La opción 2 era que yo estaba en una fase muy "de cómo hacer que mi código pareciera código Magento". –

+5

Desde PHP 5.3 no tiene que hacer el hokey pokey para obtener su autocargador primero. El tercer parámetro es un indicador para anteponer su autocargador en lugar de anexarlo. –