Как интегрировать ezComponents с magento

В "родном" приложении Zend Framework я бы разрешил использование ezComponents, добавив автозагрузчик ezComponents в автозагрузчик Zends:

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

Теперь мне интересно, как я мог сделать то же самое с Magento. Есть ли способ расширить Varien_Autoload (автозагрузчик magentos) для простой интеграции ezComponents? ИЛИ: Есть ли способ использовать автозагрузчик Zends рядом с автозагрузчиком из Magento, не мешая друг другу?

редактировать:

Итак, я реализовал обходной путь, добавив следующее в функцию autoload() в Varien_Autoload:

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

    }

Я считаю это очень плохим хаком, потому что он будет перезаписан при обновлении Magento. У кого-нибудь есть идея получше?

3 ответа

Мой основной подход здесь заключается в создании пользовательского модуля с наблюдателем для

controller_front_init_before

событие. В обозревателе событий вы сможете настроить свой автозагрузчик так, как хотите. Есть статья в Magento Wiki по настройке наблюдателей событий. controller_front_init_before Событие является одним из первых неуниверсальных событий, которые запускаются в Magento. Вот почему мы используем это.

Большая проблема, которую мы должны решить, заключается в следующем: автозагрузчик Magento сначала находится в стеке, и если он не находит файл (что будет в случае классов EZComponent), его включение вызовет ошибку, которая остановит выполнение.

Итак, что нам нужно сделать в нашем наблюдателе событий выше, это

  1. Удалить Varien_Autoloader от spl_autoload stack

  2. Зарегистрируйте наш собственный автозагрузчик (мы будем использовать Zend_Autoloader, так как он поставляется с Magento, и вы, кажется, знакомы с ним)

  3. Повторно добавьте Varien_Autoloader в стек

Будут добавлены некоторые дополнительные 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 стиль автозагрузки и используете его всякий раз, когда вам нужен класс ezcBaseFile. Возможно, вам понадобятся методы для загрузки класса без создания экземпляра объекта, если вы хотите вызвать статический метод для ezcBaseFile Базовый класс.

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

Я только что интегрировал класс Sailthru_Client в Magento, подумал, что это может помочь.

я имею sailthru.phpклиентский API Sailthru, который содержит Sailthru_Client учебный класс.

я создал magentoroot/lib/Sailthru затем скопируйте в нее файл sailthru.php, затем переименуйте в Client.php делая это magentoroot/lib/Sailthru/Client.php, Этот шаблон автоматически загружается Varien_Autoload учебный класс.

Я быстро взглянул на код автозагрузчика Varien, и он, кажется, использует вызов http://us3.php.net/spl_autoload_register, который является стеком для выполнения автозагрузки. Хотя я не думаю, что у вас будет большой успех при добавлении к автозагрузчику Magento по умолчанию, это означает, что вы должны иметь возможность устанавливать другой автозагрузчик поверх Magento.

Надеюсь, это поможет!

Спасибо джо

Другие вопросы по тегам