Problemas Para Recuperar El Valor De Un Checkbox Dentro De Un Cgridview

Tengo el siguiente código donde muestro un CGridView con un campo CheckBox y un DropDown.

[html] <div class="row">

            &lt;?php 


                &#036;criteria = new CDbCriteria();


                //Queremos mostrar las Acciones Promocionadas de este año


                &#036;criteria-&gt;condition = &quot;ano=&#036;añoActual&quot;;


                &#036;datos=new CActiveDataProvider('AccionPromocionada', array('criteria'=&gt;&#036;criteria));





                &#036;this-&gt;widget('zii.widgets.grid.CGridView', array(


                    'dataProvider'=&gt;&#036;datos,


                    'columns'=&gt;array(


                        array('class'=&gt;'CCheckBoxColumn',


                            'header'=&gt;'',


                            'checked'=&gt;'',


                            'selectableRows'=&gt;8,


                            'id'=&gt;'accionPromocionada',


                            ),


                        array('header'=&gt;'Acciones promocionadas',


                            'name'=&gt;'descripcion',


                            'value'=&gt;'&#036;data-&gt;descripcion'),


                        //Agregamos la columna con todas las empresas homologadas.


                        array('name' =&gt;'Empresa Seleccionada',


                              'type' =&gt; 'raw',


                              'value'=&gt;function(&#036;data) {         //*the closure that works*


                                    return '&lt;div id=&quot;homologada[]&quot;&gt;'.CHtml::dropDownList(&quot;empresaHomologada[]&quot;,&quot;empresaHomologada&quot;,CHtml::listData(EmpresaHomologada::model()-&gt;findAll(),&quot;id&quot;, &quot;nombre&quot;)).'&lt;/div&gt;';


                               },


                    ))));


            ?&gt; &#60;&#33;-- Fin listado Acciones Promocionadas --&#62;


    &lt;/div&gt;

[/html]

Para guardarlo en el Create no tengo problemas. El problema es cuando me da un error en otro campo del formulario o quiero hacer un Update, en cuyo caso no sé cómo actualizar el checkbox. Los datos los tengo en una variable array: $accionPromocionada.

También necesito poder actualizar los valores del Dropdown.

He solucionado el marcar los checkbox seleccionados anteriormente:


                <?php

                    $arraySolicitadas="";


                    //Queremos mostrar las Acciones Promocionadas de este año

                    $datos=new CActiveDataProvider('AccionPromocionada', array('criteria'=>array('condition'=>'ano='.$añoActual)));

                            

                    //Si estamos haciendo una Actualizacion, obtenemos una condición para marcar las seleccionadas,

                    //accediendo a la tabal de AccionesSolicitadas.

                    if (!$model->isNewRecord){

                            $criteria = new CDbCriteria();

                            $criteria->condition = 'solicitudId='.$model->id;

                            $accionesSolicitadas = AccionSolicitada::model()->findAll ($criteria);


                            //Creamos un array para poder comparar en el CGridView

                            $arraySolicitadas = CHtml::listData( $accionesSolicitadas, 'id', 'accionPromocionadaId');

                    }

                    

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

                        'dataProvider'=>$datos,

                        'columns'=>array(

                            array('class'=>'CCheckBoxColumn',

                                'header'=>'',

                                'checked'=>function($data) use($arraySolicitadas) {

                                                                return in_array($data->id, (array)$arraySolicitadas);},

                                'selectableRows'=>8,

                                'id'=>'accionPromocionada',

                                ),

                            array('header'=>'Acciones promocionadas',

                                'name'=>'descripcion',

                                'value'=>'$data->descripcion'),

                            //Agregamos la columna con todas las empresas homologadas.

                            array('name' =>'Empresa Seleccionada',

                                  'type' => 'raw',

                                  'value'=>function($data) {

                                        return '<div id="homologada[]">'.CHtml::dropDownList("empresaHomologada[]","empresaHomologada",CHtml::listData(EmpresaHomologada::model()->findAll(),"id", "nombre"), array('prompt'=>'')).'</div>';

                                   },

                    ))));

                ?> <!-- Fin listado Acciones Promocionadas -->

