Допустим, страничка выглядит как таблица из 2х колонок: 70% и 30%
В большую колонку рендерится $content.
А в меньшую, мне нужно в зависимости от контроллера и его экшена, показывать различные "контекстные" операции,
причем еще зависящие от того, является ли пользователь залогиненным, является ли он автором текущей страницы, является ли он вообще администратором и т.д.
Как это сделать по-мудрому?
Для разных контроллеров назначить свой layout и в нем показывать специфические виджеты с проверками?
Если это нормальный путь, то как там например проверить, что текущий пользователь является автором конкретной записи, что бы вывести ему меню управления этой записью.
Что ставить вместо знаков ??. Как передавать параметры из контроллера в layout? Да и надо ли?
динамические блоки справа оформить в виде виджетов, а виджет уже будет знать, залогинен юзер или нет и показывать ему соответствующую инфу. Например, если текущий юзер залогинен, то видежт показывает ему форму для поиска по текущей странице. если нет - то виджетниче не показывает.
Это изменение на основе состояния залогинен-нет
Изменение виджетов на основеконтроллера/экшна. Вариант первый, простой. В лейауте делаем блок 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. И тот и другой могут узнать, внутри какого экшна и контроллера они вызваны. Так что тут неограниченные возможности.