Мой основной подход здесь заключался бы в создании пользовательского модуля с наблюдателем для
controller_front_init_before
событие. В наблюдателе событий вы сможете настроить автозагрузчик по своему усмотрению. На Magento Wiki есть статья о настройке наблюдателей за событиями. Событие controller_front_init_before
— одно из первых неуниверсальных событий, которые возникают в 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');
person
Alan Storm
schedule
08.01.2011