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.