|
|
||||||||||||
|
|
İnternet Sayfanızda XML Yetenekleri Kullanın Web belgeleri içinde XML yeteneklerinden doğrudan faydalanmak mümkün. Veri bağlama yöntemleri ile, XML verilerini sayfa içinde işlemek birçok kolaylıklar getiriyor. Bununla birlikte istemci tarafında güncellenen XML bilgisi web’deki ASP dosyasına gönderilebiliyor. Bu yazıda çevrimdışı güncelleme teknikleri ile ilgili bilgiler bulacaksınız. XML belgelerini görüntülemek için daha önce bahsettiğimiz CSS ve XSL dışında HTML içinde veri bağlama tekniklerini kullanabilirsiniz. Bu ayki projemiz Internet’teki XML üreten bir ASP dosyasından veri alıyor ve bilgileri güncelleyip geri gönderebiliyor. XML VERİLERİNİ HTML NESNELERİNE BAĞLAYIN XML belgelerini HTML belgeleri içinde kullanmak için Data Islands (Veri Adacıkları) olarak adlandırılan XML blokları kullanılır. Bu bloklar HTML dosyası içinde “xml” etiketi ile yer alırlar ve birçok türdeki HTML nesneleri XML veri adalarına bağlanabilir. Veri adaları iki şekilde oluşturulabiliyor. XML etiketi içindeki SRC özelliğine bir dosya adresi vererek ya da veri adası içindeki bölgeye doğrudan XML içeriği yazarak bunu yapabilirsiniz. Yani verinin aynı belgede tutulması ya da dış bir dosyaya bağlantı sağlanması sözkonusu. <XML ID="xmldata" SRC="kitaplar.xml"></XML> ya da <XML ID="xmldata">
<?xml version="1.0"?>
<KITAPLAR>
<KITAP>
<KOD>1</KOD>
<KITAPADI>Stratejik İttifak</KITAPADI>
<YAZAR>Alptekin Dursunoğlu</YAZAR>
<YAYINEVI>Anka</YAYINEVI>
</KITAP>
…
</KITAPLAR>
</XML>
Yukarıdaki iki bloğun ilkinde kitaplar.xml dosyasına bağlantı kurulmuş. İkincisinde ise XML bilgisi HTML dosyası içinde tutuluyor. Veri adasının script kodlarında kullanılabilmesi için ID etiketi ile bunu isimlendirmek gerekiyor. SRC değeri ise dış bağlantılar için bir adres belirtiyor. Bu adres bir XML belgesine ait olabileceği gibi geçerli XML verileri üreten, parametre başvurulu bir ASP dosyasına da ait olabilir. <XML ID="xmldata" SRC="http://www.chip.com.tr/xml/aspxml.asp?ara=deneme"></XML> Şubat ayında verdiğimiz kisiler.htm dosyası veri bağlama ile ilgili bir örnektir. Kayıt kümesi, sayfa geçişi olmadan tek sayfa üzerinde ileri ve geri hareket edilerek görüntülenebiliyor ve tüm kayıtlar ayrı olarak listelenebiliyor. Kayıtlar üzerinde ekleme, silme ve değiştirme işlemleri yapmak da mümkün. Web sayfası içindeki hemen her nesne, veri adasındaki XML elementlerine doğrudan bağlanabiliyor. Bu, XML verilerinin dinamik olarak görüntülenmesini ve değiştirilebilmesini sağlıyor. Internet Explorer 5 ile gelen XML yetenekleri çok az uğraş ile kullanışlı HTML belgeleri oluşturulabilmesini sağlıyor. Internet Explorer bir HTML belgesinde tanımlı her bir veri adası için bir Datasource Object (DSO) nesnesi oluşturuyor. DSO nesnesi, ADODB.Recordset gibi nesnelere benzer çalışır. Movenext, MoveFirst, MoveLast, Addnew, Delete gibi metotları, alanları içeren Fields gibi koleksiyonları vardır. Yani tam anlamıyla bir recordset (kayıt kümesi) nesnesidir. Web belgeleri içindeki textbox, table, label, checkbox, div, span gibi nesnelere veri adalarındaki alanları bağlamak mümkün. Bu bağlantı sonrasında kayıt kümesinde herhangi bir değişiklik olduğunda bağlı nesnelerin içeriği de otomatik olarak güncelleniyor. <HTML> KİTAPLAR <XML ID="kitaplar" SRC="kitaplar.xml"></XML> <TABLE BORDER="1" DATASRC="#kitaplar"> <THEAD> <TH align="left">Kod</TH> <TH align="left">Kitap Adı</TH> <TH align="left">Yazar</TH> <TH align="left">Yayınevi</TH> </THEAD> <TR> <TD width="30"><SPAN DATAFLD="KOD"></SPAN></TD> <TD width="150"><SPAN DATAFLD="KITAPADI"></SPAN></TD> <TD width="150"><SPAN DATAFLD="YAZAR"></SPAN></TD> <TD width="150"><SPAN DATAFLD="YAYINEVI"></SPAN></TD> </TR> </TABLE> </HTML> Kitaplar.xml dosyası bu kod içerisindeki “kitaplar” adlı veri adacığına bağlı. Bu ise altındaki tabloya bağlı durumda. Tablonun SRC özelliği ile veri adasına bağlantı tanımlanıyor. Sonrasında bu tablonun içinde kullanılacak SPAN nesnelerindeki DATAFLD özellikleri ile #kitaplar içindeki alanlar arasında bağ kurulmuş oluyor. Uzun listeler için tabloların DataPageSize özelliği sayfalar halinde listelemeyi sağlıyor. Son sayfaya kadar her sayfa bu değer adedince kayıtla sınırlandırılıyor. Tabloyu adlandırdığınız ID adını kullanarak, script kodları içinden bu tabloya ulaşıp diğer sayfaları da görüntüleyebilirsiniz. <TABLE ID="Tablo" DATASRC="#kitaplar" DATAPAGESIZE="10"> ... ... </TABLE> <BUTTON ONCLICK="ilk()">ilk sayfa</BUTTON> <BUTTON ONCLICK="onceki()">Önceki</BUTTON> <BUTTON ONCLICK="sonraki()">Sonraki</BUTTON> <BUTTON ONCLICK="son()">Son sayfa</BUTTON> <SCRIPT LANGUAGE="VBScript"> Sub ilk() Tablo.FirstPage End Sub Sub onceki() Tablo.PreviousPage End Sub Sub sonraki() Tablo.NextPage End Sub Sub son() Tablo.LastPage End Sub </SCRIPT> Table nesnesini, ID değerini kullanarak “Tablo” şeklinde adlandırdık. Alt tarafında butonlar oluşturup bunların script kodlarını çalıştırmasını ve diğer sayfalara geçmesini sağladık.
Veri adaları sadece görüntülemek için değil, güncelleme işlemleri için de kullanılabiliyor. Düzenlenebilir HTML nesneleri ile veri adasındaki bir alanı bağlamak bunun için yeterli olur. Aynı şey DATAPAGESIZE ile sayfa halinde listelenmiş tablolar için de geçerli olup, sayfa geçişlerinde dahi, halihazırda yapılmış olan değişiklikler korunmaktadır. Bu, XML verisinin serbestçe güncelleştirilip sunucuya gönderilebilmesi için faydalıdır. Kisiler1.htm dosyasında TD hücreleri içindeki SPAN’ları silip metin kutuları ekleyebilirsiniz. <TD width="150"><INPUT TYPE="Tetbox"
DATAFLD="KITAPADI"></TD> Peki istemcide kayıt değişiklikleri yapılmasını sağlamak web programcıları için ne anlama geliyor? Veri adalarının en önemli faydalarından biri, sayfa güncellemeleri olmaksızın, sayfalandırma, içerik değiştirme ve dinamik listeleme olanağıdır. Bu durumda web sayfanızdan elde edilen bir listede düzenlemeler yapmak için bu teknik ideal yöntem olabilir. Örneğin kitap kayıtlarının listelendiği bir sitede kullanıcının listeden kitap çıkarması, kitap adetlerini değiştirmesi, sipariş bilgilerini düzenlemesi gibi çok basit işlemler için sunucu çalışıp durmaktadır ve veri aktarımı olduğu için bant genişliği sıkça kullanılmaktadır. Bu gibi işlemlerin istemcide yapılması sunucu bilgisayarın yükünü hafifletebilir. Listelenen kayıtların tamamı XML çıktısı halinde istemciye gönderilir ve istemci, kendi düzenlemelerini ve seçimlerini yaptıktan sonra sonuç listesini sunucuya geri gönderebilir. XML bilgisini bir web sunucusundaki ASP dosyasına göndermek için XMLHTTP nesnesi etkindir. İstemcideki script blokları içine eklenecek bir kod ile, veri adasındaki xml içeriğinin tamamını sunucuya göndermek mümkündür. Sub Gonder()
dim xmlhttp
set xmlhttp=CreateObject("MSXML2.XMLHTTP")
xmlhttp.Open "POST","http://www.chip.com.tr/xml/xmlyukle.asp", false
xmlhttp.send kitaplar.XML
End Sub
Bu kod gönderme işlemini başarılı bir şekilde yapabilecek olmasına rağmen sunucudaki asp dosyasında, veriyi alıp işleyecek kodlar olması gerekir. Sunucuya gelen XML verisini okumak için aşağıdaki kod bloğunu kullanabilirsiniz. <%@ Language=VBScript %>
<%
Response.Expires=-1000
if Request.ServerVariables("REQUEST_METHOD") = "POST" then
dim dom
set dom=CreateObject("MSXML2.DomDocument")
dom.async=false
dom.load(Request)
session("xmlbilgisi")=dom.xml
'''dom.save "c:\deneme.xml"
'''XML BİLGİSİ ALINDI. VERİLER İŞLENECEK.
else
Response.write session("xmlbilgisi")
end if
%>
DOMDocument nesnesinin Load eyleminde Request’in tamamı XML bilgisi olarak yükleniyor. İçeriği kaydetmek için Save komutunu kullanabilirsiniz ya da gerekli işlemleri yapabilirsiniz. KİTAPLAR PROJESİ Bu ayki örnek projemiz www.chip.com.tr/xml altında yayınlandığını varsaydığımız kitap arama sitesine ulaşmayı, listelerden seçim yaptıktan sonra gerekli bilgileri aynı adrese geri göndermeyi sağlıyor. Programlama aşamasında XML’in ve VBScript’in nimetlerinden olabildiğince yararlandık. Sayfa geçişi olmadan yeni bir arama yapılıp, sonuçların listeye dahil edilmesi gibi bir özelliği var. Listelenen kayıtlardan belli seçimler yapılabiliyor ve seçili olan satırların zemini renklendiriliyor. Toplu seçim işlemi yapılacabileceği gibi, tüm kutular seçildiğinde toplu seçim kutusu da otomatik olarak seçili hale geliyor. Ayrıca yeni kayıt ekleme aşamasında, listede daha önce var olan kayıtlar tekrar eklenmiyor.
Web sitemizdeki http://www.chip.com.tr/xml/aspxml.asp adresli sayfa belli bir arama sonucunda bulunan kitap kayıtlarını listeliyor. Kitap bilgilerinde standart olarak KOD, KITAPADI, YAZAR, YAYINEVI, CEVIREN bilgileri bulunuyor. Bununla birlikte kitaplar.htm dosyasında seçim işlemi yapıldığı için aspxml.asp dosyasında üretilen XML belgesine SEC adlı yeni bir alan ekleniyor. Bu alan istemcide iken kayıtları seçmek için kullanılacak. XML verisi üreten aspxml.asp dosyasının içeriği kutudaki gibidir. <%@ Language=VBScript %><% Option Explicit %><% Response.ContentType = "text/xml" %><?xml version="1.0" encoding="windows-1254" ?>
<KITAPLAR>
<%
response.expires=-1000
dim conn
set conn=CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
server.MapPath("data.mdb") & ";"
dim ara
ara=left(request("ara"),10)
if ara<>"" then ara= " WHERE KitapAdi LIKE '%" & ara & "%'"
dim rs
set rs=CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM Kitaplar" & ara, conn
Do While Not rs.EOF
Response.Write "<KITAP><SEC>0</SEC>" & _
"<KOD>" & rs("Kod") & "</KOD>" & _
"<KITAPADI>" & rs("KitapAdi") & "</KITAPADI>" & _
"<YAZAR>" & rs("Yazar") & "</YAZAR>" & _
"<YAYINEVI>" & rs("Yayinevi") & "</YAYINEVI>" & _
"<CEVIREN>" & rs("Ceviren") & "</CEVIREN></KITAP>"
rs.MoveNext
Loop
rs.Close
conn.close
set rs=nothing
set conn=nothing
%>
</KITAPLAR>
Tüm kitaplar tekrarsız KOD alanı ile birbirlerinden ayrılıyorlar. Bu yüzden yeni eklenen kayıtları varolan listede bulmak mümkün oluyor. Öncelikle bir veri adası oluşturup kaynağını web sitemizdeki dosyanın adresi olarak ayarladık. <xml name="kitaplar" id="kitaplar" src="http://www.chip.com.tr/xml/aspxml.asp" async="false"> </xml> Yeni bir tablo oluşturup tabloyu veri bu adasına bağladık. <table ID="Liste" border="1" datasrc="#kitaplar">
...
...
<tr>
<td width="50" align="center">
<input name="chkSec" type="checkbox" datafld="SEC" onclick="Secildi()"></td>
<td width="50"><SPAN datafld="KOD"></SPAN></td>
<td width="150"><SPAN datafld="KITAPADI">Yükleniyor...</SPAN></td>
<td width="150"><SPAN datafld="YAZAR"></SPAN></td>
<td width="150"><SPAN datafld="YAYINEVI"></SPAN></td>
<td width="150"><SPAN datafld="CEVIREN"></SPAN></td>
</tr>
...
Seçili kayıt sayısını hafızada tutmak için chkSec adlı checkbox Secildi() prosedürünü harekete geçiriyor. Bu prosedür içinde hem adetler hesaplanıyor, hem de satırların zemin renkleri düzenleniyor. Tablo içine bir CheckBox ve SPAN nesneleri yerleştirildi. Sonrasında kontrol amaçlı bir “Veriyi Göster” butonu oluşturduk. Bu buton script bloğundaki Goster() prosedürünü çalıştırıyor. <INPUT TYPE="button" VALUE="Veriyi Göster" ONCLICK="Goster()"> Listemizdeki toplam kayıt adedi, veri adasının URL adresi, veri adasındaki XML içieriğinin tamamı bir mesaj bilgisi olarak gösteriliyor. Sub Goster()
msgbox "TOPLAM KAYIT = " & kitaplar.recordset.recordcount & vbcr & _
"URL = " & kitaplar.url & vbcr & _
vbcr & kitaplar.xml
End Sub
Tüm kayıtları seçme işlemini başlık satırında bulunan chkTumunuSec adlı checkbox yapıyor. Silme işleminin yapıldığı prosedürde temel kontroller ve silme için gerekli
veritabanı yöntemleri kullanılıyor. Tüm kayıt kümesi baştan sona taranıyor ve
varsa seçili olan kayıtlar kitaplar.recordset.delete komutu ile siliniyor. DOSYALAR:
|