[SOLVED] Запуск Widget из Action

Привет. Никто не подскажет можно ли запустить виджет из экшина. На данный момент у меня примерно так виджет в лэйауте и запускается


<?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); ?>

или


<?php if(Yii::app()->controller->action->id == 'list') $this->widget('UserMenu'); ?>

Можно ли в лэйауте только обозначить место где расположен виджет а запускать его из экшина командой


<?php $this->widget('UserMenu')->run(); ?>

Сделать можно всё, вот только будет ли это стоить затраченного времени? :) К чему такая острая необходимость?

Просто в пору своей молодости играясь с Joomla насколько я помню модули там подключались именно так. В шаблоне обозначалось где будет модуль а потом в настройках его можно было включать или выключать в зависимости от того в каком разделе его нужно отображать.

Вот как мне быть в ситуации если у меня есть actions с одинаковыми названиями но в разных контроллерах и модулях, писать такое:


<?php if(Yii::app()->controller->action->id == 'list' && Yii::app()->controller->id == 'test') $this->widget('UserMenu'); ?>

или делать разные layouts?

Тут конечно дело вкуса.

Я считаю, что выносить всю эту логику в контроллер не на 100% верное решение. Лучше, чтобы это было организовано в одном месте. Но и помещать 10 строк с блоком if в layout не очень красиво. Поэтому могу предложить создать виджет, который будет решать, что вставлять на это место. Я так делал, когда у меня блок слева, где обычно выводится некоторая общая информация, а в 4-5 разделах она заменяется другой, уникальной для каждого раздела.

Если у вас вариантов не много (например, два: показывать меню и не показывать меню), то можно обойтись добавлением свойства для контроллера "public $showMenu", а в нужных экшенах устанавливать его в true или false. В layout, соответственно, логика будет намного проще:




if ($this->showMenu) $this->widget('UserMenu');



Спасибо попробую. :rolleyes:

Отлично работает:

  • в контроллере




public $UserWidget;




public function actionProfile()


{




 $this->UserWidget = true;


$this->render('profile');


}






  • в лэйауте

if ($this->UserWidget) $this->widget('UserWidget');