Turning gears are the logo of co-scripts

Bilirsiniz yönetim paneli yapmak istediğimizde anabaşlık-altbaşlık ilişkisi gibi önceden adetleri ve derinlikleri bilinmeyen ve aralarında parent-child (ebeveyn-çocuk) ilişkisi olan kayırlar yarattırmak ve kullanmak zorunda kalırız.

Çok bilinen bir metod olsa da basitçe mantığını buraya almak istiyorum.

Tablo yapımızda 4 kolon var minimum. id, baslikMetni, ebeveynid, sira

id bizim temel takip noktamız. Tekil ve otomatik artan şekilde veriliyor. Integer tipinde. Sayısal bir anlamı yok. 

baslikMetni takip etmek istediğimiz hiyerarşik öğenin adı yada tanımlayan kelime.

ebeveynid veya ustID diyebileceğimiz değer ise öğe eğer bir alt öğe ise ebeveyn öğenin id kolonundaki değeridir.

sira ise bildiğimiz sıra numarasıdır ama her öğenin kendi üst öğesinde sırası farklıdır. Ortak ebeveyne sahip alt öğeler kendi içlerinde bu sıraya tabii olurlar. Böylece sırayı da ek olarak belirleyebiliriz.

En son kısımda hem yerden kazanmak hem de sonsuz sayıda alt kümeye izin verebilmek için recursive (özyinelemeli) fonksiyon kullanacağız. Fonksiyon kendisine tek parametre alıyor baslangic idsi. Böylece ilgili id ve çocuk idlerini sırayla getirebiliyor. Daha derindeki idler için kendi içinden kendisini çağırarak özyineleme yapıyor.

Çok kaba hatlarıyla asp ile yazılmış bir örnek aşağıda. Örnek tamamen mantık anlatılması amaçlıdır. Sintaks hatası olabilir zira gözetilmemiştir.

function ogeGetir(baslangic)
Set rs = adoConn.Execute("Select * from basliklar where ust_id="& baslangic &" ORDER BY sira")
Do while not rs.eof
response.write rs("id") &")"& rs("baslikMetni")
   Set rse = adoConn.Execute("Select * from basliklar WHERE ust_id="& rs("id") &")
      If not rse.eof then 
         Do while not rse.eof
              response.write rse("baslikMetni")
       ogeGetir(rse("id"))
         rse.movenext
         Loop
      Else
        ' bisey istersek
      End if
rs.movenext
Loop
End function

Yukarıdaki algoritmada hata var, ilk düşündüğümde iç içe iki sorgu ile rahat çözerim diye düşünmüştüm ama algoritmayı tekrar liste halinde dökerken bazı hatalar oluşmaya başladı ve sonsuz döngüyü mantık olarak kursam da dökemedikten sonra işe yaramadı. Üzerinde biraz daha çalışmak zorunda kaldım. Sonra döngüyü tek sorguya indirdim. Ve sanırım şimdi başarılı oldum. En azından çalışıyor, şimdilik!

function ogeGetir(baslangic,ictenMi)
Set rs = conn.Execute("SELECT * FROM konuuzayi WHERE ebeveyn_id ="& baslangic &" ORDER BY sira ASC")

If rs.eof Then response.write(" < /li >")
If Not rs.eof And ictenMi=True Then response.write(" < ul >")

Do while not rs.eof
response.write "< li id=""node"& rs("id")&""">< a href=""#"">"& rs("baslik_metni") &"< /a>"&Chr(13) & Chr(10)
Call ogeGetir(rs("id"),true)
rs.movenext
If rs.eof And ictenmi=True Then response.write("< /ul >")
Loop

End Function
Call ogeGetir(0,false)

Örnek ASP için yazılmıştır ama mantık tüm dillere uygulanabilir.Eminim daha pratik çözümler bulanlar vardır ama bir türlü internetten örneklere ulaşamadım.

co-scripts tag image sonsuz dongurecursiveozyinelemeli fonksiyon
ID:218 | Okunma:1659