gpt4 book ai didi

magento - 如何将 ezComponents 与 magento 集成

转载 作者:行者123 更新时间:2023-12-04 16:32:48 24 4
gpt4 key购买 nike

在“ native ”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);

}

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

最佳答案

我在这里的基本方法是创建一个带有观察者的自定义模块

controller_front_init_before

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

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

所以,我们需要在上面的事件观察器中做的是
  • 删除 Varien_Autoloader来自 spl_autoload stack
  • 注册我们自己的自动加载器(我们将使用 Zend_Autoloader,因为它是 Magento 附带的,您似乎对它很熟悉)
  • 重新添加Varien_Autoloader到堆栈

  • 自从加载了 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 方法中实现自动加载器样式要求代码,并在需要 ezcBaseFile 类时使用它。如果您想在 ezcBaseFile 上调用静态方法,您可能需要在不实例化对象的情况下加载类的方法。基类。
    $o = Mypackage_Mymodule_Loader::getLoadclass('ezcBaseFile');

    关于magento - 如何将 ezComponents 与 magento 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4085967/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com