Ajax ile dinamik listeleme

Date04 / Mart / 2008 Author İsa Engiz    Category ajax     Tags Yorumlar21 Yorum Yapilmis.

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.

listele.jpg

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&amp;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&amp;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="&quot;.$yaz[&quot;model&quot;].&quot;">".$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 &amp;&amp; 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!

- Bu blogda yer alan yazıları RSS ile takip edebilirsiniz. RSS aboneliği için tıklayın.

- 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 21 Yorum yapılmış.

  • Engin 04 Mart 2008, 11:43

    Moremotion ile bu işlemler çok kolay bir şekilde yapılabiliyor

  • faruk 04 Mart 2008, 11:51

    ç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.

  • Süleyman SÖNMEZ 04 Mart 2008, 15:14

    Elline sağlık. Güzel ve detaylı bir çalışma. Eğitsel çalışmalarınızın devamını dilerim.

  • Deniz 04 Mart 2008, 21:40

    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

  • İsa 05 Mart 2008, 12:06

    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!

  • Hüseyin -neXus- 20 Mart 2008, 22:54

    Eline sağlık..

  • Ersin KÖSEOĞLU 16 Ekim 2008, 03:29

    Asp kullanıcısı olmama rağmen yazınız ajax konusunda ufkumu açtı, devamını bekliyoruz. Teşekkürler..

  • İsa Engiz 16 Ekim 2008, 06:18

    Yeni yazılar yazmak istiyorum ancak zaman problemi gerçekten büyük…

    Yeni yazılarda görüşmek dileğiyle :)

  • good 23 Ekim 2008, 22:34

    Kaynak dosyayı indiremiyorum. hata sayfası çıkıyor.

  • İsa Engiz 25 Ekim 2008, 11:55

    Linkleri güncelledim, şimdi indirilebilir.

    Uyarınız için teşekkürler.

  • good 25 Ekim 2008, 18:54

    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?

  • İsa Engiz 25 Ekim 2008, 20:07

    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.

  • erdi 02 Kasım 2008, 13:13

    Ç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.

  • İsa Engiz 03 Kasım 2008, 15:59

    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.

  • erdi 03 Kasım 2008, 19:57

    ok çok teşekkür ederim sanırım çözdüm :)

  • omer 08 Kasım 2008, 11:21

    cok guzel bir bilgi olmus.. tsk ederim.

  • mirc 09 Ocak 2009, 11:32

    tskler..

  • Hakan 19 Ocak 2009, 16:04

    Elinize sağlık, teşekkürler….

  • Uğur 11 Mart 2009, 21:08

    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…

  • Mehmet YILMAZ 24 Nisan 2009, 03:35

    ü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?

  • İsa Engiz 24 Nisan 2009, 15:34

    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.

görüşünü belirt

Spam Protection by WP-SpamFree

Arama


E-Posta Aboneliği


RSS Aboneliği

En Çok Yorumlanan Yazılar

Etiketler

404 ajax apache arama butonu as astrofizik açık kaynak banner blogger blogger/blogspot Blogger / Blogspot blogspot case chmod css date dosya yükleme editör etiket etkinlik favicon featured form ftp galeri Genel gimp hata sayfası header htaccess htpasswd ilişkisel veritabanı index innodb javascript join JQuery kategori koodla linux mysql opacity php resim url

Son Yorumlar

  • isa engiz: Yazı için teşekkürler. sabit ip 2.75 tl. bu ücreti verip kendi web sunucumuzu kurabiliriz… En yakın...
  • osman: Yazı için teşekkürler. Pardus projesinin Türkiye için çok önemli olduğunu düşünüyorum. Ancak yazıda da...
  • Mustinet: siblings kullanarak da yazılabilir. Teşekkürler
  • is: CSS kullanmadan sadece HTML kodlarıyla yanyana iki sütun (tablo kullanmadan) oluşturulabilir mi?
  • Doğan Yılmaz: verdiğiniz bilgiler için çok ama çok teşekkür ederim. artık sıkı bir takipçiniz olmaya karar verdim

Sayfalar


Faydalı Bağlantılar