Como Fazer um Widget

Pessoal,

Estou com muita duvidas em criar um widget, alguem poderia me ajudar com algum tutorial, um widget que faz alguma consulta. Pois eu li a documentaçao mais nao entendi.

Pois tem algumas partes do layout que tem que fazer algumas pesquisa, e pelo que entendi tem que fazer um widget.

Valew




class MYWIDGETNAME extends CWidget{


    public function init(){

   // here my initialization code

    

   }


   public function run(){

   // here my WIDGET RUNNING


  }


}



Saved to protected/widgets

On your view:




$this->widget('application.widgets.MYWIDGETNAME');



run() code will occur…

If you need to set variables:




class MYWIDGETNAME extends CWidget{

  public MYVAR;

....



How to set MYVAR




$this->widget('application.widgets.MYWIDGETNAME', array('MYVAR'=>1));



To implement Views for widgets

Folder structure:

MYWIDGET.php

---- views

----------mywidgetview.php

From MYWIDGET:




     $this->render('mywidgetview.php'); .... 



Here you go, the fastest way to do a widget tuto :P

Cheers

Alguem poderia ser um pouco mais claro, pois eu nao entedi muito bem por ser em ingles… rsrsrs

Utilirando um $this->render()…como eu faria destro de um layout fazer uma consulta e jogar o resultado do model nesta view…

Um exemplo no layout tem um relaçao de parceiros eu gostaria de retornar a lista de banner. so que o layout nao tem um controler.

Esta é a grande duvida que tenho pois nomalmente eu faço um layout que algumas partes sao fixa e outras sao dinamicas. Sei que tem duas formas $this->render() para algumas parte e Widget(), so que o meu problema eu nao sei como fazer a consulta e retornar as informaçaoes do layout nesta parte dinamica que se encontra no layout(main.php).

Alguem poderia me ajuda!

Valew

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

Cara vc me ajudou muito, Valew mesmo!!

Olá sou novo no Yii também e achei esta solução muito boa.

Mas está ocorrendo o seguinte erro

‘MeuWidget’ and its behaviors do not have a method or closure named “model”.

Atenciosamente

Leo

Posta o código do widget

Você esta setando ou tentando usar a propriedade ‘model’ em seu widget e ela não exista

algo como


$this->widget('MeuWidget',array(

'model'=>$model

));

ou


class MeuWidget extends CWidget{

 function init(){

  //...

  echo $this->model->algo;

 }

 //...

}