ana sayfa hakkında forum (yeni) rss takibi reklam yerleşimi iletişim giriş

İçerik Kategorileri

  1. Active Server Pages
    1. Temel Konular [13]
    2. Genel İçerikler [12]
    3. Nesne Kütüphanesi [0]
    4. Form Elemanları [4]
    5. Döngü İfadeleri [3]
    6. Veritabanı İşlemleri [7]
    7. Fonksiyonlar [2]
    8. Hatalar ve Çözümleri [16]
  2. ASP Hızlı Referans
    1. TextStream Nesnesi [7]
    2. Response Nesnesi [1]
    3. Request Nesnesi [1]
    4. Application Nesnesi [1]
    5. Session Nesnesi [4]
    6. Server Nesnesi [0]
    7. FSO Nesnesi [4]
  3. Browser Scripting
    1. VBScript [4]
    2. SQL Sorgulama [4]
  4. MySQL [0]
  5. Uygulamalar
    1. Hazır Fonksiyonlar [3]
    2. Hazır Kodlar [9]
    3. Script Algoritmaları [3]
    4. Script Geliştiriyoruz [2]

Sitede Ara


Hosting Sponsorumuz

Mar

9

Web 2.0 ile Gelen Etiket Sistemi

Script Algoritmaları13 yorum3959 izlenimsrcnckr

Aspogren Topluluğu'nda da var olan ve bir çok sitede artık vazgeçilmez hale gelen etiket sisteminin nasıl yapıldığını inceliyoruz.


Öncelikle sabırla yazıyı takip etmenizi istiyorum. Çok uzun bir yazı olacağa benziyor. Konu ağır ve bir o kadar da önemli :)

Bugünlerde artık sitelerde kategorilerin kalktığını, yerini etiket sisteminin aldığını görüyoruz. Peki bu etiket sistemi nedir? Mantığı nedir ve neden kullanılır? gibi sorular çok sorulmuştur. Cevaplayalım. Etiket sistemi kategori sisteminin önüne geçen bir özgürlüktür. Sitemizde yer alan kategoriyi uzatma şansımız yoktur. Ama etiketlerde dilediğimiz cümleleri verebiliriz. Önemi ise, bir çok yazıyı birbirine ilişkilendirerek çağırmasıdır. Ve arama motorları bunları sanki anahtar kelime gibi görebiliyor.

Peki etiket sistemini nasıl hazırlayacağız. Öncelikle işin mantığını, temelini anlamak gerekir. Web 2.0'ın inanılmaz gelişmeleri vardır. Bunların başında Etiket sistemi, Starrating vb.. Ama şu anda bizi etiket vurgusu ilgilendirmektedir. Olay çok basit. İyi analiz edilmeli, veritabanı iyi oluşturulmalıdır.

Bu yazımızda algoritma geliştirdiğimiz için herhangi bir oluşum için kod temin etmeyeceğim. Çünkü burada bir döngü, split ve sql komutları gerekmektedir. İşin mantığını anlayacağım ve kısa kısa kodlar ile bitireceğim yazımı.

Etiket sistemi için veritabanı tasarımı
Öncelikle kategori olayını gözünüzün önüne getirin. 2 tane tablomuz olurdu, birincisi kategorileri tutar, diğerleri ise sitemizin içeriği olan yazıları. Etiket sisteminde de değişen birşey yoktur. Hemen veritabanı modelimizi verelim.

2 adet tablomuz olacak. Öncelikle içerik depomuzu yaratalım;
Tablo Adı : icerik
Alanlar : id (otomatik sayı), baslik (metin / 50), aciklama(not)

Ve etiket depomuzuda yaratalım;
Tablo Adı : etiket
Alanlar : id (otomatik sayı), yazi (sayi), etiket (metin / 100)

Veritabanı modelimiz ve ilişkilerimiz ise aşağıdaki gibi olacaktır;



Peki veritabanımızı oluşturduk, ya gerisi?

