إدارة شاملة للبيانات وتقديمها باستخدام لغة HTML النقية. ومع ذلك، من أجل جمع البيانات، تحتاج إلى مستودع بيانات. لتجنب العديد من المشاكل التي تأتي مع استخدام خادم قاعدة البيانات، يمكنك جمع هذه البيانات في XML. هنا هو الهيكل الأساسي لمشروعنا:
<المستخدم>
<الاسم_الأول/>
<الاسم_الأخير/>
<مي/>
</user>
قمت في البداية بتقييد البيانات بالاسم الأول واسم العائلة والوسط. الفكرة الأساسية وراء هذه الصفحة هي أنه يتم الحصول على معلومات المستخدم في هذه الصفحة. بعد تلبية احتياجات المستخدم من المعلومات، يجب نقل العملية إلى خطوة التجميع المنطقية التالية. ولتبسيط الأمور، سأقوم بتغليف وظيفة المستخدم في فئة ASP.
اندماج الدالة (vVar، vAlt)
إذا كان vVal = "" أو VarType(vVal) = 1 أو VarType(vVal) = 0 إذن
التحام = vAlt
آخر
التحام = vVal
نهاية إذا
إنهاء
فئة الوظيفة CUser
m_SQL خاص، m_DOM
ملكية عامة احصل على DOM()
اضبط DOM = m_DOM
نهاية الخاصية
العامة الفرعية saveUser()
m_SQL.save "save_user"، m_DOM
الفرعية
()
m_DOM.loadXML "<root>" وm_SQL.validateUser(m_DOM) و"</root>"
إذا لم يكن m_DOM.selectSingleNode("//error") فلا شيء إذن
التحقق من صحة = خطأ
آخر
التحقق من صحة = صحيح
نهاية إذا
نهاية الوظيفة
الخاصة بجمع البيانات الفرعية (dom، oCollection)
Dim nItem، Node،parent_node، n، sKey
بالنسبة لـ nItem = 1 إلى oCollection.Count
sKey = oCollection.Key(nItem)
تعيينparent_node = dom.selectSingleNode("//" & sKey & "s")
إذا لم يكنparent_node لا شيء إذن
لـ n = 1 إلى oCollection(sKey).Count
تعيين العقدة =parent_node.selectSingleNode(sKey & _
"[سلسلة(.)='" &
oCollection(sKey)(n) & "']")
إذا كانت العقدة لا شيء ثم
تعيين العقدة = dom.createNode(1, sKey, "")
تعيين العقدة =parent_node.appendChild(node)
نهاية إذا
Node.text = Coalesce(oCollection(sKey)(n), "")
التالي
آخر
تعيين العقدة = dom.selectSingleNode("//" & sKey)
إذا لم تكن العقدة لا شيء إذن _
العقدة.نص = التحام (oCollection(sKey)، "")
نهاية إذا
التالي
End Sub
Private Sub Class_Initialize()
اضبط m_SQL = CSQL جديد
تعيين m_DOM = Server.CreateObject("MSXML2.DOMDocument")
m_DOM.async = خطأ
إذا كان VarType(Request ("txtUserXML")) = 0 أو طلب ("txtUserXML") = "" إذن
طلب m_DOM.loadXML("txtUserXML")
آخر
m_DOM.load "<root>" & Server.MapPath("user.xml") & "</root>"
نهاية إذا
جمع البيانات m_DOM، Request.Form
جمع البيانات m_DOM، Request.QueryString
نهاية
Sub Class_Terminate الخاصة ()
اضبط m_SQL = لا شيء
اضبط m_DOM = لا شيء
نهاية
الفئة النهائية
الفرعيةفئة CSQL
m_DAL خاص، حفظ وظيفة m_Stream
العامة (sStoredProc، oDOM)
'adVarChar = 200
m_DAL.RunSP Array(m_DAL.mp("@xml_param", 200, 8000, oDOM.xml))
الوظيفة النهائية
الوظيفة العامة validateUser (oDOM)
اضبط m_Stream = m_DAL.RunSPReturnStream("validate_user"، Array(_
m_DAL.mp("@xml_param"، 200، 8000، oDOM.xml)))
validateUser = m_Stream.ReadText(-1)
m_Stream.Close
نهاية الوظيفة
Private Sub Class_Initialize()
تعيين m_DAL = Server.CreateObject("MyPkg.MyDAL")
m_DAL.GetConnection "بعض سلسلة الاتصال"
تعيين m_Stream = Server.CreateObject("ADODB.Stream")
نهاية
Sub Class_Terminate الخاصة ()
تعيين m_DAL = لا شيء
اضبط m_Stream = لا شيء
نهاية
الفئة النهائية
الفرعية
تم إنشاء فئة CSQL بناءً على مكون طبقة الوصول إلى البيانات (m_DAL) MyPkg.MyDAL. تم إنشاء هذا المكون استنادًا إلى مكونات Fitch وMather DAL، والتي يمكن العثور عليها على MSDN. بهذه الطريقة نقوم ببناء جسر بين SQL Server والتعليمات البرمجية الخاصة بك.
عند تهيئة كائن CUser، فإنه يجمع بيانات الطلب ويستخدم الوظيفة الفرعية CollectData() لوضع البيانات المجمعة في العقدة المقابلة في UserDOM. (لن أشرح الكود لأنه من السهل فهمه بمفرده.) بعد جمع البيانات (أو لا)، سنستخدم XSL لتحويل محتوى البيانات إلى تخطيط.
<?xml version="1.0"?>
<xsl:ورقة الأنماط xmlns:xsl=http://www.w3.org/1999/XSL/Transform
الإصدار = "1.0">
<xsl:output way="html"/>
<xsl:template match="/">
<xsl:if اختبار = "// خطأ">
<font color="red">*المعلومات باللون الأحمر مطلوبة<br/></font>
</xsl:إذا>
<xsl:apply-templates حدد = "// المستخدم"/>
</xsl:template>
<xsl:template match="user">
<الخط>
<xsl:اسم السمة = "اللون">
<xsl:اختر>
<xsl:when test="//error[.='first name']">الأحمر</xsl:when>
<xsl:otherwise>أسود</xsl:otherwise>
</xsl:اختر>
</xsl:السمة>
الاسم الأول:
</font>
<نوع الإدخال = "نص" اسم = "الاسم_ الأول">
<xsl:attribute name="value"><xsl:value-of
حدد = "first_name"/></xsl:attribute>
</الإدخال><br/>
<الخط>
<xsl:اسم السمة = "اللون">
<xsl:اختر>
<xsl:when test="//error[.='mi']">الأحمر</xsl:when>
<xsl:otherwise>أسود</xsl:otherwise>
</xsl:اختر>
</xsl:السمة>
مي:
</font>
<نوع الإدخال = "نص" اسم = "مي">
<xsl:اسم السمة = "القيمة"><xsl:قيمة التحديد = "mi"/></xsl:attribute>
</الإدخال><br/>
<الخط>
<xsl:اسم السمة = "اللون">
<xsl:اختر>
<xsl:when test="//error[.='last_name']">الأحمر</xsl:when>
<xsl:otherwise>أسود</xsl:otherwise>
</xsl:اختر>
</xsl:السمة>
اسم العائلة:
</font>
<نوع الإدخال = "نص" اسم = "اسم_الأخير">
<xsl:attribute name="value"><xsl:value-of
حدد = "last_name"/></xsl:attribute>
</الإدخال><br/>
</xsl:template>
</xsl:stylesheet>
ستقوم ورقة الأنماط هذه بتحويل المحتوى إلى تخطيط. يعد التحقق من الأخطاء أمرًا مهمًا، وتقوم الإجراءات المخزنة بفحص البيانات من خلال تحديد ما إذا كانت تحتاج إلى معالجة. إرجاع عقدة "الأخطاء" لكل حقل لا يمكن أن يكون فارغًا ولكن لا يحتوي على بيانات مملوءة. تكون نتيجة ملف XML هذا تقريبًا كما يلي:
<user> .</user><errors><error>first_name</error>
ستقوم ورقة الأنماط هذه بتحويل المحتوى إلى تخطيط. يعد التحقق من الأخطاء أمرًا مهمًا، وتقوم الإجراءات المخزنة بفحص البيانات من خلال تحديد ما إذا كانت تحتاج إلى معالجة. إرجاع عقدة "الأخطاء" لكل حقل لا يمكن أن يكون فارغًا ولكن لا يحتوي على بيانات مملوءة. تكون نتيجة ملف XML هذا تقريبًا كما يلي:
<user> .</user><errors><error>first_name</error> .</errors>
لاحظ أنه في حالة وجود خطأ في مطابقة اسم العقدة. سيكون الناتج المنتج باللون الأحمر. نحن بحاجة إلى ASP التالي للجمع بين كل الأشياء السابقة.
<%@ اللغة=VBScript %>
<%
الخيار صريح
خافت المستخدم
تعيين oUser = NewCUser
إذا oUser.validate() ثم
تعيين المستخدم = لا شيء
Server.Transfer "NextPage.asp"
نهاية إذا
%>
<أتش تي أم أل>
<الجسم>
<طريقة النموذج = "POST" action = "GetUser.asp" name = "thisForm" id = "thisForm">
<%
الاستجابة.كتابة xslTransform(oUser.DOM، "user.xsl")
%>
<نوع الإدخال = "مخفي" الاسم = "txtUserXML" معرف = "txtUserXML"
value="<%=oUser.DOM.xml%>">
<نوع الإدخال = "إرسال" القيمة = "إرسال">
</النموذج>
</الجسم>
</html>
<%
تعيين oUser = لا شيء
وظيفة xslTransform(vXML, XSLFileName)
خافت m_xml، m_xsl
إذا كان VarType(vXML) = 8 إذن
اضبط m_xml = m_dom
m_xml.loadXML vXML
ElseIf VarType(vXML) = 9 إذن
اضبط m_xml = vXML
نهاية إذا
إذا كان m_xml.parseError.errorCode <> 0 ثم _
Err.Raise vbObjectError، "XMLTransform(...)"، m_xml.parseError.reason
تعيين m_xsl = Server.CreateObject("MSXML2.DOMDocument")
m_xsl.async = خطأ
m_xsl.load Server.MapPath(XSLFileName)
إذا كان m_xsl.parseError.errorCode <> 0 ثم _
Err.Raise vbObjectError، "XMLTransform(...)"، m_xsl.parseError.reason
xslTransform = m_xml.transformNode(m_xsl)
اضبط m_xsl = لا شيء
وظيفة النهاية
%>
<!--#include file="CUser.asp"-->
تقوم تعليمات ASP البرمجية بإنشاء كائن CUser وتعبئة البيانات في حالة وجود بيانات. يتم بعد ذلك إنشاء HTML الناتج عبر تحويل XSL باستخدام DOM الخاص بـ CUser. يتم تغليف التحويل في دالة تسمى xslTransform. تذكر أيضًا تخزين CUser DOM الناتج في عنصر <INPUT> مخفي. أو يمكنك تخزين CUser DOM في متغير الجلسة وإخراجه أثناء التهيئة.
بعد الانتهاء من هذه الصفحة، يمكنك إنشاء صفحات أخرى بناءً على الكود الهيكلي السابق. لقد قمت الآن بإنشاء سيناريو النسخ واللصق لجمع البيانات. أجمل جزء من هذا الحل هو أن جميع المخرجات هي HTML خالص، دون أي خصائص أو أوراق أنماط خاصة بالمتصفح. ونظرًا لأن الوظيفة مجمعة في فئات، يمكنك استخدام XSLT لإنشاء تخطيطات وتشغيل التعليمات البرمجية بسرعة كبيرة.
-------------------------------------------------- ----------------------------------
مؤلف هذا المقال: فيليب بيركنز هو أحد المقاولين لدى شركة Ajilon Consulting. وتتراوح خبرته من التحكم في الجهاز والعميل/الخادم إلى تطبيقات الإنترانت.