Yii Framework Forum: Dudas Con Gridview - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Dudas Con Gridview dudas con gridview Rate Topic: -----

#1 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 19 April 2013 - 02:38 PM

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
0

#2 User is offline   leandro 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 26
  • Joined: 01-February 10

Posted 19 April 2013 - 03:29 PM

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
0

#3 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 19 April 2013 - 04:57 PM

View Postleandro, on 19 April 2013 - 03:29 PM, said:

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
0

#4 User is offline   robregonm 

  • Expert Yii Developer
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 594
  • Joined: 30-July 09
  • Location:Colombia

Posted 19 April 2013 - 05:43 PM

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.
Ricardo Obregón

YiiFramework en Español - http://yiiframework.co/ - http://yiiframeworkenespanol.org/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx 1.7, MySQL(MariaDB & PerconaDB), PostgreSQL 9, Yii 2, CanJS
Follow me: @robregonm & @obregonco & @1ServerCo.
0

#5 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 19 April 2013 - 05:52 PM

View Postrobregonm, on 19 April 2013 - 05:43 PM, said:

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
0

#6 User is offline   Luciano 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 133
  • Joined: 20-September 09
  • Location:Buenos Aires, Argentina

Posted 21 April 2013 - 09:44 PM

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!
Company web site: pressEnter
Development using free software.
0

#7 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 24 April 2013 - 04:43 PM

View PostLuciano, on 21 April 2013 - 09:44 PM, said:

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?
0

#8 User is offline   lagogz 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 405
  • Joined: 30-November 12
  • Location:Galiza

Posted 26 April 2013 - 06:34 AM

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.
-----------------------------------------------------------------------------------------------
------------------------------- VISITEN FOCUCHASART --------------------------------
-----------------------------------------------------------------------------------------------
0

#9 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 27 April 2013 - 12:35 PM

View Postlagogz, on 26 April 2013 - 06:34 AM, said:

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
0

#10 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 28 April 2013 - 07:02 AM

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
0

#11 User is offline   lagogz 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 405
  • Joined: 30-November 12
  • Location:Galiza

Posted 29 April 2013 - 01:51 AM

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.
-----------------------------------------------------------------------------------------------
------------------------------- VISITEN FOCUCHASART --------------------------------
-----------------------------------------------------------------------------------------------
0

#12 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 29 April 2013 - 08:02 AM

View Postlagogz, on 29 April 2013 - 01:51 AM, said:



Muchas gracias por el enlace.

Un saludo
0

#13 User is offline   nadime8 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 3
  • Joined: 14-August 13

Posted 05 September 2013 - 01:18 PM

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?
0

#14 User is offline   daniqh 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 25-March 13

Posted 13 September 2013 - 01:33 PM

View Postnadime8, on 05 September 2013 - 01:18 PM, said:

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

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users