şimdi yapılacak bir form gerekli (kod vermeyeceğim dedim ama olmayacak gibi). Hemen bir form yaratıyoruz. Form alanında 3 eleman gerekli.
     1. Başlık
     2. Açıklama
     3. Etiketler

form.asp için aşağıdaki kodları kullanınız;
<form action="isle.asp" method="post">
     <p>Başlık : <br /><input type="text" name="baslik" /></p>
     <p>Açıklama : <br /><textarea name="aciklama"></textarea></p>
     <p>Etiketler : <br /><input type="text" name="etiket" /></p>
     <p><strong>Not : </strong>Etiketleri virgül ile ayırınız.</p>
     <input type="submit" value="Kaydet" />
</form>

Formumuzu tanıtalım. Başlık ve açıklama alanları bilindiği gibi içeriğimizin başlık ve metin alanı. Etiket kısmı bizi ilgilendiriyor. şimdi etiketleri virgül ile ayırarak veritabanımızda depolayacağız. Örnek giriş kullanımı şöyle olmalıdır.

Örnek : ASP,MySQL,SQL,CSS,XHML,Active Server Pages vb...

Buraya kadar olan işlemler basitti. şimdi zorlu aşamaya geldik. Bunları işlemek ve veritabanına depolamak. Aslında şuanda ASP hakkında bir çok konuyu işlemiş olacağız.
     1. Veritabanına kayıt,
     2. Veritabanında sorgulama
     3. İçerik listeleme
     4. Etiket sistemi vb...

isle.asp için aşağıdaki kodları kullanınız;
<%
     baslik = trim(request.form("baslik"))
     aciklama = trim(request.form("aciklama"))
     etiket = trim(request.form("etiket"))
     If Len(baslik) < 5 or Len(aciklama) < 10 then
          response.write "Başlık ve açıklama alanlarını doldurun."
     Else
          Set ODBC = Server.CreateObject("ADODB.Connection")
          ODBC.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("mdb.mdb")
               Set kayit = ODBC.Execute("Insert into icerik (baslik,aciklama) values ('"&baslik&"','"&aciklama&"')")
               set kayit = nothing
               Set kontrol = ODBC.Execute("Select id from icerik where baslik = '"&baslik&"'")
                    If not kontrol.eof then
                         If isnull(etiket) = false then
                              etiketler = split(etiket, ",")
                              For i = 0 to Ubound(etiketler)
                                   Set etiketkayit = ODBC.Execute("Insert into etiket (yazi,etiket) values ('"&kontrol("id")&"','"&trim(etiketler(i))&"')")
                                   Set etiketkayit = nothing
                              next
                         End If
                    End If
               kontrol.close : set kontrol = nothing
          response.write "Tüm bilgiler kaydedildi"
     End If
%>


şimdi kodlarımızı parça parça ele alalım. Request.Form kısmını açıklamak istemiyorum, artık bu kısmı öğrenmiş olmalısınız. Kodlarımız arasında yer alan trim fonsiyonu kelimelerin başında ve sonunda yer alan gereksiz boşlukları kaldırır.

Öncelikle verimizi kaydettik, sonra bir sorgulama gerçekleştirdik, kayıt olan id'yi tespit etmek için. şimdi diyeceksiniz ki aynı veri girilirse ne olacak. Temeli anlattığım için kodları uzatmak istemedim. Verinizi kaydetmeden önce bir sorgu açıp, başlık ile ilişki kurup aynı isimde var mı yok mu diye ilişkilendirmelisiniz. Gelecek konularımızda bu konu üzeirinde uzun uzun duracağız. Kodları büyütüp sizi yormak istemedim.

Son aşama olarak, etiket değişkeninin boş olup olmadığını sınadık (isnull). Eğer boş değilse virgül (,) ile split uyguladık. Ve split uyguladığımızda şöyle bir değer dönecekti;

