sayfa yeniletme, çok sakat bir yol. form verileri de gider.
Ben şöyle yapıyorum hem CodeIgniter hem Laravel'de:
Mantık açıklıyorum:
il ilçeden örnek verecek olursam
il id ve il adım olsun
1 adana
2 adıyaman
gibi..
ilçe tablosu da
il_id ilce_id isim olsun
1 1 adanailçesi1
2 1 adanailçesi2
3 2 adıyamanilçesi1
4 2 adıyamanilçesi2
gibi olsun mesela. netteki gezen google code güncel il ilçe veritabanı bu şekilde
html şöyle:
<select name="sehir">
<option value="0">Seçiniz</option>
<option value="1">Adana</option>
<option value="2">Adıyaman</option>
</select>
<select name="ilce">
<option value="0">Önce şehir seçin</option>
</select>
<script type="text/javascript">
$(function(){
$('select[name="sehir"]').change(function(e){
var $val = $(this).val();
if($val!=0) {
$.get('/ajax/ilce_getir/'+$val+'/0',function($data){
$('select[name="ilce"]').html($data);
}).fail(function(){
alert('Lütfen yeniden deneyin');
});
}
});
});
</script>
ajaxla şehir id sine frameworkden bir query yollatıyorum yani:
ajax/ilce_getir/$id metodu da şöyle olsun:
/**
* İle göre ilçe getirme metodu
* @param $il_id integer
* @param $selected integer
*/
function ilceGetir($il_id,$selected=0) {
//istek bir ajax request mi?
if(Request::ajax()) {
//route filter'dan zaten il_id yi sadece pozitif tam sayı gelebilir [0-9]+ gibi regexledik, ondan kontrol etmeye gerek yok
$ilceler = Ilce::where('il_id',$il_id)->get();
//eğer en az 1 ilçe varsa html option tagı döndürüp çıktıyı alıyoruz.
if(count($ilceler)) {
$out = '';
foreach ($ilceler as $ilce) {
$out.= '<option value="'.$ilce->id.'"'.($ilce->id==$selected?' selected="selected"':'').'>'.$ilce->title.'</option>';
}
//yoksa şehir hatalı seçmiş demek, atıyorum şehir id si 4545 gibi. imkansız normalde bu state'e düşmesi.
} else {
$out '<option value="-1">Lütfen geçerli bir şehir girin</option>';
}
//htmöl çıktıyı döndürüyoruz.
return $out;
//istek bir ajax request değilse ana sayfay döndür geri.
} else {
return Redirect::to('/');
}
}
birinci parametre hangi ilin ilçeleri gelecek, ikinci parametre misal edit formu gibi bir şeyde selected olacak mı için, ekleme formu ise 2. parametre 0, düzenleme formunda da 2. parametre ilçe id si olmalı.
Bu sayede ajax ile il değiştikçe ilçe option kısmı değişir.
Not: JSON getirip de döküm almak bence bura için abartı, ondan direkt HTML alıyorum ben.
Not2: eğer ki edit formu gibi bir şeyse ajaxla get değerini sayfa içinde js ye ekleyin. edit sayfası açıldığında şunun gibi bir ajax request çalışmalı yani:
<script type="text/javascript">
$(function(){
if($val!=0) {
$.get('/ajax/ilce_getir/{{$veri->sehir_id}}/{{$veri->ilce_id}}',function($data){
$('select[name="ilce"]').html($data);
}).fail(function(){
alert('Lütfen yeniden deneyin');
});
}
});
</script>
3 küsür senedir bu yolla kullanırım 2 frameworkde de ekleme ve düzenleme formlarında hiç sorun yaşamadım
umarım anlatabilmişimdir.