1. Компонент это основной термин фреймворка, который относится к многократному переиспользованию логики класса. Виджеты и портлеты так же являются компонентами.
2. Виджет это компонент, который содержит и логику и представление
3. Портлет это особый тип виджетов, который содежит предустановленную логику вывода. Сделан для вывода блоков в сайдбаре.
Небольшое пояснение из практики:
- Если нам необходимо переиспользовать только представление, мы используем render или renderPartial в нужных местах.
- Если необходимо описать какую-то логику, для дальнейшего использования в других классах или другими классами, мы пишем компонент.
- Если нам надо вывести, например, пять последних записей чего-то там, мы используем виджет или портлет. Портлет, как было сказано выше, это просто дочерний класс виджета, имеющий предустановленную логику вывода, поэтому вы можете создать свой виджет с предустановленной логикой для сайдбара или вообще просто создавать новые виджеты.
Рассмотрим отличие виджета от портлета
// protected/widgets/RecentPostWidget.php или protected/modules/имя-вашего-модуля/widgets/RecentPostWidget.php
class RecentPostWidget extends CWidget {
public $limit = 5;
public function run(){
$posts = Post::model()->recently( $this->limit )->published()->findAll();
echo '
';
foreach( $posts as $post ){
echo '- '.$post->date_created.', '.$post->title.'
';
}
echo '
';
}
}
// Вызов в представлении
10 ) ); ?>
// protected/widgets/RecentPostPortlet.php или protected/modules/имя-вашего-модуля/widgets/RecentPostPortlet.php
class RecentPostPortlet extends CPortlet {
public $title = 'Последние публикации';
public $limit = 5;
public function getRecentPosts(){
$criteria = array(
'scopes' => 'published',
'order' => 'date_created DESC',
'limit' => $this->limit,
);
return Post::model()->findAll( $criteria );
}
public renderContent(){
$this->render('recent_post_portlet');
}
}
// protected/widgets/views/recent_post_portlet.php или protected/modules/имя-вашего-модуля/widgets/views/recent_post_portlet.php
getRecentPosts() as $post ): ?>
- date_created; ?>, title; ?>
// Вызов в представлении
10 ) ); ?>