DropDown's dependentes

Boas,

Tenho duas dropdowns que preciso preencher baseadas numa escolha previamente feita noutra dropdown.

Verifiquei com o firebug que o código JSON está ser criado quando faço a chamada à função, retornado o seguinte array


{"FraccaoList":"<option value=\"1\">A<\/option><option value=\"5\">C<\/option><option value=\"16\">H<\/option><option value=\"17\">J<\/option><option value=\"13\">Z<\/option>","VistoriaList":"<option value=\"1\">120<\/option>"}

Mas o problem é que as dropdowns não são preenchidas.

Na view tenho:


echo $form->dropDownList($model, 'idCondo', CHtml::listData(Condominios::model()->findAll(), 'id', 'CondoCodigo'),

                         array(

                            'prompt'=>'Escolha um Condomínio',

                            'ajax' => array(

                            'datatype'=>'json',

                            'type'=>'POST', //request type

                            'data'=>array('idCondo'=>'js: $(this).val()'),

                            'url'=>CController::createUrl('dynamicVistoria'),

                            'success'=>'function(data) {

                                            $("#'.CHtml::activeId($model,'idFraccao').'").html(data.FraccaoList);

                                            $("#'.CHtml::activeId($model,'idVistoria').'").html(data.VistoriaList);

                                        }',

                                

                            ))); 

E no controller:


public function actionDynamicVistoria()

        {

            $data = Yii::app()->db->createCommand('select id, Fraccao From Fraccoes where idCondominio='.$_POST['idCondo'].' ORDER BY Fraccao ASC')->queryAll();

            $data=CHtml::listData($data,'id','Fraccao');

               

            foreach($data as $id => $value)

            {

              $idFraccao .= CHtml::tag('option',array('value'=>$id),CHtml::encode($value),true);

            }

                   

            $data2 = Yii::app()->db->createCommand('select id, CodigoVistoria From Vistorias where idCondo='.$_POST['idCondo'].' ORDER BY CodigoVistoria ASC')->queryAll();

            $data2=CHtml::listData($data2,'id','CodigoVistoria');

            

            foreach($data2 as $id => $value)

            {


              $idVistoria .= CHtml::tag('option',array('value'=>$id),CHtml::encode($value),true);

            }

                

            echo $array=CJSON::encode(array(

                                        'FraccaoList'=>$idFraccao,

                                        'VistoriaList'=>$idVistoria

                                     ));             

        }

Já testei várias combinações para fazer atribuição dos resultados e nada resulta.

Márcio,

Já deu um alert() no data.FraccaoList ou data.VistoriaList, veja se ele está retornando o texto ou como objeto.

Caso retorne como objeto, vai previsar usar o eval().

Ao fazer um alert(data) ele retorna o array


{"FraccaoList":"<option value=\"1\">A<\/option><option value=\"5\">C<\/option><option value=\"16\">H<\/option><option value=\"17\">J<\/option><option value=\"13\">Z<\/option>","VistoriaList":"<option value=\"1\">120<\/option>"}

Mas se fizer alert(data.FraccaoList) retorna ‘undefined’

Resolvi de outra forma.

De seguida meto o código para alguém que esteja com o mesmo problema, não sei se abordagem é a mais correcta, mas no meu caso funciona.

Na view coloquei:


<?php 

                    echo $form->dropDownList($model, 'idCondo', CHtml::listData(Condominios::model()->findAll(), 'id', 'CondoCodigo'),

                         array(

                            'prompt'=>'Escolha um Condomínio',

                            'ajax' => array(

                            'datatype'=>'json',

                            'type'=>'post', //request type

                            'data'=>array('idCondo'=>'js: $(this).val()'),

                            'url'=>CController::createUrl('dynamicVistoria'),

                            'success'=>'function(data) {

                                            $vistoria = data.split(",");

                                            $("#TroubleTicket_idFraccao").html($vistoria[0]);

                                            $("#TroubleTicket_idVistoria").html($vistoria[1]);

                                        }',

                                

                            ))); 

                     

                ?> 

E no controller:


public function actionDynamicVistoria()

        {

            $data = Yii::app()->db->createCommand('select id, Fraccao From Fraccoes where idCondominio='.$_POST['idCondo'].' ORDER BY Fraccao ASC')->queryAll();

            $data=CHtml::listData($data,'id','Fraccao');

            $idFraccao = CHtml::tag('option',array('value'=>'0'),'Escolha uma Fracção',true);   

            foreach($data as $id => $value)

            {

              $idFraccao .= "<option value=$id>$value";

                //CHtml::tag('option',array('value'=>$id),CHtml::encode($value),true);

            }

                   

            $data2 = Yii::app()->db->createCommand('select id, CodigoVistoria From Vistorias where idCondo='.$_POST['idCondo'].' ORDER BY CodigoVistoria ASC')->queryAll();

            $data2=CHtml::listData($data2,'id','CodigoVistoria');

            $idVistoria = CHtml::tag('option',array('value'=>'0'),'Escolha uma Vistoria',true);

            foreach($data2 as $id => $value)

            {


              $idVistoria .= "<option value=$id>$value";

                //CHtml::tag('option',array('value'=>$id),CHtml::encode($value),true);

            }

                

            echo $array= $idFraccao.",".$idVistoria;

            //CJSON::encode(array(

            //                            'FraccaoList'=>$idFraccao,

            //                            'VistoriaList'=>$idVistoria,

            //                         ));

            

            //Yii::app()->end();

        }

Sempre uso dessa maneira e funciona perfeitamente:

http://www.yiiframework.com/wiki/24/

No meu caso dessa maneira também funcionou, mas quando precisas de actualizar somente uma dropdown.

Caso necessites de actualizar 3 duma só vez como era o meu caso, é que a coisa começa a dar problemas, e esta forma foi a única que encontrei de fazer funcionar.