Örneğin etiketler hanesine şu değerler verilsin; ASP, MysqL, CSS, XHTML
Split ile süzüldüğünde dönecek olan değerleri değişken adımız olan etiketler ile örneklendiriyorum.
etiketler(0) = ASP
etiketler(1) = MysqL
etiketler(2) = CSS
etiketler(3) = XHTML

Daha önce demiştik ya, programlamada ilk değer her zaman sıfırdır diye, bu düzden de for döngümüzü 0 (sıfır)'dan başlattık. Döngümüzde yer alan Ubound(etiketler) söz dizimi, (daha önce bu konuyuda işlemiştik) UBound bir dizide yer alan toplam veri değerini veriyordu. For döngümüzü 0'dan etiketler dizisinin aldığı son değere kadar dönmesini istedik. Ve her değerimizide veritabanımıza yazdırdık.

şimdi yukarıda etiketler değişkenin alabileceği 4 değeri vermiştim. Kodlarımız arasında yer alan trim(etiketler(i)) ifadesi ise şu anlamdadır. Döngü her döngüğünde i değişkenimiz farklı bir değer alacaktı. 0 - 1 - 2 ... gibi. yani her döngü dönüşünde etiketler değişkeninin o değerdeki karşılığını istedik. Örneğimize göre örneklendirmek gerekirse;
trim(etiketler(2)) değeri CSS değerini verecektir.

Uygulamamızı bitirmiş oluyoruz. Sizle birlikte bende deneyerek tamamladım. Örneğimide çalıştırdım. Ve sizlerin konuyu daha net anlayabilmesi için demo olarak download'a sunacağım.

Ayrıca konuyu uzatmamak için gereken diğer yazılarımı örnek içerisinde tamamladım. Etiketleri yazılar ile nasıl ilişikilendireceğinizi (bilgial.asp) ve seçilen etikete ait yazıları nasıl bulacağınızı (bilgial.asp) örnek içinde kodladım. Kodları iyice incelerseniz konuya hakim olacaksınızdır. Elbette ilk denemelerinizde yanılabilirsiniz ama üzerine giderseniz bu konuyu mutlaka öğreneceksinizdir.

Etiket sistemi hakkında hazırlamış olduğum örneği buradan indirebilirsiniz.

Kolay gelsin :)

Etiketler  :  web2.0   etiket   sistem   label   tags   labels   tags   ubound   dizi   trim   yenilik   eof   insert   into   microsoft.jet.oledb.4.0   server.createobject   adodb.connection   kayit   sorgulama   listeleme   text   textarea   submit   veritabani   tablo   alan   kategori  

İçeriği takip etSayfayı YazdırPermalink

13 yorum var

#59.-dmrL-09 Mart 2007 Cuma

çok güzel bir konuya deyinmişsin sercan tebrik ederim :)

#60.-fatiherikli-09 Mart 2007 Cuma

Teşekkür ederim,
Çok güzel bir yazı olmuş. Arama optimizasyonu için etiket sistemi çok önemli ...

#62.-LineStar-09 Mart 2007 Cuma

güzel yazmıssın eline sağlık yararlı bi makale olmus:)

#77.-svmsz-14 Mart 2007 Çarşamba

eline sağlık. güzel çalışma.
madem cömertçe bilgilerinizi paylaşıyonuz bende bi fikir vereyim.
konunun altında etiketleri sıralamak güzel fikir ama yeni nesil kullanıcıların çoğu bu neymiş diye anlamıcaktır bile. ben böyle düşünüyorum.
ayrıca, içerik eklerken etiketlenecek kelimeleri yazmak ayrı bir eziyet olmazmı.

şöyle bir şey yaptım...

her sitenin iyi yada kötü bir text editörü vardır.
içerik gönderecek kullanıcı içeriğini yazar, derki ;
for i = 1 to 10
Response.write (" "&i &" mrb")
next

bunu yazdıktan sonra sizin editörü kullanır ve etiketlemek istediği kelimeleri seçer,

