CActiveDataProvider, piccola domanda

Ciao ancora ragazzi.

Tanto per test stavo creando da me un mini blog senza basarmi su quello del tutorial.

Comunque: se voglio recuperare un post preciso visualizzando sotto già i commenti potrei fare


$model = Post::model()->with('comments')->findByPk(1);

e poi visualizzare il post e i commenti con un foreach su $model->comments.

Il problema.

Se volessi sfruttare CDataProvider, come faccio a recuperare poi i valori degli attributi del "model"?


$dataProvider=new CActiveDataProvider('Post', array(

            'criteria'=>array(

                'order'=>'data DESC',

                'with'=>array('comments'),

            ),

            'pagination'=>array(

                'pageSize'=>1,

            ),

        ));


        $this->render('index',array(

			'dataProvider'=>$dataProvider,

            

		));


 foreach($dataProvider->getData() as $post){

	echo $post->xxxx;

	foreach($post->comments as $comment){

		echo $comment->yyyy;

	}

}

Ti ringrazio.

Se invece avessi bisogno di accedere, per esempio, solo all’id del Post per inserirlo nel breadcrumbs e poi passare $dataProvider a zii.widgets.CListView?

Se ho interpretato bene la tua domanda, dovrai semplicemente alterare ‘condition’ del tuo CActiveDataProvider in un modo simile al seguente:




$dataProvider=new CActiveDataProvider('Post', array(

            'criteria'=>array(

                'condition'=>'post.id=:id',

                'params'=>array(':id'=>33),

                'order'=>'data DESC',

                'with'=>array('comments'),

            ),

        ));



Se tu può essere utile un’ulteriore osservazione, io mi “diverto” ad alterare il mio model in modo da avere un controller estremamente ordinato e pulito.

Il codice che sto per





  public static function featuredNews() {

    return News::model()->findAll(array(

        'select' => 'id,datainserimento,titolo,abstract',

        'condition' => 'attiva=:attiva and \''

        . (date("Y-m-d"))

        . '\' between datainiziovalidita and datafinevalidita and pubblicainvetrina=1 '

        . (Yii::app()->user->isGuest ? 'and pubblica=1' : ''),

        'params' => array(

            ':attiva' => true,

        )

    ));

  }




Ti vorrei però far notare che alcune condizioni non vanno specificate qui ma nel metodo search. Se qui ho agito in questo modo, è perchè nel search filtro i dati per il ruolo dell’utente. Qui dovevo filtrare i dati in maniera differente e mi sembrava più logico fare in questo modo.