Yeni nesil belgeci.com'a hiç belge yollamayı denediniz mi ? Eğer denemişseniz sizde farketmişsinizdir ki , belge yollanırken ki açılan sayfada Kategori ve Alt Kategori seçme kısmı biraz eksikti. Bir ana kategori seçtiğiniz zaman hemen yan tarafında o kategoriye ait 1. dereceden alt kategoriler listeleniyordu. Ancak sitemizin hiyerarşik dosyalama yapısını farkettiyseniz, bir alt kategorinin de kendisine ait bir alt kategorinin olabildiğini görmüşsünüzdür. Bu konuda bir limit koymadık. İstediğimiz kadar dallandırabiliyoruz. Mesela bir çok sitede Bilgisayar diye bir ana kategori vardır, ve onun altında Yazılım , Donanım , Tasarım gibi alt başlıklar vardır. Ve siz C Programlama Dili ile ilgili bir belge yollamak isteseniz de ASP Dili ile ilgili bir belge yollamak isteseniz de, ikiside Bilgisayar -> Yazılım ın altına gidecektir. Çünkü birçok sitede bu dallanma sadece 2 basamaktır.
Ancak belgeci.com da bunun bir sınırı yoktur. Ve bu sayede belgeleri daha kategorize bir şekilde sizlere sunabiliyoruz. Mesela C programlama dili ile ilgili fonksiyonlardan bahseden bir belgemiz varsa bunu Bilgisayar->Programlama->C/C++->C Fonksyionları dizinin altına atıyoruz. Diğer turlu olsaydı hersey direkt Programlama dizini altında olacaktı, ve siteyi gezerken programlama ile ilgili ne varsa hepsi aynı ekranda karşınıza çıkacaktı.
Bu düzene göre , yani her dizinin, kendine ait sınırsız sayıda alt dizine sahip olabilmesi ilkesine göre, hareket ettiğimiz zaman, dizinlerin sahip olabileceği, sabit bir alt dizin sayısı olmamaktadır. Dolayısı ile Belge Yaz ekranında bir Ana Kategori secildiği zaman yan tarafında dolan Alt Dizinler listesini dinamik olarak doldurmak gerekti. Ve bu noktada açıkçası benim beynim resmen durdu
Ve işi biraz manuel hale getirerek. Her bir dizinin maximum 4. dereceye kadar alt dizine sahip olduğunu varsayarak , listeleme işlemi sırasında veritabanına 4 tane baglantı olusturdum. ve 4 tane de SqlDataReader kullandım.
Sistem mantık olarak şöyle işliyordu : bool AltKategorisiVarmı(int sayi) diye bir metod yazdım önce, bu metoda o anda listeye doldurulmakta olan Dizinin id sini gönderip , acaba onun bir alt kategprisi var mı yok mu? Onu öğrendim.. Sonra eger alt kategoriye sahipse hemen o noktada bir DataReader daha örnekleyerek database baglanıp onla ilgili alt kategorileri listeledim. Bu dongu gerceklesirken 4 kademeye kadar bu kodu bir daha yazdım. ve Sunucuyu biraz da yoraraktan 4 kademeye kadar listeletiyordum. Ancak daha sonra Oktay saolsun bu işlemi benim de yazmış oldugum AltKategorisiVarmı ? metodunu kullanaraktan dinamik hale getirdi. Kendisi yinele() isimli, kendi kendini çağırabilen recursive bir metod yazdı. Ve olay tek bir veri tabanı bağlantısıyla limitlere takılmadan gerçeklemiş oldu. Oktay'ın sayesinde şuan bir Ana Kategori seçtiğiniz zaman yan taraftaki Alt Kategoriler listesine , o Ana Kategori'ye ait tüm Alt Kategoriler ve her alt kategoriye ait alt dizinler köküne kadar listelenmekte.
|
|
Eski Hali
|
Yeni Hali
|
Ve işte bu olayın arka planda nasıl gerçekleştiğine dair görebileceğiniz kaynak kod :
protected void ddlAnaKategori_SelectedIndexChanged(object sender, EventArgs e)
{
ddlAltKategori.Items.Clear();
yinele(ddlAnaKategori.SelectedValue.ToString(), "");
}
protected void yinele(string secilen, string ciz)
{
Configuration webconfig = WebConfigurationManager.OpenWebConfiguration("~/");
SqlConnection conn = new SqlConnection(webconfig.ConnectionStrings.ConnectionStrings["WebConfig den gelen Bağlantı Cumlemiz"].ToString());
SqlCommand cmd = new SqlCommand("select cümlemiz");
cmd.Connection = conn;
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.Read())
{
ddlAltKategori.Items.Add(new ListItem { Text = ciz + dr[5].ToString(), Value = dr[5].ToString() });
if (AltKategorisiVarmi(int.Parse(dr[5].ToString())))
yinele(dr[5].ToString(), ciz + "-> ");
}
ddlAltKategori.SelectedIndex = 0;
ddlAltKategori.DataBind();
conn.Close();
}
bool AltKategorisiVarmi(int SayfaNo)
{
Configuration webconfig = WebConfigurationManager.OpenWebConfiguration("~/");
SqlConnection conn = new SqlConnection(webconfig.ConnectionStrings.ConnectionStrings["WebConfig den gelen Bağlantı Cumlemiz"].ToString());
SqlCommand cmd = new SqlCommand("select cümlemiz");
cmd.Connection = conn;
conn.Open();
if (cmd.ExecuteScalar() == null)
{
conn.Close();
return false;
}
else
{
conn.Close();
return true;
}
}
Bütün işleri kolaylaştıran Yinele() metodu için Oktay'a teşekkürler