Datos De Gridview

Saludos a todos…

Ayuda por favor…

Tengo dos tablas relacionadas, TablaA con registros y TablaB sin registros. Como podria cargar los datos en un CGridView de la vista de admin.php que hace referencia a TablaB…???

Lo mas que he logrado es:

He comentado el //‘dataProvider’=>$model->search(),

y luego he agregado el siguiente codigo:

‘dataProvider’=>new CActiveDataProvider(‘TablaA’),

He Logrado que se liste los datos de tablaA, en la CGridView TablaB es decir de admin.php pero los campos que se lista como cod_fruta 100101 quisiera que me imprima el nombre…

ejemplo Manzana, Limon, etc…

Cree una funcion como ObtenerNombre en TablaAController.php

array(

‘name’=>‘cod_fruta’,

‘value’=>array($this,‘ObtenerNombre’), //ver TablaAController.php

}

Pero arroja el siguiente error

CException

TablaBController and its behaviors do not have a method or closure named "ObtenerNombre".

Lo extraño o no se que estoy haciendo mal, es que si la vista fuera del CGridView TablaA admin.php

y creo la función, esta devuelve perfectamente los datos…

Gracias de antemano…

No te he entendido bien todo el mensaje, pero creo q sí q entendí lo que quieres hacer.

Supongamos lo siguiente:

Tabla "A"

idA

nombreA

Tabla "B"

idB

idA

nombreB

Entonces lo que queremos será mostrar en la vista admin del modelo B el nombre de A en lugar de su id.

Para esto no te hace falta crear ninguna función a mayores, ya q en tu modelo "B" deberías de tener todo lo necesario.

Modelo "B"

Aquí deberías de tener una relación del siguiente tipo (o parecida):




public function relations()

    {

        // NOTE: you may need to adjust the relation name and the related

        // class name for the relations automatically generated below.

        return array(

                    'FK_rel_A_B' => array(self::BELONGS_TO, 'A', 'idA'),

);

}



admin.php de "B"




....

....

'columns'=>array(

array('header'=>'Nombre A', 

       'value'=>'$data->FK_rel_A_B->nombreA),

....

....



Y ya está, ya estarías mostrando el nombre en lugar del id. Tendrías también (si lo deseas, claro), añadir una propiedad (por ejemplo llamada $nombreA), configurar el search para q te busque por nombre, y añadir un AttributeLabel si quieres que se muestre un nombre distinto de nombreA a tu propiedad.

Y si quisieras crear una función del tipo ObtenerNombre, lo conveniente sería q la creases en tu modelo y no en tu controlador:




public function ObtenerNombre()

    {                                        

        return $this->FK_rel_A_B->nombreA;

    }



En tu caso no tendría sentido pero sí por ejemplo para calcular el total de una factura.

Un saludo.

Saludos.

Gracias por tu explicación muy ilustrativo, voy a aplicarlo a mi programa…saludos!..

La function en tu Controller tendría que tener el siguiente formato:

[color="#1C2837"][size="2"]




protected function ObtenerNombre($data, $row) {


}



[/size][/color]

[color="#1C2837"][size="2"]Saludos[/size][/color]

Hola, tengo el mismo problema que cesarg24, ya he conseguido mostrar los campos que quiero de un modelo llamado "usuario" (por ejemplo) en el gridview (la vista admin) de otro modelo llamado "alumno".

Pero no consigo hacer que filtre por los campos mostrados del modelo de usuario. Al parecer tengo que añadir una fila a la función search() del modelo alumno ¿no?, he añadido filas pero no filtra… (ver codigo más abajo)

Os explico mi codigo:

Tengo una clase Usuario [dni,nombre,direccion,telefono,email] y 3 clases que heredan de ella Alumno[dni,grupoScout,asociacion,nExpediente], profesor[dni,titulacion,curriculum], administrador[dni].

Lo que pretendo es hacer 3 gridview de alumnos, profesores y administradores en el que muestre tambien los campos de usuario.

MODELO:




public function search()

        {

                $criteria=new CDbCriteria;

                $criteria->compare('dni',$this->dni,true); //CAMPO DE ALUMNO

                $criteria->compare('grupoScout',$this->grupoScout,true); //CAMPO DE ALUMNO

                $criteria->compare('asociacion',$this->asociacion,true); //CAMPO DE ALUMNO


                $criteria->compare('email',$this->usuario->email,true); //CAMPO DE USUARIO (FILA AÑADIDA)

                $criteria->compare('telefono',$this->usuario->telefono,true); //CAMPO DE USUARIO (FILA AÑADIDA)


  return new CActiveDataProvider($this, array(

                        'criteria'=>$criteria,

                ));

        }




VISTA (admin.php):




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

        'id'=>'alumnos-grid',

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

        'filter'=>$model,

        'columns'=>array(

                array(

                'name'=>'usuario.nombre',

                'value'=>'$data->usuario->nombre." ".$data->usuario->apellidos',

                ),

                'dni',

                array(

                'name'=>'usuario.telefono',

                'value'=>'$data->usuario->telefono',

              //  'filter' => CHtml::activeTextField($model->usuario,'telefono'), // HE PROBADO PONIENDO ESTA LINEA Y TAMPOCO FUNCIONA EL FILTRO

                ),

                array(

                'name'=>'usuario.email',

                'value'=>'$data->usuario->email',

                ),

                'grupoScout',

                'asociacion',

                array(

                        'class'=>'CButtonColumn',

                ),

        ),

)); ?>




¿Alguien puede ayudarme?

Muchas gracias

He encontrado la solución en esta página: http://www.internetria.com/blog/2013/02/28/modelos-relacionados-en-un-cgridview/#more-990

;D

Buen día, soy novato en esto, logré que me apareciera el campo que necesito, pero no logro hacer que me aparezca el filtro en el Cgridview, ojalá me pudiesen ayudar. Desde ya muchas gracias.