Мой основной подход заключается в создании пользовательского модуля с наблюдателем для события
controller_front_init_before
.В обозревателе событий вы сможете настроить свой автозагрузчик так, как хотите.В статье Magento Wiki Настройка наблюдателей событий .Событие controller_front_init_before
- одно из первых неуниверсальных событий в Magento.Вот почему мы его используем.
Большая проблема, которую нам нужно решить, заключается в следующем: автозагрузчик Magento сначала находится в стеке, и если он не находит файл (что будет в случае с EZComponent)классы), его включение вызовет ошибку, которая остановит выполнение.
Итак, что нам нужно сделать в нашем наблюдателе событий выше, это
Удалить Varien_Autoloader
из spl_autoload stack
Зарегистрируйте наш собственный автозагрузчик (мы будем использовать Zend_Autoloader
, так как он поставляется с Magento, и вы, кажется, знакомы с ним)
Повторно добавьте 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');