Grid de un archivo.

Hola espero se encuentren bien, abro este nuevo tema con el hecho de si me podrían explicar como hacer en YII para modificar mi GRID, en el cuál tengo tres columnas, las cuales es ID, USUARIO y MODULO.

Usuario es un combo, y módulo es un listado de checbox, entonces, necesito saber como hacerle para que en vez que me muestre USUARIO -> 1, MODULO -> 2 me ponga el texto correspondiente por decir en vez del 1 en usuario me ponga Shaolin, y en Módulo en vez del 2 me ponga Login, este módulo que ando realizando es para generar permisos dinámicos pero necesito saber que permisos tiene cada usuario con su respectivo texto a su modulo quedando USUARIO -> Shaolin, MODULO -> LOGIN, y otra pregunta sería como puedo hacerle para que en módulo al guardar mi listado de checbox que lo hago con la siguiente linea:




 echo $form->checkBoxList($model,'id_modulo', CHtml::listData(Modulos::model()->findAll(),'id_modulo','modulo'));



Al momento de darle clic en actualizar me traiga todos los check seleccionados que le corresponden a "x" usuario, con el fin de ver que permisos tiene porque sino capaz que modifico el permiso y ya lo tenía mas abajo del grid, como quién dice unirlos.

Me imágino que en el archivo admin de la carpeta de vista, es donde tengo que indicar eso pero no encuentro la manera de mostrar el nombre del usuario como el texto de modelo en vez de los números digo que es ahi por el siguiente código:




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

	'id'=>'modulo-detalle-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'id_detalle',

		'id_usuario',

		'id_modulo',

		array(

			'class'=>'CButtonColumn',

		),

	),

)); 



Ojala me puedan ayudar ya que ya tengo un día batallando con esto…, saludos…

De esta manera:





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

        'id'=>'modulo-detalle-grid',

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

        'filter'=>$model,

        'columns'=>array(

                'id_detalle',

                'nombre_de_la_realcion_con_la_tabla_usuario.nombre',

                'nombre_de_la_realcion_con_la_tabla_modulo.nombre',

                array(

                        'class'=>'CButtonColumn',

                ),

        ),

));



Donde "nombre_de_la_realcion_con_la_tabla_usuario" y "nombre_de_la_realcion_con_la_tabla_modulo" son los nombres que le diste a las relaciones en el metodo relations del modelo.

Muchas gracias si me funciono así como dices aunque en un archivo no tenia ninguna relación la tuve que crear yo anexo mi código por si a alguien le sirve:

Esta es mi relación que me creo YII, que ya tenía y la tome como base de referencia.




public function relations()

	{

		return array(

			'modulo_detalles' => array(self::HAS_MANY, 'ModuloDetalle', 'id_usuario'),

		);

	}



Dentro de mi método relación en mi archivo modulos_detalle esta la relación que yo cree.




public function relations()

	{

		return array('usuarioDet'=>array(self::BELONGS_TO,'usuarios','id_usuario'),

			'modulosDet'=>array(self::BELONGS_TO,'modulos','id_modulo'),

		);

	}



Ya dentro de mi código del archivo, ubicado en la carpeta views, carpeta modulo_detalle, archivo a admin lo indique de esta manera como me lo mencionaste:




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

	'id'=>'modulo-detalle-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'id_detalle',

		'usuarioDet.usuario',  //aquí esta la variable que yo indico mas el nombre del campo que quiero mostrar.

		'modulosDet.modulo',   //aquí esta la variable que yo indico mas el nombre del campo que quiero mostrar.

		array(

			'class'=>'CButtonColumn',

		),

	),

)); 



Solo tengo una duda como anteriormente cuando estaba en el grid podía hacer búsquedas por las cajas de texto ubicadas en la parte de superior de los datos de la tabla, pero estos datos antes me los visualizaba como númericos, cuando hice la relación me desaparecio estas cajas de texto, ahora como le puedo hacer para que aparezcan y pueda hacer la búsqueda por el texto??. Saludos…

para hacer busquedas y poder ordenar las relaciones tienes que hacer algo como esto

(en mi caso tengo el modelo Medico que se relaciona con Programa y Area)

admin.php





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

	'id'=>'medico-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'idMedico', //columna de la tabla

                

                'area.descripcion:raw:Area', //solo la descripcion (sin busqueda ni orden)


// con busqueda y orden 

            array(

                  'name'=>'idPrograma',

                  'value'=>'$data->programa->nombre',

                  'sortable'=>'true',

                  'header'=>'Programa',

                ),


		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>




en el modelo





	public function search()

	{

                $sort = new CSort();


		  $sort->attributes = array(

		   'idMedico',


		   'idPrograma'=>array(

		      'asc'=>'programa.nombre',

		      'desc'=>'programa.nombre desc',

		    ),


		  );




                $criteria=new CDbCriteria;

                $sort->defaultOrder = 't.idMedico';

                $criteria->with=array('programa');


		$criteria->compare('idMedico',$this->idMedico);


		$criteria->compare('programa.nombre',$this->idPrograma,true);


		return new CActiveDataProvider(get_class($this), array(

			'criteria'=>$criteria,

                        'sort'=>$sort,


		));

}




saludos

