Рендер в разные части страницы

Направьте на путь истинный.

Допустим, страничка выглядит как таблица из 2х колонок: 70% и 30%

В большую колонку рендерится $content.

А в меньшую, мне нужно в зависимости от контроллера и его экшена, показывать различные "контекстные" операции,

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

Как это сделать по-мудрому?

Для разных контроллеров назначить свой layout и в нем показывать специфические виджеты с проверками?

Если это нормальный путь, то как там например проверить, что текущий пользователь является автором конкретной записи, что бы вывести ему меню управления этой записью.

Что ставить вместо знаков ?????. Как передавать параметры из контроллера в layout? Да и надо ли?




         <?php $this->widget('AuthorMenu',array('visible'=><img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />??)); ?>



Я предлагаю так:

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

Это изменение на основе состояния залогинен-нет

  1. Изменение виджетов на основеконтроллера/экшна. Вариант первый, простой. В лейауте делаем блок switch. Получается что-то вроде:

							$action = $this->id.'/'.$this->action->id;

							switch ($action)

							{

								case 'user/profile':

									{

										$this->widget('WFollowersPanel');

//										$this->widget('WOnlineFollowersPanel');

										break;

									}

								case 'alternative/list':

								case 'comment/list':

								case 'message/listMessages':

									{

										$this->widget('WLatestCommentsPanel');

										break;

									}

								case 'favourite/listLooks':

									{

										$this->widget('WMostPopularLooksPanel');

										break;

									}

								case 'follow/listFollowing':

								case 'follow/listFollowers':

									{

										$this->widget('WRecentActivity', array('view' => 'friendsRecentActivity'));

										break;

									}

								case 'product/view':

									{

										if($this->beginCache('seeMore', array(

														'duration' => Yii::app()->params['cacheTime']['seeMore'],

														'varyByParam' => array('productID'))))

									{

										$this->widget('WSeeMorePanel');

										$this->endCache('seeMore');

									}

										break;

									}

								default:

									{

										if($this->beginCache('looks', array('duration' => Yii::app()->params['cacheTime']['looks'])))

										{

											$this->widget('WLooksPanel');

											$this->endCache('looks');

										}

									}

							}

Это пример из реального проекта.

Если этот вариани громоздкий, то можем вправо рендерить один виджет, который в своем коде будет делать то же самое, но умнее. В лейауте с логикой особо не разгонишьс - логику в предствлении не пишут. А вот в виджете - сколько угодно. И в предствалении виджета можно вызыать другие виджеты. Это и есть вариант 2.

По поводу передачи параметров из контроллера в лейаут и в виджет. В случае лейаута: $this->someProperty, в случае виджета - $this->controller->soemeProperty. И тот и другой могут узнать, внутри какого экшна и контроллера они вызваны. Так что тут неограниченные возможности.

Еще один способ - использовать CLIPS-ы.

В лейауте объявляешь клип.


<?php echo $this->clips['left01']; ?>

В разных вьюшках его заполняешь как хочешь (или не заполняешь)


<?php $this->beginClip('left01'); ?>

	<?php $this->widget('HomeMenu', array('visible'=>true)); ?>

<?php $this->endClip(); ?>

на счет контроллера глянь тут

вообще поищи по сайту и особенно форуму - найдешь много интересного…

Во, клипсы интересная вещь. Сенк

То что надо! С клипсами очень все просто делается. Очень полезный топик. Огромное спасибо за ответы!

Вот тут http://www.yiiframework.com/doc/cookbook/28/ ещё один способ с использованием пары методов - beginContent() и endContent()

Спасибо, клипы подошли.