Apesar da tabela dos correios ser otimizada .. e já conter o nome das cidades, ceps, etc ..
Eu não a utilizo .. pois não gosto das tabelas dele .. só usaria através de um webservice ;(
.. faço o bom e velho .. estados->cidades->bairros | endereços ->fim
Então, respondendo ao Júlio ..
No seu controller de cidades .. vc simplesmente vai buscar todas as cidades de um estado e vai passar o json via ajax.
public function action_cidades()
{
$estado = $_POST['estado'];
$cidades = ORM::factory('estado', $estado)
->cidades
->order_by('cidades.nome')
->find_all();
if($cidades->count())
{
foreach($cidades as $cidade):
$c[] = array('id' => $cidade->id, 'nome' => $cidade->nome);
endforeach;
echo json_encode($c);
}
exit();
}
E o código jquery que solicita isso é este abaixo:
$(function(){
$("#estado").change(function(){
id = this.value;
$.post(
'<?php echo Url::site('estado/cidades'); ?>',
{estado : id},
function(data){
if(data)
{
$.each(data, function(){
var option = $('<option>');
option.html(this.nome);
$('#cidade').append(option);
});
}
else {
$('#cidade').html('');
}
},
'json'
);
});
});
Como pode perceber .. se trata apenas de um .. onChange .. e AjaxPost
O Html ..
<select id="estado" name="estado">
<option value="0">Selecione um Estado</option>
</select>
id para pegar pelo jquery .. e name para o form
É só adaptar a sua necessidade