Hola gracías por contestar, pero me podrías explicar mas tu código si no sería mucha molestia claro si puedes y sino lo seguire analizando mirá lo que necesito en si es que cuando esta tu tabla, arriba de tus 9 registros que muestra aparecen unas cajas de texto, entonces si me aparece la caja del ID de la tabla pero… necesito que me aparezca un combo box en el campo usuario, pero ni siquiera me aparece la caja de texto, donde puedo ver el código de esa parte para modificarlo???

tienes que usar la opción filter





// con busqueda ,orden y filtro

            array(

                  'name'=>'idPrograma', // supongo que esto hace que aparezca "la cajita de busqueda"

                  'filter'=>CHtml::listData(Programa::model()->findAll(), 'idPrograma', 'nombre'), //combobox

                  'value'=>'$data->programa->nombre', //el valor!

                  'sortable'=>'true', //permite ordenar la columna

                  'header'=>'Programa', //titulo de la columna

                ),



Edit

supongo que debes usar esto en el search al usar filter




       $criteria->compare('idPrograma',$this->idPrograma,true);

     //$criteria->compare('programa.nombre',$this->idPrograma,true);



Hola gracias de nuevo por contestar, de acuerdo a tu códgo que me dejaste… si me funciono y ya tengo el control del combobox donde lo quería y si me realiza la búsqueda, indico el código como lo estoy usando por si alguien lo ocupa:




// con busqueda ,orden y filtro

            array(

                  'name'=>'id_usuario', // supongo que esto hace que aparezca "la cajita de busqueda"

                  'filter'=>CHtml::listData(Usuarios::model()->findAll(), 'id_usuario','usuario'), //combobox

                  'value'=>'$data->usuarioDet->usuario', //Aquí me fije que primero debo de indicar mi relación, y luego el campo que deseo mostrar en la tabla, o en caso contrario se puede indicar $data-> y mi nombre de campo $data->id_usuario, siempre y cuando no tenga una relación, sino se debe de indicar de la siguiente manera. 

                  'sortable'=>'true', //permite ordenar la columna

                  'header'=>'Usuarios', //titulo de la columna

                ),



Dentro de mi código en el método search dejo el objeto criteria de la siguiente manera.




     $criteria->compare('id_usuario',$this->id_usuario);



De esta manera ya me realiza la búsqueda en la tabla y en la búsqueda avanzada con el combo, solo lo que ahora ando probando es como ponerle un texto al combo creado en value, para que el arreglo diga seleccione que sea el primero a mostrar porque le pongo un arreglo y me lo pone al final… ojalá a alguien le sirva el código que estaba buscando… Saludos.

Hola me acaba de salir una nueva duda…, mi duda es dentro de la misma tabla donde se muestra la información, en las cajas de texto que están arriba para hacer búsquedas rápidas, como puedo controlar las validaciones dentro de esas mismas, ejemplo mi caja de texto es de tipo numérico, y si pongo texto me muestra un javascript con varios errores, entonces quiero controlar que cuando ponga texto y sea numérica la caja de texto aparezca un mensaje o como los mensajes del formulario que solo acepta datos de tipo entero, no cadenas.

Creo que dentro del código en el método search se debe de indicar asi pero no me funciona o no se si se pueda.




public function rules()

	{

		return array(

			array('id_usuario, id_modulo', 'required'),

			array('id_usuario', 'numerical'),

			array('id_detalle, id_usuario, id_modulo', 'safe', 'on'=>'search'),

                        array('id_modulo', 'numerical', 'on'=>'search') //Trataba de hacerle que tal campo, sobre tal método solo acepte númericos pero no me funciono

		);

	}



Del otro lado indico mi arreglo asi en el archivo de admin.




 array(

                  'name'=>'id_modulo',

                  'value'=>'$data->modulosDet->modulo', //Indico mi relación

                  'sortable'=>'true',

                  'header'=>'Modulos', 

                ),



Saludos.

en el método search del modelo?

Si era ahí en el método search, solo que yo intentaba convertir el texto que le indicara yo igual a un numero por decir tenía mis registros ID->1, Nombre Usuario-> Shaolin que su VALUE es 1, ID->2, Nombre Usuario-> Vlad = VALUE => 2.

Entonces yo intentaba hacer en el método search:




public function search()

	{

		$criteria=new CDbCriteria;

		var_dump($this->id_modulo);

		if($this->id_perfil == "Shaolin") // aquí trataba de convertir la búsqueda

			$this->id_perfil = 1;

		

		$criteria->compare('id_detalle',$this->id_detalle);


		$criteria->compare('id_perfil',$this->id_perfil);


		return new CActiveDataProvider('Modulo_Detalles', array(

			'criteria'=>$criteria,

		));

	}



Pero mejor lo que termine haciendo combobox porque erán datos tipos números para buscarlos por su value y asi sería mas fácil y no estaría convirtiendo el texto. Nada mas dentro de admin puse el arreglo y en el filter indique el control de combo pero de todas maneras gracias por contestar cuidate…

en realidad para buscar por la descripción de un campo relacionado, tienes que hacer asi




 $criteria->compare('nombreRelacion.descripcion',$this->id_perfil);

//nombreRelacion: esta en el model/Modulo_Detalles.php relaciona  Modulo_Detalles con Perfil

//descripcion: el campo que contiene "Shaolin"




igualmente con filter funciona perfecto

Una maravilla