Como atualizar 3 dropDownList Dinâmicamente

Olá pessoal, estou com mais uma dúvida, como faço para atualizar 3 dropDownList dinâmicamente, um dependendo de outro tipo PAIS/ESTADO/CIDADES, isto é, um dropDownList pega os países de uma tabela do BD, e de acodo com o país o outro é atualizado com todos os estados e quando escolher o um estado o terceiro dropDownList seria atualizados com as cidades do estado selecionado. Alguém sabe como fazer isso ? Procurei no site mais só achei como atualizar 2 dropDownList e não 3, tentei usar a lógica usadas neles mas não está funcionando.

Mas pq não funcionou? O que deu errado.

eu acho dica do CookBook é uma boa forma de fazer(Pra quem não sabe qual CookBook, http://www.yiiframework.com/doc/cookbook/24/).

Poste o código da sua view e do seu action, vamos ver se chegamos a uma solução.

Segui exatamente o que o cookbook diz…

com 2 dropdown ta dando certo, mas, com três dropdown acaba nao funcionando…

código da view




echo '<div class="form">';

echo CHtml::beginForm();

echo '<p>';

echo CHtml::dropDownList('estado_id','', $data,

array(

'empty' => 'Selecione uma estado',

'ajax' => array(

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

        'url'=>CController::createUrl('estado/dynamicMunicipio'), //url to call.

        'update'=>'#municipio', //selector to update

)));

echo '

</p>

<p>';

echo CHtml::dropDownList('municipio','',

array(

'empty' => 'Selecione uma estado',

'ajax' => array(

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

        'url'=>CController::createUrl('estado/dynamicUnidade'), //url to call.

        'update'=>'#unidade', //selector to update

)));

echo '

</p>

<p>';

echo CHtml::dropDownList('unidade','', array('empty' => 'Selecione uma unidade'));

echo '</p>';

echo CHtml::endForm();

echo '</div>';



Código da action


public function actionDynamicMunicipio()

{

    $dataMunicipio=municipio::model()->findAll('estado_id=:estado_id',

                  array(':estado_id'=>(int) $_POST['estado']));


    $dataMunicipio=CHtml::listData($dataMunicipio,'id','nome');


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

    {

        echo CHtml::tag('option',

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

    }

}


public function actionDynamicUnidade()

{

    $dataUnidade=unidade::model()->findAll('municipio_id=:municipio_id',

                  array(':municipio_id'=>(int) $_POST['municipio']));


    $dataUnidade=CHtml::listData($dataUnidade,'id','nome');


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

    {

        echo CHtml::tag('option',

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

    }

}

De olho eu não ví nenhum erro.

Nenhum dos 2 combos funciona ou somente o segundo?

somente o segundo não funciona

acho eu que o grande erro esta na construção deste dropdownlist aqui


echo CHtml::dropDownList('municipio','',

array(

'empty' => 'Selecione um estado',

'ajax' => array(

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

        'url'=>CController::createUrl('estado/dynamicUnidade'), //url to call.

        'update'=>'#unidade', //selector to update

)));

pois quando renderiza ele aparece assim


<select name="municipio" id="municipio">

<option value="empty">Selecione um estado</option>

<optgroup label="ajax">


<option value="type">POST</option>

<option value="url">/logol/index.php?r=estado/dynamicUnidade</option>

<option value="update">#unidade</option>

</optgroup>

</select>

ahh ta … agora eu ví o erro …

No segundo e no terçeiro dropDownList ta faltando um parâmetro.

ao inves de:




echo CHtml::dropDownList('municipio','',

array(

'empty' => 'Selecione uma estado',

'ajax' => array(

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

        'url'=>CController::createUrl('estado/dynamicUnidade'), //url to call.

        'update'=>'#unidade', //selector to update

)));



O correto seria:




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

array(

'empty' => 'Selecione uma estado',

'ajax' => array(

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

        'url'=>CController::createUrl('estado/dynamicUnidade'), //url to call.

        'update'=>'#unidade', //selector to update

)));



O array no final do nome, ele é o parâmetro da lista de dados, que está faltando. Mesmo os dados sendo carregados dinamicamente, é necessário passar o parâmetro.

Este problema está nos dois últimos combos. Por isso gera aquele html e não faz a requisição ao servidor, pq ele está considerando os parâmetros de requisição como dados.

deu certo :)

cara muito obrigado mesmo.

Como fazer se forem textbox envez de drop down??

TextBox?????

Bom, de quaquer forma, o CHtml::dropDownList já tem alguns parâmetros pra se usar ajax.

Outros componentes html vc pode usar a função CHtml::ajax pra gerar o javascript da requisição e inserir num evento do html pelo parâmetro "htmlOptions".

Sim textbox imagina um dropdownmenu em que voce escolhe opção e dependendo da opção os textbox em baixo mudam o valor , por exemplo imagine um enquete multi-lingua em que vc tem um dropdownmenu com a respectiva linguage e dependendo da opçao os textbox apresentam os valores escritos nessa lingua.

Drop down lingua: |PT-BR|

Resposta 1: |ola ola|

Resposta 2: |_ola ola2|

Como implementar tudo isto nessa situação?

bom, eu faria da seguinte forma:

Criaria uma nova action no meu controller, que seria responsável pela renderização via ajax da parte da enquete, que recebe um parâmetro na requisição e retorna a view na língua correta.

View do seu formulário:




<?php

echo CHtml::dropDownList('lang',array(<lista de línguas>),

array(

'empty' => 'Selecione uma língua',

'ajax' => array(

       'type'=>'POST',

       'url'=>$this->createUrl('enquete'),

       'update'=>'#enqueteArea',

)));

?>

<div id='enqueteArea'> </div>

 

Nova action no seu controller:




public function actionEnquete(){

    $this->renderPartial('enquete', array('lang'=>$_REQUEST['lang']), true, true);

}

 

Mais a view da sua enquete com o que vc precisa, fazendo as traduções seguindo a variável request.

Obs: Da uma conferida no codigo ai em cima, pq eu fiz tudo de cabeça, ai já viu… provavelmente tem erros.