У меня есть модуль в моем приложении, и под его контроллером по умолчанию у него есть функция, называемая 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));