Чем в Yii отличается компонент, виджет и портлет?

Dec 21, 2014 12:06

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 ) ); ?>

webdev, yii

Previous post Next post
Up