Makale Özeti

Code-Behind dan JavaScript Kodu Üretilmesi - MS Agent Teknolojisini Server Tarafından Nasıl Kontrol Edebileceğimizi Öğrenelim

Makale

Microsoft Agentlarin Web Tabanlı Kullanımı - 2 :

    Web sayfanızda, kullanıcı gerekli alanları doldururken bir hata yaptı ya da gerekli gördüğünüz alanların tamamını doldurmadı, ya da benzeri bir exception oluştu. Kullanıcınızı nasıl uyarırsınız? Elbette bunun için bir çok yöntem var, validatorlar, kendi yazdığımız kontrol mekanizmaları... Ama kullanıcıyı uyaran, yaptığı hatayı düzeltmesi yönünde bilgilendiren, MS Office uygulamalarındaki gibi bir asistan çok daha interaktif olacaktır.  

    Önceki makalede, MS Agentların javascript ile nasıl kontrol edileceğini inceledik. Şimdi ise, code-behinddan bu scriptleri nasil oluşturabileceğimizi, oluşan durumlara göre, agentı nasıl kontrol edebileceğimizi inceleyelim.

    Aslında yapıcağımız iş, genel bir bakışla, HTML içeriğine script çıkarmak olarak özetlenebilir. Bu nedenle aşağıda göreceğiniz kodlar, farklı uygulamarda, sadece agentlar için değil, bir çok farklı scriptin uretilerek HTML sonucu olarak gösterilmesinde de kullanılabilir.

    Öncelikle agentı sembolize edicek bir class olusturdum.

 

Imports System.Collections.Specialized

