Intereting Posts

юй. Доступ к функции из контроллера модулей

У меня есть модуль в моем приложении, и под его контроллером по умолчанию у него есть функция, называемая renderPageLinks которая возвращает массив для потребления renderPageLinks .

Виджет genMenu вызывается из /themes/jui/views/layouts/main.php (он генерирует меню) Мне нужно передать данные из renderPageLinks в виджет как значение:

 $this->widget('pageLinkGen', array('pages' => renderPageLinks())); 

Проблема заключается в том, что Yii не может найти функцию renderPage Links.

Я попробовал различные комбинации из следующих, чтобы воспользоваться.

 $this->widget('pageLinkGen', array('pages' => 'application.module.QuickDial.default.renderPageLinks()')); 

Какие-либо предложения?

ps Я попытался переместить renderPageLinks() в контроллер pageLinkGen, но Yii не может найти модель, используемую в renderPageLinks() .

Предполагая, что модель, которую вы запрашиваете, находится внутри вашего модуля, существует 3 метода обхода.

Один

Что вы можете сделать, так это определить renderPageLinks() в файле QuickDialModule.php , то есть внутри класса QuickDialModule . Затем вы можете использовать его следующим образом:

 Yii::app()->getModule('QuickDial')->renderPageLinks(); 

Вы должны написать эту функцию внутри вашего класса QuickDialModule:

 Class QuickDialModule extends CWebModule{ public function init(){ // ... code ... } // ... code ... other functions public function renderPageLinks(){ // ... do whatever you were doing inside the function ... } } 

Изменить :
Контроллеры создаются с помощью yii только тогда, когда приложение получает запросы пользователя от пользователя.

Два

У вас есть другая работа, объявив свою функцию static . Но тогда вам придется импортировать файл php с классом, который имеет эту функцию , в массив автозагрузки yii в файле конфигурации main.php. Поэтому измените функцию defaultPontroller renderPageLinks () на static:

 public static function renderPageLinks(){ // do whatever you were doing } 

Автозагрузка контроллера путем изменения основной конфигурации main.php внутри protected / config / folder:

 // autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', 'application.modules.quickdial.controllers.*' // this line is added ), 

Затем вызовите свою статическую функцию напрямую:

 $this->widget('pageLinkGen', array('pages' => DefaultController::renderPageLinks())); 

Конечно, для того, чтобы этот статический метод работал, у вас должен быть только один модуль с контроллером DefaultController, или вы не должны импортировать контроллеры других модулей, в любом случае могут возникнуть конфликты имен.

Три

Если вы переместите функцию в контроллер в главном модуле (т. Е. Контроллер страницыLinkGen, который вы упомянули), вам придется импортировать нужную модель в конфигурацию main.php основного модуля (чтобы yii мог ее найти) , для автоматической загрузки массива импорта:

  // autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', 'application.modules.quickdial.models.*' // this line is added ), 

так что ваш контроллер может найти модель.

Если у контроллера есть функция renderPageLinks , и если предположить, что $this ссылка на правильный контроллер, попробуйте вызвать функцию, обратившись непосредственно к контроллеру:

 $this->widget('pageLinkGen', array('pages' => $this->renderPageLinks())); 

Насколько я знаю, PHP не поддерживает неявные $this

Предложение bool.dev было замечательным, но в моем случае все еще не работало, я считаю, что это было связано с дезорганизацией на моем конце. Сначала я переместил модели в /protected/models/ а затем создал объект CPortlet который включал в себя рендеринг и вызов страницы. Я основывал это на документации, найденной здесь, на демонстрации в блоге . Я не разделял представление формы контроллера в этом экземпляре, потому что в настоящее время он вызывает только виджет Bootstrap BootNavbar. Будущие темы могут использовать отдельную страницу просмотра.

Еще раз спасибо за вашу помощь.

Я думаю, вы должны сначала вызвать метод MyModule :: renderPageLinks () и просто передать возвращаемые результаты:

 $pages = YourModule::renderPageLinks(); $this->widget('pageLinkGen', array('pages' => $pages));