Ajax ile dinamik listeleme
Bazen select ile oluşturulan menülerin, bir başka select alanından gelecek değerlere göre değişmesi gerekebilir. Mesela, kullanıcıya önce ilini seçmesini sorarsınız, ardından seçtiği ile göre ilçesini seçmesini sorarsınız. Böyle bir uygulama, dinamik listeleme gerektirir ve biz bu yazıda böylesine bir dinamik listelemeyi ajax tekniğini kullanarak yapmaya çalışacağız.

Biz bu yazımızda il-ilçe listeleme değilde, arabalar ve modellerini listleyeceğiz. Bu uygulamanın canlı örneğine buradan göz atabilirsiniz. Uygulamanın dosyalarını ise buradan indirebilirsiniz.
Uygulamamızın ana mantığı şu şekilde; kullanıcı ilk ekranı gördüğünde araba markalarından birini seçecek, seçilen bu araba markasına göre veritabanından o markaya sahip arabaların modelleri listelenecek, kullanıcı yine bu modellerden birini seçtiğinde buna göre araba yılları listelenecek.
Temel olarak iki dosyamız var, index.html ve sorgula.php. index sayfamızda gerekli html ve javascript kodları bulunuyor, sorgula.php sayfasında ise veritabanına bağlanıp gerekli verileri çekecek kodlar bulunmakta.
Veritabanı
İşe, veritabanımızı oluşturacak kodlar ile başlayalım. veritabanımız şu şekilde olmalı:
| id | marka | model | yil |
| veri | veri | veri | veri |
| veri | veri | veri | veri |
Bu tabloyu oluşturmak için gereken sql kodunu buradan indirebilirsiniz.
index.html
Sayfa ilkkez yüklendiğinde kullanıcının karşısına marka seçmesi için bir select alanı gelecek:
<select id="marka"> <option>Lütfen bir marka seçiniz.</option> <option value="honda">Honda</option> <option value="hyundai">Hyundai</option> <option value="isuzu">Isuzu</option> <option value="iveco">Iveco</option> </select>
Bu select alanından markalardan biri seçildiğinde hemen altında modeller listelenecek, bunu yapması için de, bir javascript fonksiyonu ekliyoruz, “onchange=’modelGoster()’. Daha sonra bütün listelemelerimizde de bir sonraki aşamayı yapacak olan fonksiyonu çağıracağız.
Bunun dışında daha sonra model ve yılların lisiteleneceği alanları önceden belirliyoruz:
<div id="kutu2"> </div> <div id="kutu3"> </div> <div id="kutu4"> </div>
Javascript
Javascript kısmında ilk önce XMLHttpRequest nesnemizi oluşturuyoruz:
var istek =false; if (window.XMLHttpRequest) { istek = new XMLHttpRequest(); } else if (window.ActiveXObject) { istek = new ActiveXObject("Microsoft.XMLHTTP"); }
Tarayıcıya göre nesnemizi oluşturyoruz ve “istek” isimli değişkene yüklüyoruz. Bu işlem, her ajax işleminde aynı bir süreç, değişen pek fazla bir şey yok.
Ardından bizim uygulamamız için asıl önemli olan fonksiyon geliyor: modelGoster();
function modelGoster() { document.getElementById("kutu2").innerHTML = "Yükleniyor, lütfen bekleyiniz..."; document.getElementById("kutu2").style.backgroundColor = "#FFFF99"; document.getElementById("kutu1").style.backgroundColor = "#FFF"; var marka = document.getElementById("marka").value; istek.open("GET", "sorgula.php?islem=modellistele&marka="+marka, true); istek.onreadystatechange = modeller; istek.send(null); }
Dokümandaki select alanında bir değişiklik olduğunda bu fonksiyon çağrılıyordu. ModelGoster() fonksiyonunun ise ilk yaptığı iş, araba modellerinin listeleneceği ikinci kutuya, (“kutu2″ id’sine sahip div etiketinin bulunduğu yere), “yükleniyor, bekleyiniz” yazmak. Böylece kullanıcı araba markasını seçtikten sonra ajax uygulaması bitene kadar bu yazıyı görecek. Bunun ardından ise javascript ile dinamik olarak birkaç sitil düzenlemesi yapıyoruz.
Ardından ise, uygulamanın en önemli kısmı geliyor, seçilmiş olan arabayı almak:
var marka = document.getElementById("marka").value;
Dokümanda oluşturduğumuz select alanının id’si marka idi, bu kod parçası ile select alanında hangi değerin seçilmiş olduğunu bulabiliyoruz ve bunu marka isimli değişkenimize yüklüyoruz. Sonra ise php dosyamıza asenkronize veri yolluyoruz:
istek.open("GET", "sorgula.php?islem=modellistele&marka="+marka, true);
php dosyamıza iki farklı değiken yolluyoruz, birincisi hangi işlemi yapması gerektiğini söylemek için, “islem=modellistele” ve ikincisi ise marka. php dosyasından gelecek verileri işleyecek fonksiyonumuz ise modeller():
istek.onreadystatechange = modeller;
sorgula.php
php dosyamızda yapacağımız ilk iş gelen verileri almak:
$islem = $_GET["islem"]; $marka = $_GET["marka"]; $model = $_GET["model"]; $yil = $_GET["yil"];
$islem değişkeni her seferinde gelmeli ve eğer yapılacak işlem modelleri listelemekse, hangi markanın modellerinin listeleneceği de belirtilmeli.
$islem değişkenine göre yapılacak işlemi belirliyoruz:
if ($islem == "modellistele") { $sorgu = mysql_query("SELECT DISTINCT model FROM arabalisteleme WHERE marka='$marka'"); echo " <select id="model"> <option>Lütfen bir model seçiniz.</option><option value="".$yaz["model"]."">".$yaz["model"]."</option></select> <span>Arabanızın modelini seçiniz.</span>"; }
Bu if kod parçasının görevi veritabanına bağlanıp, belli bir markanın modellerini çekmek ekrana echo ile yazmak. Ajax uygulamasında ise biz bu ekrana yazdırılan veriyi “responseText” ile alıp kendi dokümanımıza ekleyeceğiz.
Bu kod parçasında önemli bir nokta php kodları ile oluşturulan select alanındaki “onchange=yilGoster()” fonksiyonu. Yani, select alanını oluştururken kullanılacak dokümana göre oluşturuyoruz, daha sonra bu select alanının kullanılacağı yer belli olduğu için bu şekilde sıkı tanımlamalar bizim uygulamamızda sorun yaratmayacak. Bir diğer önemli nokta ise select alanının yalnızca seçeneklerinin bir döngü ile yazdırılması. Her hangi bir arabanın kaç tane modelinin vertabanında kayıtlı olduğunu bilmediğimiz için, çekilen bütün modeller için bir seçenek oluşturuyoruz. (Ama aynı modeli çekmemek için de sorgu cümlemizde DISTINCT kullandık.)
Bu kod parçası ekrana bir select alanı yazdırırken, biz bu select alanını ise index.html dosyasındaki javascript ile alıyoruz ve dokümanımıza entegre ediyoruz.
Verileri işleme
php dosyası işlemini tamamlayınca verileri işleyecek fonksiyonumuz modeller() fonksiyonuydu:
function modeller() { if (istek.readyState == 4 && istek.status == 200) { var cevap = istek.responseText; document.getElementById("kutu2").innerHTML = cevap; } }
Bu fonksiyonun yaptığı iş ise diğerlerine göre oldukça basit, sorgula.php dosyasından gelen verileri cevap isimli değişkene yüklüyor ve bunu, olduğu gibi hiç değiştirmeden “kutu2″ id’li div etiketinin içine yerleştiriyor.
Sonuç
Aslında kod bu kadar, aynı işlemi veritabanındaki arabaların yıllarını listelemek için tekrarlıyoruz. Anlaşılır olması amacıyla her biri için ayrı fonksiyon yazdım ama tek bir fonksiyon ile de halledilebilirdi.
En son fonksiyonumuz ise sonucGoster() fonksiyonu:
function sonucGoster() { document.getElementById("kutu4").style.backgroundColor = "#FFFF99"; document.getElementById("kutu3").style.backgroundColor = "#FFF"; document.getElementById("kutu4").innerHTML = "<span>Tebrikler! İşleminiz tamamlandı...</span>"; }
Sonuç olarak yalnızca “Tebrikler!!” yazıyoruz “kutu4″ id’sine sahip div etiketinin içine. Ancak burada seçilen aranbanın modelini ve yılını da yazabilirdik, “2005 model bir honda civic seçtiniz” diye. Bunu da siz yapabilirsiniz! (işlemin sonunda javascript ile her select alanının değerini alarak… )
Ajax ile veri tabanına bağlanıp dinamik olarak listeleme yapmanın temel mantığı böyle. Biz burada arabalar için yaptık, siz il ve ilçeler için de yapabilirsiniz. Sonuçta bunları geliştirmek sizin elinizde…
Bir sonraki ajax yazısında görüşmek üzere…
Güncelleme : ajaxlisteleme | Dosyayı indir!
- Ya da bu blogda yer alan bütün yazıları içindekiler sayfasında görüntüleyebilirsiniz. Tıklayın!
Ajax ile dinamik listeleme yazısına 22 Yorum yapılmış.
görüşünü belirt
Arama
E-Posta Aboneliği
RSS Aboneliği
En Çok Yorumlanan Yazılar
- Ajax ile dinamik listeleme (22)
- Blogger’da “devamını oku” bağlantısı (21)
- MySQL’de Transaction ve PHP ile kullanımı (16)
- PHP ile sınırsız alt kategori mantığı (16)
- MySQL’de “join” kullanımı (13)
- Kullanıcı dostu url hazırlamak (12)
- PHP’nin (muhtemelen) az bilinen 10 özelliği (12)
- Kullandığınız programlama dili ne kadar popüler? (12)
- .htaccess konuları [Giriş] (11)
- Blogger’da arama kutusu ekleme (10)
Etiketler
Son Yorumlar
- Fatih: Açıkçası sitenizi yeni keşfettim ve gerçekten beğendim. Kaynak ve tutorial ihtiyacı olduğunda yabancı blog...
- beyo: emeğine sağlık, temiz bir anlatım olmuş
- gokhan: güzel bir anlatım yapmışsın.. devamını bekleriz.. kolay gelsin
- web yazılım şirketi: google blog araması ile .net üzerinden hizmet veren web yazılım şirketi ararken tesadüfen bu web...
- Codderol: çok teşekkürler bu çalışma bana çok yardımcı oldu….
04 / Mart / 2008
Moremotion ile bu işlemler çok kolay bir şekilde yapılabiliyor
çok yararlı bir kaynak olmuş.. güzel de anlatmışsın, teşekkürler. çok işime yarayacak…
Ajaxla ilgili daha fazla yazı bekliyorum..
kolay gelsin.
Elline sağlık. Güzel ve detaylı bir çalışma. Eğitsel çalışmalarınızın devamını dilerim.
Yılı seçtikten sonra markayı değiştirmek istediğimizde modelle yılı seçiniz yazısı tekrar beliriyor fakat tebrikler işleminiz tamamlandı yazısı da hala ekranda kalıyor .
http://img108.imageshack.us/img108/3122/screenhunter119ea5.jpg
Bu uygulamada kullanıcının işlemlerin sırasını bozmayacağını düşünerek kodlarımızı yazdık. Ancak işlem sırasının değişmesine göre de kod yazılabilir, yapmamız gereken tek şey, javascript fonksiyonlarının içine bunları da öngören bir ya da iki satır kod yazmak.
Yorum yazan arkadaşlara da çok teşekkürler, insanlar beğenince yazı yazmak daha kolay oluyor!
Eline sağlık..
Asp kullanıcısı olmama rağmen yazınız ajax konusunda ufkumu açtı, devamını bekliyoruz. Teşekkürler..
Yeni yazılar yazmak istiyorum ancak zaman problemi gerçekten büyük…
Yeni yazılarda görüşmek dileğiyle
Kaynak dosyayı indiremiyorum. hata sayfası çıkıyor.
Linkleri güncelledim, şimdi indirilebilir.
Uyarınız için teşekkürler.
Gayet güzel bir kod. Ancak sayfa ve veritabanı kodlaması latin-5 ve ISO-8859-9 olan sayfaya bu kodları eklemek istiyorum.
Türkçe karakterler proplemli çıkıyor. Buna çözüm bulabilir miyiz acaba?
ajax daki karakter problemlerini aşmanın tek yolu herşeyi utf8 de kodlamaktır. sayfa, veritabanı, veritabanı bağlantılarının hepsi utf8 olmak zorunda.
Çok güzel bir yazı, ellerinize sağlık. Benim konuyla ilgili küçük bir sorum olacak:
Selectboxtan araç seçildiği zaman seçim kutusunun yanına araç hakkında birkaç bilgi yazdırmak istiyorum. Bunu ajax tekniğiyle aynı sayfada ve veritabanı kullanmadan yapmanın yöntemi nedir acaba?
Yardımlarınız için teşekkürler.
Merhaba
Bunu yapmak için gereken şey, göstereceğiniz extra bilginin javascript değişkeni olarak tutulması ve ajax ile gelen cevap ile karşılaştırarak ekrana bu değişkenin değerini yazdırmaktır.
ok çok teşekkür ederim sanırım çözdüm
cok guzel bir bilgi olmus.. tsk ederim.
tskler..
Elinize sağlık, teşekkürler….
Ellerine sağlık kardeşim. Güzel olmuş. Ben şuanda bu scriptinden faydalanıyorum. Ama biraz değiştirmem lazım. Bakalım inş. başarabilicekmiyim…
üstad ellerine sağlık çok sade,anlaşılır ve bir o kadar da kullanışlı olmuş.ben sorgulama kısmını asp ile ve sadece marka model olmak üzere 2 adet selectle uyarladım.kod çalışıyor yanlız benim problemim sorgulama sayfasında oluşturulan marka selectinden den diğer sayfaya değer aktarmam lazım bunu nasıl yapabilirim?
Merhabalar,
Bunu yapmak için aklıma iki yol geliyor.
Birincisi, bir form oluşturmak ve bu formu diğer sayfaya post etmek. Select alanından değerler seçilirken bu formun alanlarının da değerleri seçilmiş olur ve daha sonra bu değerler diğer sayfaya post edilir.
İkinci olan ise seçilen değerleri SESSION verisi olarak kaydetmek, ve böylece oturum boyunca o kullanıcının değerlerine erişebiliriz.
Birinci yol daha makul olanı olsa da, ikinci yol daha geniş kullanım rahatlığı sağlayabilir.
isa hocam ilk söylediğiniz yolla verileri taşımıyor. çünkü jscriptle o div taglarının arasına veri yazdırıyoruz ve bunlar postla gönderilirken gitmiyor boş gidiyor. Jscript üzerinden bi taşıma yapılabilse çok güzel olacak. Bu olayıda ekleyebilirsek mükemmel bir script olur. ellerine sağlık;)