Dudas Con Gridview

Buenas, necesito rellenar un gridview con los registros de una tabla donde un campo sea = a un determinado valor. Para extraer los registros supongo que tengo que hacer algo parecido a esto en el controlador:


	public function actionEvents()

{


	$id=$_GET['valor'];


      $model=Events::model()->findAllByAttributes(

        array(),

        $condition  = 'Game =:valor',

        $params     = array(':valor'=>$id)

    );




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

	'model'=>$model

	));

}



Pero me da el siguiente error:

"Fatal error: Call to a member function search() on a non-object "

Si cambio findAllByAttributes por findByAttributes ocurre lo siguiente:

1ºme muestra el primer registro que coincida con $id que le paso , si hay varios solo me muestra uno.

2ºEn el caso de que no existan registros que contengan ese $id me da el mismo castañazo que me sale con findAllByAttributes . "Fatal error: Call to a member function search() on a non-object "

Alguien me podría orientar un poco. SOS !!! xD

El campo de "Game" es una Foreign Key

Hola Daniqh,

findAllByAttributes es usado cuando necesitas pasar un array con elementos "campo=>valor" para filtrar, pero tu pasas un array vacio y luego indicas la condition, esta no es la forma correcta de hacerlo.

Como tu necesitas filtrar por $id (supongo que es la clave primaria de la tabla events), mejor usa esto:

$model=Events::model()->findByPk($id);

Saludos,

Leandro

$id es una foreign key de otra tabla. Me podrías poner un ejemplo de como sería?

Campo en realidad se llama "Game" y es donde se guarda la FK de la tabla Games

He probado a ponerlo así


     $model=Events::model()->findAllByAttributes(  array("Game"=>$id)

    );

Pero me sigue saliendo el mismo error.

Gracias por responder. Un saludo

Hola Daniq,

Dos opciones:

  1. El modelo no devuelve datos (por la razón que sea, que me huele que es la condición)

  2. La forma de llamar la función search tal vez no sea la correcta (o un error la cargar el DataProvider)

Saludos.

Comentarte que si pongo findByAttributes si me devuelve el primer registro que cumpla esa condición.

En la vista llamo al gridview así :


 

$this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'events-grid',

	'dataProvider'=>$model->search(),


     'filter'=>$model,

	'columns'=>array(

		//'Id_Event',

		'Name',

		'Description',

                'game.Name',// Para mostrar el nombre en vez de la FK

                'mode.Name', //Para mostrar el nombre en vez de la FK

                'owner.username',//Para mostrar el nombre en vez de la FK

		/*

		'Created',

		'Expiration',

		'Slots',

		'Available_Slots',*/

	

	),

)); 



En el modelo no he tocado la función search, solo he puesto las relaciones de las Foreign Keys para mostrar el nombre en vez del id.

A ver si averiguo porque no me va. Gracias por responder

Un saludo

Buenas…

El tema es que findAllByAttributes() te devuelve un array, entonces $model pasa a ser un array, y cuando vos hacés $model->search(); falla.

En cambio, findByAttributes() te devuelve un CActiveRecord, y ahí el $model->search(); se ejecuta bien.

Bah…eso es lo que me parece a simple vista.

Saludos!

Ok, entiendo que el metodo search no funciona para un array de registros no ?

No sé, lo único que se me ocurre es en el controlador rellenar un dataprovider con un criteria y luego pasarselo al gridview en la vista. Esto me funciona para cargar todos los registros, pero no tengo ni idea de como activar los filtros para cada uno de los campos.

¿Cúal sería la manera correcta de rellenar un gridview con un array de registros?

Supongo q será una tontería, pero pq no esto?:




        public function actionEvents()

{




      $model=Events::model()->findAllByAttributes(

        array(

              'Game'=>$_GET['valor'],

),

    );




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

        'model'=>$model

        ));

}

De hecho, el primer parámetro de findAllByAttributes son los atributos por los q deseas buscar…

Un saludo.

Es lo mismo, mi problema es al cargar el gridview por lo que ha comentado el compañero de que el find all by me devuelve un array de registros y no es posible usar con el el search.

Lo único que se me ocurre es hacer esto:


	public function actionEvents()

{

	$criteria=new CDbCriteria;

	$id=$_GET['idgame'];

	$criteria->condition = "Game =".$id;

	

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

	'criteria'=>$criteria,

	'pagination'=>array(

	'pageSize'=>10,

	),

	'sort'=>array(

	'defaultOrder'=> array('Name'=>false),

	)

	));

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

	'dataProvider' => $dataProvider,

	));

}

y asignarle el dataprovider al gridview, pero ahora no tengo ni idea de como ponerlo lo de los filtros para poder buscar un determinado valor en el grid

Pues, lo que he hecho es pasarle un dataprovider al gridview con el array de registros, en vez del modelo cargado, porque no se me ocurre otra manera de hacerlo.

Controlador:




public function actionEvents()

{		

  //Recogo el ID

  $id=$_GET['idgame'];


  //Filtro los registros por Game=id

  $criteria=new CDbCriteria;

  $criteria->condition = "Game =".$id;


  //Relleno el dataprovider con el array de registros

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

                'criteria'=>$criteria,

		'pagination'=>array(

		'pageSize'=>10,),

		

                'sort'=>array(

			'defaultOrder'=> array('Name'=>false),)

			));

   //Renderizo 

   $this->render('events', array('dataProvider' => $dataProvider,));


}



Vista:




<h1>Listado de Eventos </h1>


<?php

//Defino las columnas

$columns = array(

    array(

        'header'=>CHtml::encode('Name'),

        'name'=>'Name',

		// 'filter'=> CHtml::listData(Events::model()->findAll(), 'Id_Event', 'Name'),

    ),

    array(

        'header'=>CHtml::encode('Description'),

        'name'=>'Description',

    ),

	 array(

        'header'=>CHtml::encode('Game'),

        'name'=>'game.Name',

    ),

	array(

        'header'=>CHtml::encode('Mode'),

        'name'=>'mode.Name',

    ),

		array(

        'header'=>CHtml::encode('User'),

        'name'=>'owner.username',

    ),

);


 $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'events-grid',

	'dataProvider'=>$dataProvider,

	'columns'=>$columns,

	)); 

	

?>

Ahora me faltán filtrar las columnas, a ver sí descubro como hacer los filter en un ActiveDateProvider.

Un saludo

Buenas de nuevo.

Te dejo un link en donde explican como hacerlo: Filtrar Dataprovider

Lo he leído por encima y creo q lo q hacen es crear un Search específico devolviendo un dataprovider igual al q tu tengas y poner este Search en la propiedad filter del DataProvider y listo.

Un saludo.

Muchas gracias por el enlace.

Un saludo

Hola daniq oye eh seguido tu codigo solo que en vez de poner $id=$_GET[‘idgame’];

puse $id= Yii::app()->user->id;

pero el problema que no me reconoce el data proveder…

y otra pregunta, en esta parte $dataProvider = new CActiveDataProvider(‘Events’,

‘Events’ a que te refieres? al modelo?

Sí,Events es el modelo de una tabla de mi bd.

Que quieres cargar los registros donde un campo sea igual al id del usuario activo?

prueba con:




$id= Yii::app()->user->id;

$Criteria = new CDbCriteria();

$Criteria->condition = "campo = ."$id

$model = TuModelo::model()->findAll($Criteria);

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

        'model'=>$model

        ));