Yii Framework Forum: Рендер в разные части страницы - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Рендер в разные части страницы Rate Topic: ***** 2 Votes

#1 User is offline   iGrog 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 64
  • Joined: 09-October 09

Posted 15 October 2009 - 12:24 PM

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

Допустим, страничка выглядит как таблица из 2х колонок: 70% и 30%
В большую колонку рендерится $content.

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

Как это сделать по-мудрому?
Для разных контроллеров назначить свой layout и в нем показывать специфические виджеты с проверками?
Если это нормальный путь, то как там например проверить, что текущий пользователь является автором конкретной записи, что бы вывести ему меню управления этой записью.
Что ставить вместо знаков ?????. Как передавать параметры из контроллера в layout? Да и надо ли?
         <?php $this->widget('AuthorMenu',array('visible'=>?????)); ?>

0

#2 User is offline   KJedi 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 381
  • Joined: 19-October 08
  • Location:Nikolaev, Ukraine (Europe)

Posted 15 October 2009 - 01:27 PM

Я предлагаю так:
1) динамические блоки справа оформить в виде виджетов, а виджет уже будет знать, залогинен юзер или нет и показывать ему соответствующую инфу. Например, если текущий юзер залогинен, то видежт показывает ему форму для поиска по текущей странице. если нет - то виджетниче не показывает.
Это изменение на основе состояния залогинен-нет
2) Изменение виджетов на основеконтроллера/экшна. Вариант первый, простой. В лейауте делаем блок 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. И тот и другой могут узнать, внутри какого экшна и контроллера они вызваны. Так что тут неограниченные возможности.
Posted Image
My Blog: http://programmersnotes.info/ - tips, design patterns, client and server-side coding, yii articles and simply my experience.

Follow me on twitter: http://twitter.com/KonstantinMirin
Add me to your friends on facebook: http://www.facebook....hp?id=784832902
0

#3 User is offline   sprint 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 15-December 08
  • Location:Ukraine, Dubno

Posted 16 October 2009 - 01:11 AM

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

В лейауте объявляешь клип.
<?php echo $this->clips['left01']; ?>


В разных вьюшках его заполняешь как хочешь (или не заполняешь)
<?php $this->beginClip('left01'); ?>
	<?php $this->widget('HomeMenu', array('visible'=>true)); ?>
<?php $this->endClip(); ?>


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

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

#4 User is offline   Zolter 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 377
  • Joined: 26-March 09

Posted 16 October 2009 - 04:57 AM

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

#5 User is offline   someone 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 84
  • Joined: 22-September 09
  • Location:Rus, Krasnoyarsk

Posted 16 October 2009 - 06:55 AM

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

#6 User is offline   omut 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 3
  • Joined: 13-October 09

Posted 16 October 2009 - 12:25 PM

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

#7 User is offline   iGrog 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 64
  • Joined: 09-October 09

Posted 17 October 2009 - 05:46 AM

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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users