如何将ezComponents与magento集成

时间:2010-11-03 10:16:21

标签: magento integration zeta-components autoloader

在“本机”Zend Framework应用程序中,我将ezComponents的自动加载器添加到Zends自动加载器中,以便使用ezComponents:

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

现在,我想知道如何用Magento做同样的事情。 有没有办法扩展Varien_Autoload(magentos自动加载器)以便轻松集成ezComponents? 要么: 有没有办法在Magento旁边使用Zends自动加载器而不会相互干扰?

编辑:

好吧,我通过在Varien_Autoload中添加以下函数autoload()来实现一种解决方法:

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

    }

我认为这是一个非常糟糕的黑客,因为它会在升级Magento时被覆盖。有没有人有更好的主意?

3 个答案:

答案 0 :(得分:17)

我的基本方法是创建一个带有

观察者的自定义模块
controller_front_init_before

事件。在观察者事件中,您可以根据需要设置自动加载器。在Setting up Event Observers上有一篇Magento Wiki文章。 controller_front_init_before事件是Magento中首先发生的非一般事件之一。这就是我们使用它的原因。

我们需要解决的一个大问题是:Magento的自动加载器首先在堆栈中,如果找不到文件(EZComponent类就是这种情况),它的include会引发错误停止执行。

所以,我们在上面的事件观察者中需要做的是

  1. Varien_Autoloader

  2. 中删除spl_autoload stack
  3. 注册我们自己的自动加载器(我们将使用Zend_Autoloader,因为它附带Magento并且你似乎熟悉它)

  4. Varien_Autoloader重新添加到堆栈

  5. 我们需要做一些额外的jiggery-pokery,因为Zend命名空间中的类加载通常由我们将删除的自动加载器处理。有关详细信息,请参阅注释

    //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);      
    

    将上述代码放在观察者方法中,你应该好好去。

    您可以采用的另一种方法,即使用Magento模式更适合的方法,就是创建一个实现EZComponent加载器的自定义模块。

    $o = Mypackage_Mymodule_Loader::getModel('ezcBaseFile');
    

    然后,您将在静态getModel方法中实现自动加载器样式require代码,并在需要ezcBaseFile类时使用它。如果你想在ezcBaseFile基类上调用静态方法,你可能想要加载类而不实例化对象的方法。

    $o = Mypackage_Mymodule_Loader::getLoadclass('ezcBaseFile');
    

答案 1 :(得分:0)

我快速查看了Varien自动加载器的代码,它似乎使用了spl_autoload_register的调用,这是一个用于执行自动加载的堆栈。虽然我认为你没有太多成功添加到默认的Magento自动加载器,这意味着你应该能够在Magento上推动另一个自动加载器。

希望有所帮助!

谢谢, 乔

答案 2 :(得分:0)

我刚刚将Sailthru_Client类集成到Magento中,认为这可能会有所帮助。

我有sailthru.php,即Sailthru客户端API,其中包含Sailthru_Client类。

我创建了magentoroot/lib/Sailthru文件夹,然后将sailthru.php复制到其中,然后重命名为Client.php,使其成为magentoroot/lib/Sailthru/Client.php。此模式由Varien_Autoload类自动加载。