[etiket>for[/etiket> i = 1 to 10
[etiket>Response.write[/etiket> (" "&i &" mrb")
next

ve kaydını gönderir.
sizde bu yazıyı formatlarsınız.
[etiket>[/etiket> tagları arasındaki kelimeleri, içerik tablonuzun içerik fieldinde aratıp  etiketin varlıgını ispatladıktan sonra
etiketlenen kısma <span style=background-color:kirmizi;>etiket</span> deyip içeriğin içerisinde etiket geçen bir başlığı linklersiniz.veya etiket sayısı birden fazlaysa baslıkları listelersiniz.
yoksa gugıla yonlendirebilirsiniz. size kalmış.
böylelikle siteye gelen kullanıcı mesaj okurken o kelimeyi bilmiyorsa etiket linkini takip eder.
böyle bişey
...
paylaşım için tekrar tşk

#79.-SrcnCkr-15 Mart 2007 Perşembe

Sevimsiz, buda olur ama düşünsene, 5bin kayıt var ve text alanında bir sorgulama myaptırıyorsun. Ayrıca etiket blogunun içinde olacak diyeceksin. Nasıl yavaşlatır değil mi?

Veritabanı hakkında vermiş oldum yanılgı hatasına düşmüş olunur böyle. Bazen performans için 2 dk fazla çalışmak daha iyidir.

#85.-adimavi-20 Mart 2007 Salı

Kulağı düz tutmak yerine tersten tutan bir yöntem olmuş...

Yine formu üstte verildiği gibi kullanıyoruz....

form.asp için aşağıdaki kodları kullanınız;
<form action="isle.asp" method="post">
     <p>Başlık : <br /><input type="text" name="baslik" /></p>
     <p>Açıklama : <br /><textarea name="aciklama"></textarea></p>
     <p>Etiketler : <br /><input type="text" name="etiket" /></p>
     <p><strong>Not : </strong>Etiketleri virgül ile ayırınız.</p>
     <input type="submit" value="Kaydet" />
</form>

Burada etiketler normal yazı gibi birer boşlukla veya virgülle artık orası size kalmış kayıt edin ben boşluk kullanıyorum...


oluşturacağımız db deüstte resimde gösterildiği gibi iki tablo değil tek tablo kullanacağız yalnız açıklama kısmının yanına yeni bir alan etiket alanı ekleyeceğiz alttaki gibi kayıt edeceğiz.
<%
     baslik = trim(request.form("baslik"))
     aciklama = trim(request.form("aciklama"))
     etiket = trim(request.form("etiket"))
     If Len(baslik) < 5 or Len(aciklama) < 10 then
          response.write "Başlık ve açıklama alanlarını doldurun."
     Else
          Set ODBC = Server.CreateObject("ADODB.Connection")
          ODBC.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("mdb.mdb")
               Set kayit = ODBC.Execute("Insert into icerik (baslik,aciklama,etiket) values ('"&baslik&"','"&aciklama&"','"&etiket&"')")
               set kayit = nothing
          response.write "Tüm bilgiler kaydedildi"
     End If
%>

etiketlerimiz şuanda şu şekilde kayıt oldu;
ASP MysqL CSS XHTML

şimdi bunu okutma olayımıza geldi sıra işte burada split kullanıyoruz
<%
set kayitoku = ODBC .execute("Select baslik, aciklama, etiket from icerik where id = "& request("id") &"")
if not kayitoku.eof then
etiket = kayitoku ("etiket")
                baslik= kayitoku ("baslik")
                aciklama = kayitoku ("aciklama")
end if
If isnull(etiket) = false then
etiketler = split(etiket, " ")
response.Write("Etiketler: ")
For i = 0 to Ubound(etiketler)
response.Write("<a href=""/etiket/"&trim(etiketler(i))&"/"">"&trim(etiketler(i))&"</a> ")
next
response.Write("<b>"&baslik&"</b><br/>"&aciklama&"")
else
response.Write("Kayıt yok.")
%>


yazı üstünkörü oldu ama daha pratik bir yöntem...

#86.-SrcnCkr-20 Mart 2007 Salı

Peki, ileriye dönük bir projemiz var ve biz 4-5 ay sonra düşündük ki bir etiket bulutuna ihtiyaç duyuyoruz. Bana bu kodlarınız için bir etiket bulutu sistemi hazırlarmısınız?

Örneği, yeni hazırladığım bir projem var ve sağ modülde yer alan bir rasgele etiket bulutu var. Aynı şekilde bunun gelişmiş alanı olan etiket bulutu adlı linkte de mevcut.

http://sercancakir.com/css-sitesi.gif şu adresi bir inceleyin bakalım. Sizin dediğiniz yöntemle bu işlemi nasıl gerçekleştireceğinizi merak ediyorum.

Eğer iyi bir proje hazırlayacaksanız bunun gelişim dönemini göz önüne almalısınız. 4 ay sonra bu proje ne olacak?

Ben sizleri tanıyorum, yani reelde olmasada güzel işlerinizi takip ediyorum. Ama görüyorum ki yaptıkları işlerden övündüğüm kişilerin daha önce belirttiğim hatalara düştüğünü, yada düşebileceklerini farkediyorum. Üzülüyorum buna. Arkadaşlar bizim işimiz performans. 2 saniyelik gecikme bize bir dezavantajdır. 1-2 saat fazla çalışalım, 1-2 sayfa fazla kod yazalım ama sitemiz 2 saniye erken açılsın. Yanlış mı düşünüyorum.

#87.-linestar-20 Mart 2007 Salı

sercan sana katılıyorum
dediğin gibi sitenin geleceğinide düşünmek lazım şimdi arkdaşların verdiği kodlarlada olabilir ama ilerleyen günlerdde veya yıllarda ziyaretçi trafiğin zorlaştığında bu sana tez avantaj olarak dönecek.database yavaslayacaktır ve ziyaretçi kaybedeceksindir.bunun için bence arkdaşların önerileride iyide
bi 2 sn ye için bunlar bence biraz mantıksız .

iyi calısmalar hepinize

#88.-adimavi-20 Mart 2007 Salı

verdiğim kodların performans sorunu yok ancak denildiği gibi ileriye dönük bulut projesinde sorun çıkara bilir aslında sorun çıkarmaz ama o zaman yazılımı 1-2 saat fazla kasabiliriz. kasmamak içinse rastgele etiket sutunundan 4 kayıt çağırırız 4 kayıt içerisinde 20 ye yakın kelimemiz olur buda bir çözüm olabilir ama zaten bulut olayına girecek kişi fazladan tablosunu hazırlamıştır ;)

#89.-SrcnCkr-20 Mart 2007 Salı

şöyle diyeyim ben sana o zaman. biz kategorileme için ayrı bir tablo açalım diyoruz, sen ise ne gerek var içeriğe birde kategori alanı açılır ve string değer olarak kategori adını yazarız.

String mi integer mı daha performanslıdır :)

#91.-adimavi-20 Mart 2007 Salı

illa 1-2 saat fazla kodlama yapalım diyorsan o zaman sana bi öneri vereyim ayrı bir tablo açalım etiket diye açtığımız tablo da değişkenlerimizde şunlar olsun id,etiket,tiklanma artık elimizde integer var.

şimdi etiket ekleme paneli yapalım eklediğimiz bu etiketler yazı ekleme panelinde checkbox olarak yer alsın (veya normal textbox a kelimeleri ekleyip onuda eklenti table ımızdaki integer larla karşılaştırırız olmayanı otomatik ekletiriz ve oradan eşleşenlerin id lerini alırız sonrasında yazı table ımıza idleri kaydettiririz 4,3,2,8 şeklinde) işaretlenen checkboxlar id olarak yazı tablosunda açtığımız değişkene 4,3,2,8 şeklinde eklenir.

bu daha ileri düzey proje için aynı kelimeden ikinci bir etiket adını önler ve o kelime üzerinden kaç kere geliş yapıldığını sayar.

bir düşünce anlatabildiğim kadar artık :)

şuan bana benim üstte yazdığım yol yetiyor daha büyük proje için daha kısa yol bulamazsamda şimdi aklıma gelen üstteki yöntem daha çok işe yarar...

#94.-SrcnCkr-20 Mart 2007 Salı

Bakın bu fikir bana ait değil elbette. Haa, illaki bu kullanılacak diye bir yükümlülükte yok. Ama ben bu konuda hatalı olmadığım kanısındayım. şuan söylediklerin kulağa hoş geliyor ama teoride 1 sorgu fazla demektir. Olmaz mı olur. neden olmasın. Bulut için daha kolay yöntemde olabilir. Ama verdiğim şekli kullanmak (bana göre) daha mantıklı. Sizlerin yorumlarıda elbette benim için değerlidir.

Tek yöntemde asılı kalmıyoruz. ne güzel tartışıp yeni fikirler üretmeye çalışıyoruz. İlk söylediğine kesinlikle katılmadım ama şuanki fikrin 1 sorgu fazla olmasına rağmen hoş birşey. Yapılabilir bir işlem. (.tsm) Teşekkürler güzel fikir ve yorumların için (brv)

#469.-S Emre-16 Ocak 2008 Çarşamba

Benim danışmak istediğim birşey var:

Biz başlangıçta etiketleri virgülle ayırıyorduk.

Fakat artık virgülle değil de boşlukla ayırıyoruz, çünkü kullanıcı virgül koymayı birtürlü öğrenemedi. Anlamsız kelime öbekleri şeklinde etiketler oluştu, mesela:

"istanbul anne kedi" gibi.

şimdi etiketin oluşması için boşluk bırakmaları yeterli oluyor. Ancak bu sefer de kelime öbekleri şeklinde etiket oluşturamıyoruz.
Mesela "kız kulesi" diye bir etiket yapamıyoruz. "kız ve "kulesi" diye iki etiket oluşuyor.

şimdi sormak istediğim:

Boşlukla ayrılan kelimelerin her birisini bir etiket yapmaya devam etmek (şu anki gibi) ve bunun yanında tırnak içerisine alınan öbekleri de bir tek etiket yapmak.
yani şu anda:
kız kulesi kedi anne istanbul
yazdığımızda
1-kız 2-kulesi 3-kedi 4-anne 5-istanbul
şeklinde ortaya çıkan 5 etiket yerine
"kız kulesi" kedi anne istanbul
yazalım ve
1-kız kulesi 2-kedi 3-anne 4-istanbul
4 etiket oluşsun.

Oluşur mu?


Bu içeriğe yorum yazın

BBCode ve Emotions desteği aktif. Yorumunuz onaylandıktan sonra gösterilecektir.

Bu yazı ile benzer içeriğe sahip olabilecek yazılar

  1. Web 2.0 ile Gelen Etiket Sistemi
  2. Web 2.0 ile Gelen Etiket Sistemi
  3. 404 Rewrite - Hata sayfalarına hükmetmek
  4. Çoklu kayıt silme
  5. Array (dizi) değişkenler
  6. Yardımcı Nesneler
  7. Ziyaretçi Defteri Yapımı
  8. Veritabanındaki Bilgileri Listeleme
  9. Veritabanına Kayıt Ekleme
  10. Veritabanına Kayıt Ekleme
  11. Veritabanına Kayıt Ekleme
  12. Sunucu Üzerinden Text Dosyası Oluşturma
  13. TextArea ile Form İşlemleri
  14. Veritabanına Bağlanmak
  15. Veritabanı Nedir? Neden Önemlidir?
  16. Veritabanına Kayıt Ekleme
  17. Veritabanındaki Bilgileri Listeleme

Yazının aktif olduğu kategoriye eklenmiş son yazılar

  1. Detaylara Bakabilme
  2. Kategorileme Algoritması - Verileri Kategorileme

Aspogren.net web sitesi SiDEnet sunucularından yayınlanmaktadır.

eXTReMe Tracker