De um forma geral, um widget funciona de uma maneira parecida com a de um Controller.
Enquanto em um controller você tem actions, no widget você tem o método run() que "executa" o widget. Nele que você deverá chamar o método render().
Assim, seguindo essa comparação entre controller e widgets, dentro do método run, você poder carregar seus models do mesma maneira que você faz nas actions:
class MeuWidget extends CWidget {
public function run() {
$banners = Banners::model()->findAll();
$this->render('meuwidget', array(
'banners' => $banners,
));
}
}
E na view do seu widget, você também acessa os elementos da mesma maneira que uma view normal:
widgets/views/meuwidget.php
<?php foreach($banners as $banner): ?>
<div><?php echo $banner; ?></div>
<?php endforeach; ?>
Imagine um widget como "mini-aplicativos", auto contidos. A ideia é reaproveita-los em diversas partes de sistemas ou até mesmo em mais de um sistema. Por exemplo, em um sistema que fiz existia uma tabela de classificação de times que era exibida em diversos lugares do sistema em posições e tamanhos (quantidade de times diferentes), então acabei criando um widget.
Para exibir um widget na sua view, basta:
...
<div>
<?php $this->widget('widgets.MeuWidget'); ?>
</div>
...
Isso vai fazer com que o conteúdo da view do widget, seja exibido dentro da view que executou o widget (O método widget() chama o método run() do widget). É como ter uma view dentro de outra. Desta forma, você pode reaproveitar o seu código, exibindo o mesmo widget em views diferentes.
Espero que tenha clareado suas idéias. Qualquer dúvida é só perguntar 