Gestion universelle des données et service en utilisant du HTML pur. Cependant, pour collecter des données, vous avez besoin d’un référentiel de données. Pour éviter de nombreux problèmes liés à l'utilisation d'un serveur de base de données, vous pouvez collecter ces données au format XML. Voici la structure de base de notre projet :
<utilisateur>
<prénom/>
<nom de famille/>
<mi/>
</user>
J'ai initialement limité les données au prénom, au nom et au deuxième prénom. L'idée de base derrière cette page est que les informations utilisateur sont obtenues dans cette page. Une fois les besoins d’informations de l’utilisateur satisfaits, le processus doit passer à l’étape logique suivante de collecte. Pour simplifier les choses, je vais intégrer les fonctionnalités utilisateur dans une classe ASP.
Fonction Fusionner (vVar, vAlt)
Si vVal = "" Ou VarType(vVal) = 1 Ou VarType(vVal) = 0 Alors
Fusionner = vAlt
Autre
Fusionner = vVal
Fin si
de fonction de fin
CUser
m_SQL privé,
propriété publique m_DOM Obtenir DOM()
Définir DOM = m_DOM
Fin de la propriété
Public Sub saveUser()
m_SQL.save "save_user", m_DOM
Fin de
la fonction sous-publique validate()
m_DOM.loadXML "<root>" & m_SQL.validateUser(m_DOM) & "</root>"
Si ce n'est pas le cas, m_DOM.selectSingleNode("//error") n'est rien, alors
valider=Faux
Autre
valider=Vrai
Fin si
Fin de la fonction
Private Sub collectData (dom, oCollection)
Dim nItem, nœud, parent_node, n, sKey
Pour nItem = 1 à oCollection.Count
sKey = oCollection.Key(nItem)
Définir parent_node = dom.selectSingleNode("//" & sKey & "s")
Si ce n'est pas le cas, parent_node n'est rien, alors
Pour n = 1 À oCollection(sKey).Count
Définir le nœud = parent_node.selectSingleNode(sKey & _
"[chaîne(.)='" &
oCollection(sKey)(n) & "']")
Si le nœud n'est rien, alors
Définir le nœud = dom.createNode(1, sKey, "")
Définir le nœud = parent_node.appendChild (nœud)
Fin si
node.text = Coalesce(oCollection(sKey)(n), "")
Suivant
Autre
Définir le nœud = dom.selectSingleNode("//" & sKey)
Si ce n'est pas le nœud, alors _
node.text = Coalesce(oCollection(sKey), "")
Fin si
Suivant
Fin du sous-
classe privée sous-classe_Initialize()
Définir m_SQL = Nouveau CSQL
Définir m_DOM = Server.CreateObject("MSXML2.DOMDocument")
m_DOM.async = Faux
Si VarType(Request ("txtUserXML")) = 0 Ou Request ("txtUserXML") = "" Alors
Requête m_DOM.loadXML("txtUserXML")
Autre
m_DOM.load "<root>" & Server.MapPath("user.xml") & "</root>"
Fin si
collectData m_DOM, Demande.Form
collectData m_DOM, Request.QueryString
Fin du sous-
classe privée sous-classe_Terminate()
Définir m_SQL = Rien
Définir m_DOM = Rien
End Sub
End Classe
Classe CSQL
m_DAL privé,
sauvegarde de fonction publique m_Stream (sStoredProc, oDOM)
'adVarChar = 200
m_DAL.RunSP Array(m_DAL.mp("@xml_param", 200, 8000, oDOM.xml))
Fonction
publique de fin de fonction validateUser (oDOM)
Définir m_Stream = m_DAL.RunSPReturnStream("validate_user", Array(_
m_DAL.mp("@xml_param", 200, 8000, oDOM.xml)))
validateUser = m_Stream.ReadText(-1)
m_Stream.Fermer
Fonction de fin
Sous-classe privée_Initialize()
Définir m_DAL = Server.CreateObject("MyPkg.MyDAL")
m_DAL.GetConnection "une chaîne de connexion"
Définir m_Stream = Server.CreateObject("ADODB.Stream")
Fin du sous-
classe privée sous-classe_Terminate()
Définir m_DAL = Rien
Définir m_Stream = Rien
Fin de la sous-
classe de fin
La classe CSQL est construite sur la base d'un composant de couche d'accès aux données (m_DAL) MyPkg.MyDAL. Ce composant est construit sur la base des composants Fitch et Mather DAL, disponibles sur MSDN. De cette façon, nous construisons un pont entre SQL Server et votre code.
Lorsque l'objet CUser est initialisé, il collecte les données de requête et utilise la sous-fonction collectData() pour placer les données collectées dans un nœud correspondant dans le UserDOM. (Je n'expliquerai pas le code car il est assez facile à comprendre en soi.) Après avoir collecté les données (ou non), nous utiliserons XSL pour transformer le contenu des données en mise en page.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:if test="//erreur">
<font color="red">*Les informations en rouge sont obligatoires<br/></font>
</xsl:if>
<xsl:apply-templates select="//user"/>
</xsl:template>
<xsl:template match="utilisateur">
<police>
<xsl:attribute name="color">
<xsl:choisir>
<xsl:when test="//error[.='first name']">rouge</xsl:when>
<xsl:sinon>noir</xsl:sinon>
</xsl:choisir>
</xsl:attribut>
Prénom:
</font>
<input type="text" name="first_name">
<xsl:nom de l'attribut="valeur"><xsl:valeur-de
select="first_name"/></xsl:attribute>
</input><br/>
<police>
<xsl:attribute name="color">
<xsl:choisir>
<xsl:when test="//error[.='mi']">rouge</xsl:when>
<xsl:sinon>noir</xsl:sinon>
</xsl:choisir>
</xsl:attribut>
MI:
</font>
<input type="text" name="mi">
<xsl:attribute name="value"><xsl:value-of select="mi"/></xsl:attribute>
</input><br/>
<police>
<xsl:attribute name="color">
<xsl:choisir>
<xsl:when test="//error[.='last_name']">rouge</xsl:when>
<xsl:sinon>noir</xsl:sinon>
</xsl:choisir>
</xsl:attribut>
Nom de famille:
</font>
<input type="text" name="last_name">
<xsl:nom de l'attribut="valeur"><xsl:valeur-de
select="last_name"/></xsl:attribute>
</input><br/>
</xsl:template>
</xsl:stylesheet>
Cette feuille de style convertira le contenu en mise en page. La vérification des erreurs est importante et les procédures stockées vérifient les données en déterminant si elles doivent être traitées. Renvoie un nœud « erreurs » pour chaque champ qui ne peut pas être vide mais dont les données ne sont pas renseignées. Le résultat de ce XML est à peu près le suivant :
<user> .</user><errors><error>first_name</error> .
Cette feuille de style transformera le contenu en mise en page. La vérification des erreurs est importante et les procédures stockées vérifient les données en déterminant si elles doivent être traitées. Renvoie un nœud « erreurs » pour chaque champ qui ne peut pas être vide mais dont les données ne sont pas renseignées. Le résultat de ce XML est à peu près le suivant :
<user> .</user><errors><error>first_name</error> .</errors>
Notez que s'il y a une erreur correspondant au nom du nœud, la sortie produite sera rouge. Nous avons besoin de l’ASP suivant pour combiner toutes les choses précédentes.
<%@ Langage=VBScript %>
<%
Option explicite
Faible oUtilisateur
Définir oUser = NewCUser
Si oUser.validate() Alors
Définir oUser = Rien
Serveur.Transfer "NextPage.asp"
Fin si
%>
<html>
<corps>
<form method="POST" action="GetUser.asp" name="thisForm" id="thisForm">
<%
Response.Write xslTransform(oUser.DOM, "user.xsl")
%>
<input type="hidden" name="txtUserXML" id="txtUserXML"
value="<%=oUser.DOM.xml%>">
<input type="submit" value="Soumettre">
</form>
</corps>
</html>
<%
Définir oUser = Nothing
Fonction xslTransform(vXML, XSLFileName)
Dim m_xml, m_xsl
Si VarType(vXML) = 8 Alors
Définir m_xml = m_dom
m_xml.loadXML vXML
SinonSi VarType(vXML) = 9 Alors
Définir m_xml = vXML
Fin si
Si m_xml.parseError.errorCode <> 0 Alors _
Err.Raise vbObjectError, "XMLTransform(...)", m_xml.parseError.reason
Définir m_xsl = Server.CreateObject("MSXML2.DOMDocument")
m_xsl.async = Faux
m_xsl.load Server.MapPath(XSLFileName)
Si m_xsl.parseError.errorCode <> 0 Alors _
Err.Raise vbObjectError, "XMLTransform(...)", m_xsl.parseError.reason
xslTransform = m_xml.transformNode(m_xsl)
Définir m_xsl = Rien
Fonction de fin
%>
<!--#include file="CUser.asp"-->
Le code ASP crée l'objet CUser et renseigne les données s'il y a des données. Le code HTML résultant est ensuite créé via une transformation XSL à l'aide du DOM de CUser. La transformation est enveloppée dans une fonction appelée xslTransform. N'oubliez pas non plus de stocker le DOM CUser résultant dans un élément <INPUT> caché. Ou vous pouvez stocker le DOM CUser dans une variable de session et le récupérer lors de l'initialisation.
Après avoir complété cette page, vous pouvez créer d'autres pages basées sur le code squelette précédent. Vous avez maintenant créé un scénario de copier-coller pour la collecte de données. La plus belle partie de cette solution est que toutes les sorties sont du HTML pur, sans propriétés ni feuilles de style spécifiques au navigateur. Et comme la fonctionnalité est regroupée dans des classes, vous pouvez utiliser XSLT pour générer des mises en page et le code s'exécute assez rapidement.
-------------------------------------------------- ----------------------------------
L'auteur de cet article : Phillip Perkins est un entrepreneur d'Ajilon Consulting. Son expérience s'étend du contrôle des machines et des applications client/serveur aux applications intranet.