Public Class Agent

    Dim m_ScriptList As New StringCollection()

    Public Sub Hide()

        m_ScriptList.Add("Hide();")

    End Sub

    Public Sub Show()

        m_ScriptList.Add("Show();")

    End Sub

    Public Sub Move(ByVal x As Integer, ByVal y As Integer)

        m_ScriptList.Add("MoveTo(" + Convert.ToString(x) + "," + Convert.ToString(y) + ");")

    End Sub

    Public Sub MoveToSpecial(ByVal strX As String, ByVal strY As String)

        m_ScriptList.Add("MoveTo(" + strX + "," + strY + ");")

    End Sub

    Public Sub Speak(ByVal strText As String)

        m_ScriptList.Add("Speak(" + Chr(34) + strText + Chr(34) + ");")

    End Sub

    Public Sub Gesture(ByVal x As Integer, ByVal y As Integer)

        m_ScriptList.Add("Gesture(" + Convert.ToString(x) + "," + Convert.ToString(y) + ");")

    End Sub

    Public Sub Think()

        m_ScriptList.Add("Think();")

    End Sub

    Public Sub Whisper(ByVal strText As String)

        m_ScriptList.Add("Speak(" + Chr(34) + "\\Chr=\" + Chr(34) + "Whisper\" + Chr(34) + "\\" + strText + Chr(34) + ");")

    End Sub

    Public Sub Play(ByVal strText As String)

        m_ScriptList.Add("Play(" + Chr(34) + strText + Chr(34) + ");")

    End Sub

    Dim _character As String = "Genie"

    Public Property Character() As String

        Get

            Return _character

        End Get

        Set(ByVal Value As String)

            _character = Value

        End Set

    End Property

    Public Sub Render(ByVal Response As System.Web.HttpResponse)

        Response.Write(vbCrLf)

        OutputScript(Response)

    End Sub

    Private Sub OutputScript(ByVal Response As System.Web.HttpResponse)

        OutputAgentControl(Response)

        StartScript(Response)

        OutputVariables(Response)

        OutputOnLoad(Response)

        OutputLoadAgent(Response)

        OutputSetCharObj(Response)

        OutputCheckLoadStatus(Response)

        OutputLoadError(Response)

        OutputGetPositions(Response)

        OutputCommands(Response)

        EndScript(Response)

    End Sub

    Private Sub OutputAgentControl(ByVal Response As System.Web.HttpResponse)

        Response.Write("<Object ID=" + Chr(34) + "AgentControl" + Chr(34) + " Width=0 Height=0" + vbCrLf)

        Response.Write("  ClassID=" + Chr(34) + "CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F" + Chr(34) + vbCrLf)

        Response.Write("  CodeBase=" + Chr(34) + "#VERSION=2,0,0,0" + Chr(34) + ">" + vbCrLf)

        Response.Write("</Object>" + vbCrLf)

    End Sub

    Private Sub StartScript(ByVal Response As System.Web.HttpResponse)

        Response.Write("<Script Language=" + Chr(34) + "JavaScript" + Chr(34) + ">" + vbCrLf)

    End Sub

    Private Sub OutputVariables(ByVal Response As System.Web.HttpResponse)

        Response.Write("var Agent;" + vbCrLf)

        Response.Write("var UsedChars;" + vbCrLf)

        Response.Write("var AgentID;" + vbCrLf)

        Response.Write("var AgentACS;" + vbCrLf)

        Response.Write("var AgentLoaded;" + vbCrLf)

        Response.Write("var LoadReq;" + vbCrLf)

        Response.Write("var HideReq;" + vbCrLf)

        Response.Write("var AgentLeftX, AgentCenterX, AgentRightX;" + vbCrLf)

        Response.Write("var AgentTopY, AgentCenterY, AgentBottomY;" + vbCrLf)

        Response.Write("UsedChars = " + Chr(34) + _character + Chr(34) + ";" + vbCrLf)

        Response.Write("AgentID = " + Chr(34) + _character + Chr(34) + ";" + vbCrLf)

        Response.Write("AgentACS = " + Chr(34) + _character + ".acs" + Chr(34) + ";" + vbCrLf)

        Response.Write("AgentLoaded = false;" + vbCrLf)

    End Sub

    Private Sub OutputGetPositions(ByVal Response As System.Web.HttpResponse)

        Response.Write("function GetScreenPositions()" + vbCrLf)

        Response.Write("{" + vbCrLf)

        Response.Write("  var ScreenWidth = window.screen.width;" + vbCrLf)

        Response.Write("  var ScreenHeight = window.screen.height;" + vbCrLf)

        Response.Write("  if ((ScreenWidth == 0) || (ScreenHeight == 0))" + vbCrLf)

        Response.Write("  {" + vbCrLf)

        Response.Write("    ScreenWidth = 800;" + vbCrLf)

        Response.Write("    ScreenHeight = 600;" + vbCrLf)

        Response.Write("  }" + vbCrLf)

        Response.Write("  AgentCenterX = (parseInt(ScreenWidth / 2) - parseInt(Agent.Width / 2));" + vbCrLf)

        Response.Write("  AgentRightX = (ScreenWidth - Agent.Width);" + vbCrLf)

        Response.Write("  AgentCenterY = (parseInt(ScreenHeight / 2) - parseInt(Agent.Height / 2));" + vbCrLf)

        Response.Write("  AgentBottomY = (ScreenHeight - Agent.Height);" + vbCrLf)

        Response.Write("}" + vbCrLf)

    End Sub

    Private Sub OutputOnLoad(ByVal Response As System.Web.HttpResponse)

        Response.Write("Window_OnLoad();" + vbCrLf)

        Response.Write("function Window_OnLoad()" + vbCrLf)

        Response.Write("{" + vbCrLf)

        Response.Write("  AgentControl.Connected = true;" + vbCrLf)

        Response.Write("  AgentLoaded = LoadLocalAgent(AgentID, AgentACS);" + vbCrLf)

        Response.Write("  if( !AgentLoaded )" + vbCrLf)

        Response.Write("  {" + vbCrLf)

        Response.Write("    AgentLoaded = LoadLocalAgent(AgentID, " + Chr(34) + Chr(34) + ");" + vbCrLf)

        Response.Write("  }" + vbCrLf)

        Response.Write("  if (AgentLoaded)" + vbCrLf)

        Response.Write("  {" + vbCrLf)

        Response.Write("    SetCharObj();" + vbCrLf)

        Response.Write("  }" + vbCrLf)

        Response.Write("  CheckLoadStatus();" + vbCrLf)

        Response.Write("}" + vbCrLf)

    End Sub

    Private Sub OutputLoadAgent(ByVal Response As System.Web.HttpResponse)

        Response.Write("function LoadLocalAgent(CharID, CharACS)" + vbCrLf)

        Response.Write("{" + vbCrLf)

        Response.Write("  AgentControl.RaiseRequestErrors = false;" + vbCrLf)

        Response.Write("  if (CharACS == " + Chr(34) + Chr(34) + ")" + vbCrLf)

        Response.Write("  {" + vbCrLf)

        Response.Write("    LoadReq = AgentControl.Characters.Load(CharID);" + vbCrLf)

        Response.Write("  }" + vbCrLf)

        Response.Write("  else" + vbCrLf)

        Response.Write("  {" + vbCrLf)

        Response.Write("    LoadReq = AgentControl.Characters.Load(CharID, CharACS);" + vbCrLf)

        Response.Write("  }" + vbCrLf)

        Response.Write("  AgentControl.RaiseRequestErrors = true;" + vbCrLf)

        Response.Write("  if (LoadReq.Status != 1)" + vbCrLf)

        Response.Write("  {" + vbCrLf)

        Response.Write("    return(true);" + vbCrLf)

        Response.Write("  }" + vbCrLf)

        Response.Write("  return(false);" + vbCrLf)

        Response.Write("}" + vbCrLf)

    End Sub

    Private Sub OutputSetCharObj(ByVal Response As System.Web.HttpResponse)

        Response.Write("function SetCharObj()" + vbCrLf)

        Response.Write("{" + vbCrLf)

        Response.Write("  Agent = AgentControl.Characters.Character(AgentID);" + vbCrLf)

        Response.Write("  Agent.LanguageID = 0x409;" + vbCrLf)

        Response.Write("}" + vbCrLf)

    End Sub

    Private Sub OutputCheckLoadStatus(ByVal Response As System.Web.HttpResponse)

        Response.Write("function CheckLoadStatus()" + vbCrLf)

        Response.Write("{" + vbCrLf)

        Response.Write("  if (!AgentLoaded)" + vbCrLf)

        Response.Write("  {" + vbCrLf)

        Response.Write("    LoadError();" + vbCrLf)

        Response.Write("    return(false);" + vbCrLf)

        Response.Write("  }" + vbCrLf)

        Response.Write("  window.status = " + Chr(34) + Chr(34) + ";" + vbCrLf)

        Response.Write("  AgentScript();" + vbCrLf)

        Response.Write("  return(true);" + vbCrLf)

        Response.Write("}" + vbCrLf)

    End Sub

    Private Sub OutputLoadError(ByVal Response As System.Web.HttpResponse)

        Response.Write("function LoadError()" + vbCrLf)

        Response.Write("{" + vbCrLf)

        Response.Write("  var strMsg;" + vbCrLf)

        Response.Write("  window.status = " + Chr(34) + Chr(34) + ";" + vbCrLf)

        Response.Write("  strMsg = " + Chr(34) + "Karakter yuklenirken hata olustu: " + Chr(34) + "+ AgentID + " + Chr(34) + "\n" + Chr(34) + ";" + vbCrLf)

        Response.Write("  strMsg = strMsg + " + Chr(34) + "Bu scriptin calismasi icin yuklenmesi gereken karakter:\n" + Chr(34) + ";" + vbCrLf)

        Response.Write("  strMsg = strMsg + UsedChars;" + vbCrLf)

        Response.Write("  alert(strMsg);" + vbCrLf)

        Response.Write("}" + vbCrLf)

    End Sub

    Private Sub OutputCommands(ByVal Response As System.Web.HttpResponse)

        Response.Write("function AgentScript()" + vbCrLf)

        Response.Write("{" + vbCrLf)

        Response.Write("  GetScreenPositions();" + vbCrLf)

        Dim i As Integer

        For i = 0 To m_ScriptList.Count - 1

            Response.Write("  Agent." + Convert.ToString(m_ScriptList(i)) + vbCrLf)

        Next

        Response.Write("}" + vbCrLf)

    End Sub

    Private Sub EndScript(ByVal Response As System.Web.HttpResponse)

        Response.Write("</Script>" + vbCrLf)

    End Sub