Pero cuando intento marcar como slect la entrada del DropBox no me funciona. Este es el código que estoy usando:




                    $empresasSeleccionadas=AccionSolicitada::model()->findAll(

                        array('condition'=>'solicitudId=:solicitudId',

                              'params'=>array('solicitudId'=>$model->id),

                              'order'=>'accionPromocionadaId ASC'));

                    .

                    .

                    .


                            array('name' =>'Empresa Seleccionada',

                                  'type' => 'raw',

                                  'value'=>function($data)  use($empresasSeleccionadas)  {

                                        return '<div id="homologada[]">'

                                             .CHtml::dropDownList('empresaHomologada[]','empresaHomologada', CHtml::listData(EmpresaHomologada::model()->findAll(),'id', 'nombre'),

                                                       array('prompt'=>''),

                                                       array('options' => array($empresasSeleccionadas->empresaHomologadaId => array('selected' => true))))

                                               .'</div>';

                                   },

                    )



En la función que uso en ‘value’ me devuelve el mensaje de error:

Trying to get property of non-object

No se porqué. Por favor, necesito ayuda.

Una solución que se me ocurre es usar AfterRender o AfterAction: después de generar el código con los DropDown, marcar como selected donde sea necesario.

Otra cosa que podría hacer es cambiar el CGridView por otro widget o construcción que sea más flexible. Lo que quiero conseguir finalmente es un listado de acciones seleccionables y para cada acción poder escoger entre una lista de opciones. Mi problema viene en el Update.

Estuve considerando el uso de YiiBooster y su TbEditableColumn, type select, pero no estaba seguro de que se pudieran recuperar los valores seleccionados en un update. Creo que sólo está enfocado a la generación de formularios no a la actualización de los mismos.

Así que finalmente he generado el código a mano.




array('class'=>'CCheckBoxColumn',

           'header'=>'',

           'checked'=>'',

           'selectableRows'=>8,

           'id'=>'accionPromocionada',

      ),



selectableRows admite los valores 0 , 1, 2. No admite más.documentación

0 -> No se permite selección

1 -> Se permite seleccionar un elemento

2 -> Se permite seleccionar múltiples elementos.

Y el gridview debería ser suficiente para lo que quieres.

Para el valor seleccionado en el dropdowList mira este post

En la documentación indica: If 2 or any other number … Se puede colocar 2 o cualquier otro número. De todas formas eso no afecta al GridView.

El problema del DropDown es que hay uno por cada linea del GridView. Tengo otros DropDown normales y con esos no hay problemas.

Tienes toda la razón, lo del gridView es fallo mio.

Respecto a lo de los select, te pongo un ejemplo similar al tuyo pero en vez de tirar de BBDD tirando de un array(), pero es lo mismo;




$datos = array(1=>'php',2=>'C++',3=>'Perl',4=>'Java',5=>'Css');

echo CHtml::dropDownList("empresaHomologada[]","empresaHomologada",$datos,array('options'=>array(4=>array('selected'=>'selected'))));

echo CHtml::dropDownList("empresaHomologada[]","empresaHomologada",$datos,array('options'=>array(2=>array('selected'=>'selected'))));

echo CHtml::dropDownList("empresaHomologada[]","empresaHomologada",$datos,array('options'=>array(5=>array('selected'=>'selected'))));

echo CHtml::dropDownList("empresaHomologada[]","empresaHomologada",$datos,array('options'=>array(1=>array('selected'=>'selected'))));

echo CHtml::dropDownList("empresaHomologada[]","empresaHomologada",$datos,array('options'=>array(3=>array('selected'=>'selected'))));



Creo que es esto lo que dices, lo único es poner el select que requiera cada elemento, en tu caso el id podría ser $data->id.

Para el caso del post por un error habría que retocarlo si quieres mantener los valores.