Как интегрировать ezComponents с magento - PullRequest
5 голосов
/ 03 ноября 2010

в «родном» приложении 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 ]

17 голосов
/ 09 января 2011

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

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');
0 голосов
/ 04 ноября 2010

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

У меня есть sailthru.php, Sailthru Client API, который содержит класс Sailthru_Client.

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

0 голосов
/ 03 ноября 2010

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

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

Спасибо, Джо

...