юй. Доступ к функции из контроллера модулей - PullRequest
1 голос
/ 06 марта 2012

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

Ответы [ 4 ]

4 голосов
/ 09 марта 2012

Предполагая, что запрашиваемая модель находится внутри вашего модуля, есть 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 только тогда, когда приложение получает URL-запросы от пользователя.

Два

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

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

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

// 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, или вы не должны импортировать контроллеры других модулей в любоммогут возникнуть конфликты имен.

Три

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

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

, чтобы ваш контроллер мог найти модель.

1 голос
/ 07 марта 2012

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

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

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

0 голосов
/ 03 июля 2012

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

$pages = YourModule::renderPageLinks();
$this->widget('pageLinkGen', array('pages' => $pages));
0 голосов
/ 09 марта 2012

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

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

...