Tabla maestro - detalle

Hola, les escribo para preguntar esto, vi otra pregunta en el foro pero no me quedo claro, quiero un grid

Una grid que al darle clic a un registro me muestre el detalle en la misma pantalla.

seria bueno un ejemplo, asi sea con dos campos. o me digan donde buscar.

Gracias

hola, lo que pides requiere cierto nivel de avance en Yii, no por dificil, ni porque hayas pedido algo insolito…sino porque consumira varias cosas de Yii que quiza no tengas claras, disculpas si me adelanto a adivinar eso, no lo tomes a mal.

  1. en primer lugar requeriras controlar cuando han hecho click sobre un registro renderizado en un CGridView, considerando ademas que has configurado a la propiedad selectableRows del CGridView, el cual admite 3 valores: 0-noselection_allowed, 1=select_only_one_record, 2=any_selection. Con eso en mente, podrás permitir que CGridView dispare un evento: selectionChanged, el cual es un punto para que tu pongas una funcion javascript que sera lanzada cuando el usuario hara click en un registro, dentro de esa funcion javascript, podras recoger la seleccion usando: [color=#333333][font=Verdana, sans-serif, Arial][size=2][font=monospace]$.fn.yiiGridView.getSelection(id)[/font] [/size][/font][/color]

[color=#333333][font=Verdana, sans-serif, Arial][size=2]puedes referirte a la documentacion de CGridView para detalles.[/size][/font][/color]

[color=#333333][font=Verdana, sans-serif, Arial][size=2]

[/size][/font][/color]

[color=#333333][font=Verdana, sans-serif, Arial][size=2]2. requieres conocer algo minimo en ajax/jquery, porque con la seleccion hecha, deberas invocar un action que retorne contenido usando ajax, para que este contenido finalmente se despliegue en un contenedor (un DIV) en tu browser directamente desde el action una vez q hayan hecho click en un record.[/size][/font][/color]

[color=#333333][font=Verdana, sans-serif, Arial][size=2]

[/size][/font][/color]

[color=#333333][font=Verdana, sans-serif, Arial][size=2]no es muy sencillo, pero tampoco imposible, hacerlo por tu propia via te dara "skills", copiar y pegarlo…no.[/size][/font][/color]

[font="Verdana, sans-serif, Arial"][size="2"][color="#333333"]

[/color][/size][/font]

Como dice bluyell es bastante complejo

Pero puedes apoyarte de este tutorial TUTORIAL MASTER DETAIL SENCILLO CON YII FRAMEWORK

Estoy seguro de que funcionara para ti

saludos

está bien práctica la solución indicada en el blog, es buena guía, se esta haciendo lo mismo pero de una forma mas oculta (ocultando detalles), si bien sirve para mostrar los registros relacionados a un record maestro, mi unico punto seria en que no le permite a la persona conocer un poco mas allá para que sepa como controlar al 100% la situación, ya q no esta viendo como usar un action ajax-based, el cual mas adelante lo podría necesitar aprendiendo de este metodo.

Si la verdad omiti muchos detalles con respecto a ajax y javascript y el API del gridView,

Seria bueno que adicional al tutorial si lo necesitas investigues mas a fondo las documentaciones correspondientes.

Voy a probar esta solucion, si es algo compleja, Gracias, hoy te aviso como me fue

Gracias por el consejo, si manejo ajax en lo basico pero en yii no em he adaptado, el maestro detalle es algo sencilo, le voy a ir agregando cosas, yo veo el codigo y busco que agregarle mas poco a poco. luego pubico el codigo con mas cosas

Hola, el ejemplo me funciono, muchas gracias, pero tengo una duda pequeña, estuve buscando pero no encontre algo claro, mi duda es esta. como le digo al grid que me muestre ese detalle no cuando le de clic a cualquier columna sino a una columna en especifico. gracias y saludos.

estuve probando asi, agrego una columna de mas y le defino un id, pero me di cuenta que .getSelection() es para el id contenedor de cada row, eso es mi duda, como hacer que solo sea en una columna?

debo agregarle a es columna algo que diga que llame a ese js? como mas o menos podria ser. gracias

<?php

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

'id'=&gt;'customers',


'dataProvider'=&gt;&#036;customers-&gt;search(),


'columns'=&gt;array(


'id',


    'name',


    array(


        'name'=&gt;'vista',


        'value'=&gt;'1',


        'id'=&gt;'vistaa',


        ),


),

));

Yii::app()->clientScript->registerScript(“masterDetail”,’

&#036;(&quot;.items&quot;).live(&quot;click&quot;,function(){


	gw = &#036;.fn.yiiGridView;


	clid = gw.getSelection(&quot;vistaa&quot;);


	gw.update(&quot;products&quot;,{data:{&quot;Products[customer_id]&quot;:parseInt(clid)}});


});

');

?>

pero no me funciono, agradezco la ayuda gracias

Que tal, disculpa la demora por responder no habia visto el post.

Ya en ese caso tiene que ver con las columnas del grid.

Sencillo , tendrias que configurar la columna, darle un id a esa columna usand la propiedad htmlOptions de la clase CDataColumn

Ejem:




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

    'dataProvider'=>$dataProvider,

    'columns'=>array(

        'title',          // una columna random D:

        array(

          'type'=>'raw', // Tipo raw para poder meter un hidden field

          'value'=>'data->myColumnaAttr.CHtml::hiddenField("hiddeId",$data->myID)',

          'htmlOptions'=>array("class"=>'myColumn') // le da la clase a cada TD de una columna para poder usar con el evento click

        )

    ),

));


Yii::app()->clientScript::registerScript("LaLa",'

    $(".myColumn").live("click","function(){

        .....Aqui obtienes el id de esa columna con $(this+" hiddenId").val(), y lo utilizas para mandarlo con $.fn.yiiGridViewUpdate

     }");

');



definir una columna tipo Raw te da la opcion de agregar componetes de Yii dentro del TD. con esto ponemos el valor que deseemos de la DB en un hiden Field para mandarlo al darle click con jquery.

PD> No es saludable hacer esto de este modo…al contrario es muy incorrecto, sugiero que revises el diseño de la base de datos, para que encuentres la forma mas saludable de hacerlo…recuerda tambien que los creadores de el framework son expertos, pensaron casi en todo, asi que no es bueno forzar a las herramientas que se usan por que tienden a dañarse.

usa el legndario principio “KISS” (Keep It Simple Stupid) :D

Saludos amigo

Hola, gracias. como este foro no envia correos cuando responden o bueno no se si hay que configurarlo, no habia visto la respuesta, gracias.