Dropdownlist Dinâmico - Problema No Segundo Combo Com Ajax

Bom dia pessoal!

Estou precisando de ajuda com DropDownList dinâmico. Minha tela tem 2 combos "Unidade" e "Pacote". Quando seleciono a unidade, carregam os pacotes da unidade e quando seleciono o pacote o sistema precisa verificar se o pacote tem vagas. Se tiver continua normal, mas se não tiver tem que escrever do lado do combo "Vagas esgotadas. Você entrará na lista de espera.".

Como essa é a primeira vez que faço isso, comecei com base no código que tem aqui: http://www.yiiframework.com/wiki/24/creating-a-dependent-dropdown

Encontrei uma versão com 3 combos dinâmicos e para começar já ajudaria. No terceiro combo eu carregaria o número de vagas disponíveis e depois que isso funcionasse ia em busca da exibição do texto pro usuário. Ficou assim:

COMBO UNIDADE




$unidade = CHtml::listData(CadUnidade::model()->findAll(array('condition'=>"flg_ativo='S' and flg_matriz='N'", 'order'=>'des_unidade')), 'cod_unidade', 'des_unidade');

echo CHtml::dropDownList('cod_unidade','', $unidade,

                array(

                    'prompt'=>'Selecione',

                    'ajax' => array(

                        'type'=>'POST',

                        'url'=>CController::createUrl('TemporadaCombo/Combo'), 

                        'dataType'=>'json',

                        'data'=>array('cod_unidade'=>'js:this.value'),  

                        'success'=>'function(data) {

                            $("#cod_pacote").html(data.dropDownPacote);

                            $("#vaga").html(data.dropDownVaga);

                        }',

            	)));



COMBO PACOTE




 echo CHtml::dropDownList('cod_pacote','', array(),

	                array(

	                    'prompt'=>'Selecione a Unidade',

	                    'ajax' => array(

	                        'type'=>'POST',

	                        'url'=>CController::createUrl('TemporadaCombo/VerificaVaga'), 

	                        'update'=>'#vaga', 

                        	'data'=>array('cod_pacote'=>'js:this.value'),

	            	)));



COMBO VAGA (PROVISÓRIO)




 echo CHtml::dropDownList('vaga','', array(), array('prompt'=>'Selecione o Pacote'));



CONTROLLER - COMBO




public function actionCombo()

{

     //Pacote		

     $unidade=$_POST['cod_unidade'];

     $consulta = "EXEC USP_GET_TEMPORADAPACOTE :unidade";

     $conexao=Yii::app()->db;

     $comando=$conexao->createCommand($consulta);

     $comando->bindParam(":unidade", $unidade, PDO::PARAM_STR);

     $resultado=$comando->queryAll();

		

     $data = CHtml::listData($resultado,'cod_pacote','des_pacote');

     $dropDownPacote = "<option value=''>Selecione o Pacote</option>"; 

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

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

 

     //Avisa Vaga

     $avisaVaga = "<option value='null'>Selecione o Pacote</option>";;

 

     //return data (JSON formatted)

     echo CJSON::encode(array(

           'dropDownPacote'=>$dropDownPacote,

           'dropDownVaga'=>$avisaVaga

    ));

}



CONTROLLER - VERIFICAVAGA




public function VerificaVaga()

{

     $pacote=$_POST['cod_pacote'];

    	

     $consulta = "EXEC USP_GET_VAGASPACOTE :pacote";

     $conexao=Yii::app()->db;

     $comando=$conexao->createCommand($consulta);

     $comando->bindParam(":pacote", $pacote, PDO::PARAM_STR);

     $resultado=$comando->queryAll();

				

     $data = CHtml::listData($resultado,'vagas','vagas');

     echo "<option value=''>Selecione o Pacote</option>";

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

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

                

     //return data (JSON formatted)

     echo CJSON::encode(array(

         'dropDownVaga'=>$dropDownVaga

     ));

}



O carregamento dos dois primeiros combos está certinho, quando seleciono a unidade carrega os pacotes normalmente, mas o terceiro combo não funciona, fica vazio…

Tentei debugar o código, mas aconteceu algo bem estranho, se debugo pela função "Combo" consigo fazer o passo-a-passo certinho, mas se quero debugar a "VerificaVaga" ele não faz nada, simplesmente ignora o breakpoint. Parece que nem dispara o ajax do segundo combo (uso o Zend para desenvolver).

Se alguém puder me ajudar a identificar esse problema seria muito bom! Funcionando vou em busca de como exibir a mensagem de texto pro usuário.

Valeu!

Electra,

Respondi aqui:

http://www.yiiframework.com/forum/index.php/topic/15560-como-carregar-dropdown-dianico-no-update/page__view__findpost__p__182539

Visualiza lá e responde aqui neste post.

Oi Newerton, bom dia.

Agradeço a resposta.

Verifiquei o que você pediu e os códigos aparecem! Olha só:




$('body').on('change','#cod_unidade',function(){jQuery.ajax({'type':'POST','url':'/PORTAL/index.php/pt_br/TemporadaCombo/Combo','dataType':'json','data':{'cod_unidade':this.value},'success':function(data) {


                            $("#cod_pacote").html(data.dropDownPacote);


                            $("#vaga").html(data.dropDownVaga);


                        },'cache':false});return false;});

$('body').on('change','#cod_pacote',function(){jQuery.ajax({'type':'POST','url':'/PORTAL/index.php/pt_br/TemporadaCombo/VerificaVaga','data':{'cod_pacote':this.value},'cache':false,'success':function(html){jQuery("#vaga").html(html)}});return false;});



Deveria mesmo funcionar… :[

Alguma sugestão?

Valeu

Electra,

Quando você seleciona o <select #cod_pacote> ele não acontece nada em ajax? Verifico pelo Firebug do Firefox ou Chrome se é pelo menos chamado a URL?

Oi Newerton,

Isso mesmo não faz nada!

Estou verificando pelo Firebug, mas ainda não encontrei nada que justificasse, ele chama o Ajax normal, mas não carrega o combo.

Fiz um teste agora cedo de colocar o combo direto na view com valor de parâmetro fixo pra ver se carregava e carregou… parece que tem alguma coisa acontecendo entre combo Pacote, function que calcula vaga e combo de Vaga, mas tá difícil encontrar o que…

Se eu tiver novidades posto aqui…

Agradeço novamente.

Pessoal,

Consegui resolver a primeira parte do problema! Agora os três combos carregam.

O que eu fiz foi trocar o código de retorno da function VerificaVaga para:




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

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



Resolveu!

Agora só preciso descobrir como voltar esse resultado, que agora carrega num combo, para uma label na minha view.

Tendo novidades posto aqui.

Resolvido pessoal!

Na view basta colocar:




<?php 

  echo CHtml::label('','',array('id'=>'vaga'));

?>



E no retorno da function:




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

    echo CHtml::tag('label', array('value'=>$value),CHtml::encode($name),true);



Opa, parabéns ;)

Obrigada!!! :)

Mas você me deu uma ajuda boa! ;)