End Class

    Yukarıda ki class bir agentın özlelliklerini, yapabileceği işlemleri göz onüne alarak yazılmıştır. Bu classın instanceı ile .Play("Announce") .Speak("Selam") gibi fonsiyonları kullanarak, istediğimiz islemleri gerceklestirip, .Render metodu ile, agenta ait script kodlarını HTMLe çıkarıcağız.

    Örneğin; çok ziyaret edilen bir haber portalı dizayn ediceksiniz ve üyeleriniz ya da üye olmayan misafirleriniz sitenizi belki de günde 3 defa yeniden inceleyecek. O halde her seferinde, her yeni yüklenmede agentı göstermeniz hoş olmayacaktır. Bunun için, kullanıcı bazlı, agent bilgisi tutmanız çok daha profesyonelcedir. Bunu yapmanın en kolay yolu, cookielerdir. Asağıdaki kodda, agent classına bir instance oluşturulmasını aynı zamanda, agentın bu cookieye göre kontrolu görünmektedir. Kodda yalnızca göster/gösterme kontrolü olsa da, bu çok daha farklı, gelişmiş şekillerde de kulanilabilir.

Public Sub Merlinn()

        Dim ck As HttpCookie = Request.Cookies("Merlin")

        If (ck Is Nothing) And (CheckBox2.Checked) Then

 

            ck = New HttpCookie("Merlin", "True")

            ck.Expires = DateTime.Now.AddMonths(1)

            Response.Cookies.Set(ck)

            ShowMerlin()

        Else

            If Not IsPostBack Then

                CheckBox2.Checked = ck.Value

            End If

            If CheckBox2.Checked Then

                ShowMerlin()

            End If

 

        End If

    End Sub

 

    Private Sub ShowMerlin()

        Dim ag As New Agent

        ag.Character = "Merlin"

        ag.Move(800, 600)

        ag.Show()

        ag.Play("Announce")

        ag.Speak("Hey.. Ordaki.. ")

        ag.Play("Greet")

        ag.Speak("Ben Merlin.")

        ag.Speak("Nasil buldun makaleyi?")

        ag.Play("GestureRight")

        ag.Speak("yazgelistir.com’da o kadar cok makale var ki...")

        ag.Render(Response)

    End Sub

    Merlinn metodu çağrıldığında öncelikle cookinin durumuna bakıyor, eğer daha önceden bir cookie olusturulmamışsa cookie oluşturup, agentı gösteriyor. Ama daha önceden olusturulmuş bir cookie varsa, değerine bakıyor ve o değere göre agentı gösteriyor ya da göstermiyor. Cookienin durumuna bağlı olarak, eğer ShowMerlin methodu çağrıldıysa, agent classından bir ag objesi tanımlıyor, sırayla yapmasını istediğimiz komutları giriyor ve de Render methodu ile HTML in içine gönderiyor.

    Bir de cookienin durumunu değistiren bir metodumuz daha var. O da bir checkboxin checked durumunun değişip değişmediğini denetliyor.

Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged

        If CheckBox2.Checked Then

            Dim ck As HttpCookie = New HttpCookie("Merlin", "True")

            ck.Expires = DateTime.Now.AddMonths(1)

            Response.Cookies.Set(ck)

        Else

            Dim ck As HttpCookie = New HttpCookie("Merlin", "False")

            ck.Expires = DateTime.Now.AddMonths(1)

            Response.Cookies.Set(ck)

        End If

        Response.Flush()

    End Sub

    Yukarıdaki kod, checkboxın durumuna göre, cookienin durumunu değiştiriyor. Peki ama, cookieyi denetliycek ve de agentı göstericek olan Merlinn methodu nerden, nasıl çağrılıyor? Onunda cevabı aspx kodlarında.

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="cookAgent.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <%Merlinn()%>
   </HEAD>

 <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    <asp:CheckBox id="CheckBox2" runat="server" Text="Yardimci" AutoPostBack="True" Checked="True"></asp:CheckBox></TD>
   </FORM>
 </body>
</HTML>
 

    Gördüğünüz gibi, form oluşturulmadan önce, HTMLin içinden code-behindda bulunan Merlinn fonksiyonunu çağırarak, bulunduğu yere javascript kodlarının üretilmesini sağlar. Böylece, form yüklenme sırasında, agent scriptimiz hazır olarak HTML kodun içinde gelicektir.

    Code-behinddan HTML içine script çıkarmanın bir çok farklı yöntemi olmasına karşılık, agentlar için bu yöntem oldukça verimlidir.

    Herkese iyi çalışmalar.

Kıvanç ÖZÜÖLMEZ

ozuolmez@msn.com