Asp de recursive ile sınırsız kategori listeleme nasıl yapılır
Merhaba arkdaşlar bu dersimizin konusu e-ticaret sitelerinde ürün kategorisi oluşturuken veya CMS sistemlerde menü ve alt menüler tasarlamada kullanılan sınırsız kategori sistemi.İlk olarak sınırsız kategorileme için veritabanının nasıl oluşturulacağını inceleyelim.Örneğin bir e-ticaret uygulaması için veritabanı tablo yapımız şu şekilde olsun.
Yukarıdaki tablo yapısında her kaydın bir KATEGORI_ID, KATEGORI_UST_ID ve KATEGORI_AD değerleri bulunmakta.KATEGORI_ID değeri primary key otamatik artan özelliklerine sahip olmalı.Ana kategorilerin KATEGORI_UST_ID değeri 0 olmalı.
Her kayıttaki KATEGORI_UST_ID değeri kayıt hangi kategoriye ait ise o kategorinin KATEGORI_ID değerini almalıdır.Yukarıdaki örnekte Elektronik ve Donanım kategorileri ana kategori olduğu için KATEGORI_UST_ID değerleri 0’dır.Anakart ve Kart Okuyucular, Donanım kategorisine ait oldukları için KATEGORI_UST_ID değerleri 2 dir.AMD ve INTEL ise Anakart kategorisine ait olduğu için KATEGORI_UST_ID değerleri 3 dür.
Kategorileme mantığını bu şekilde anlatmaya çalıştık.Şimdi gelelim bu oluşturulan tablodaki kayıtları, her kategori altında alt ketegorisi görüntülencek şekilde listelemeye.Bunun için sub prosüdürü ve recursive yöntemini kullanıcağız.
Öncelikle bir asp sayfası açıp sub prosüdürümüzü oluşturalım.
<% sub subRecursive(ParentID, intLevel) dim objRs dim strSql strSql = "SELECT KATEGORI_ID, KATEGORI_AD FROM tblKategori WHERE KATEGORI_UST_ID = " & ParentID 'tblKategori tablomuzdaki KATEGORI_UST_ID değeri sub'dan gelen ParentID değişkeni ile sorgulanıyor. set objRs = objConn.Execute(strSql) 'Sorgumuzu çalıştırıyoruz. ' Sorgu sonuçlarını do while döngüsü ile listeliyoruz. if Not objRs.EOF then do while Not objRs.EOF %> <tr> <td> <img src="bosluk.gif" border="0" width="<%=25*intLevel%>" height="1"> <!--bosluk.gif width değerini initLevel değişkeni ile değiştirip alt kategorilerin soldan girintli şekilde listelenmesini sağlıyoruz.-> <a href="icerik.asp?id=<%=ObjRs("KATEGORI_ID")%>"><%=ObjRs("KATEGORI_AD")%></a></td> </tr> <%subRecursive objRs("KATEGORI_ID"), intLevel + 1 objRs.MoveNext loop end if if Not objRs Is Nothing then objRs.Close end if set objRs = Nothing end sub %>
– sub subRecursive(ParentID, intLevel) komut satırında ParentID değişkeni üst kategorimizin id değeri için, intLevel değişkeni kategorilere soldan boşluk bırakmak için kullancağız.
– strSql = “SELECT KATEGORI_ID, KATEGORI_AD FROM tblKategori WHERE KATEGORI_UST_ID = ” & ParentID Burada tblKategori tablomuzdaki KATEGORI_UST_ID değeri sub’dan gelen ParentID değişkeni ile sorgulanıyor.
– subRecursive objRs(“KATEGORI_ID”), intLevel + 1
komut satırında subRecursive prosedürünü kendi içerisinde çalıştırarak bir kategorinin alt kategorilerini sorgulatıp listelemiş oluyoruz.
Daha sonra veritabanı bağlantı kodlarını yazıp oluşturduğumuz prosedürü bir tablonun table tagları içerisinde çalıştırıyoruz.
<table border="0" cellpadding="0" cellspacing="0" width="779"> <% dim strConn strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("veritabani.mdb") set objConn = Server.CreateObject("ADODB.Connection") objConn.Open strConn subRecursive 0, 0 ' Prosedürümüzü değişkenler 0 dan başlayacak şekilde çalıştırıyoruz. objConn.Close Set objConn= Nothing %> </table>
Sonuç:
Sınırsız kategorileme mantığını ve listelenmesini ayrıntıya girmeden anlatmaya çalıştım.Kodlar biraz incelenirse daha anlaşılır olacaktır.
İyi kodlamalar.:)