Виджеты - просто выводят данные, которые им кинул контроллер. По своей сути виджеты - это представления (MVC). То есть в действии (action) контроллере, вы только подготавливаете данные (model) для представления.
Если говорить конкретно про вашу задачу и немного ООП: вам нужно реализовать 2 базовых виджета:
- список новостей - принимает на вход
DataProvider с новостями
- список комментариев - принимает на вход
DataProvider с комментариями
А затем наследоваться от виджета "список новостей" и сделать еще парочку:
- список топовых новостей
- список архивных новостей
Код будет выглядеть примерно так (абстрактно):
/*
список новостей
*/
class ListNews extends ListView {}
/*
список топовых новостей
*/
class ListTopNews extends ListNews
{
public function init()
{
// создаете провайдер с топовыми новостями
$this->dataProvider = new ActiveDataProvider(...);
parent::init();
}
}
Ну и так далее по аналогии. Таким образов ваши новости (любые) буду одинаково выглядеть (ну с учетом одинакового представления), и вы сможете легко плодить нужные вам типы списков новостей.
Вам просто нужно понять, что представления (view) могут (а точнее должны), напрямую брать данные из модели (model). Если говорить про Yii, контроллер в данном случае просто передает данные в представление (что на самом деле слегка нарушает MVC).