Кто-нибудь знает, как динамически устанавливать модуль по умолчанию в Zend Framework и не запускать проблемы с пространством имен? Например, то, что я хочу сделать, это иметь таблицу модулей, которые могут быть загружены, причем один из них установлен как модуль по умолчанию. Например, у меня может быть:
admin blog calendar
как модули, которые можно загрузить. Если у меня есть «блог» в качестве модуля по умолчанию, тогда «admin» и «calendar» должны иметь свои контроллеры с именами (Admin_IndexController, Calendar_IndexController), а «блог» – нет (IndexController).
Если я изменю «календарь» на модуль по умолчанию, ZF больше не сможет найти классы из-за пространства имен.
Как вы обходите это? В настоящее время я использую следующий код:
$modules = new Modules(); $activeModules = $modules->fetchActive(); foreach($activeModules as $mod) { $loadedModules[$mod->name] = '..application/modules/' . $mod->name . '/controllers'; if($mod->default) { $defaultModule = $mod->name; } } $frontController->setControllerDirectory($loadedModules); $frontController->setDefaultModule($defaultModule);
Если вы планируете изменить модуль по умолчанию, то, вероятно, лучше всего перечислить ВСЕ модули, а затем указать, что модуль по умолчанию должен иметь префикс:
Сначала измените модуль «блог» на использование пространства имен:
<?php // Used to be "class IndexController" class Blog_IndexController extends Zend_Controller_Action { }
Затем вызовите setParam для параметра prefixDefaultModule в вашем экземпляре Zend_Controller_Front:
<?php // Allow your default module to be prefixed $frontController->setParam('prefixDefaultModule', true);
См. Ошибку # 1831 для объяснения.
use application.ini: resources.frontController.prefixDefaultModule = true resources.frontController.defaultModule = default
Вы можете сделать модуль по умолчанию фактически решающей частью всего этого процесса. В частности – сделайте все запросы на модуль по умолчанию перейдите к классу, который затем определит, какой именно модуль по умолчанию используется по умолчанию, и перенаправит запрос на него.
По крайней мере, так мы его реализовали;)
Похоже на работу плагина контроллера PreDispatch.
Вы можете изменить запрос на изменение модуля на основе определенного запроса или идентификатора / сессии / известных данных для перенаправления или перенаправления по требованию.