يشير ما يسمى بالنموذج المعقد هنا إلى نموذج يحتوي على عدة أنواع مختلفة من المدخلات، مثل مربعات القائمة المنسدلة، والنص أحادي السطر، والنص متعدد الأسطر، والقيم الرقمية، وما إلى ذلك. في الحالات التي تحتاج فيها هذه النماذج غالبًا إلى الاستبدال، يلزم وجود برنامج إنشاء ديناميكي للنموذج. تقدم هذه المقالة مثل هذا النظام، الذي يستخدم قاعدة بيانات لحفظ بيانات تعريف النموذج، ويستخدم برامج ASP النصية لإنشاء أكواد HTML للنماذج والبرامج النصية ديناميكيًا للتحقق من مدخلات النموذج.
1. تحديد بنية جدول قاعدة البيانات
يمكنك في كثير من الأحيان رؤية نماذج مثل "الاستطلاع الأسبوعي" على الويب. وهذا نموذج يحتاج إلى التحديث بشكل متكرر. إذا كان هناك برنامج يقوم بإنشاء النماذج والبرامج النصية للتحقق من صحتها ديناميكيًا، فيمكن تقليل عبء العمل الخاص بإنشاء هذه النماذج بشكل كبير.
في مثال إنشاء النموذج الديناميكي والتحقق من صحته في هذه المقالة، نستخدم قاعدة بيانات Access لتخزين معلومات التعريف حول النموذج. وفي الوقت نفسه، ومن أجل التبسيط، يتم أيضًا حفظ البيانات التي أدخلها المستخدم في النموذج في نفس قاعدة البيانات . يتطلب تعريف النموذج وجود جدولين: يتم استخدام الجدول الأول (التعريفات) لتحديد حقول إدخال النموذج، ويقوم الجدول الثاني (القوائم) بحفظ معلومات إضافية حول كل حقل إدخال، مثل عناصر التحديد في قائمة التحديد.
يحتوي الجدول Definitons على الحقول التالية:
FieldName - اسم المتغير المخصص لحقل إدخال النموذج
التسمية - تسمية نصية، يتم عرض النص الإعلامي أمام حقل الإدخال
النوع - حرف واحد يمثل شكل حقل إدخال النموذج ونوع قيمة الإدخال، كما يلي:
(t) مربع إدخال النص، أي < INPUT TYPE = "TEXT" >.
(ن) مربع إدخال نص، ولكنه يتطلب قيمة رقمية.
(م) محتوى الملاحظة، المستخدم لإدخال التعليقات أو كميات كبيرة أخرى من النص، وهو عبارة عن مربع تحرير نص متعدد الأسطر.
(ب) يتطلب إدخال "نعم" أو "لا". في هذا التنفيذ، سيتم استخدام مربع اختيار للحصول على هذا الإدخال، مع تسمية النص لمربع الاختيار "نعم". إذا قام المستخدم بتحديدها، فستكون قيمة الإرجاع "تشغيل".
(ص) زر الاختيار.
(ل) مربع القائمة المنسدلة.
الحد الأدنى - صالح فقط لقيم الإدخال الرقمية، ويتم ذكر الحد الأدنى للقيمة هنا. يوجد في هذا المثال مربع إدخال رقمي "العمر" مع تعيين الحد الأدنى لقيمته على 1.
الحد الأقصى – ترتبط قيمة هذا الحقل بنموذج حقل الإدخال. بالنسبة لمربعات الإدخال الرقمية، فهو يمثل الحد الأقصى للقيمة المسموح بها. على سبيل المثال، القيمة القصوى لـ "العمر" هي 100. بالنسبة لمربعات إدخال النص، يمثل الحد الأقصى الحد الأقصى لعدد الأحرف المسموح به. بالنسبة لمربعات تحرير النص متعددة الأسطر، يمثل الحد الأقصى عدد أسطر النص في المنطقة المرئية.
مطلوب - يشير إلى ما إذا كان الإدخال مطلوبًا. إذا لم يتم إدخال قيمة من هذا النوع، فسيقوم مدقق الإدخال بالإبلاغ عن خطأ. في النموذج، يتم تمييز القيم التي يجب إدخالها بعلامة النجمة، ويتم مطالبة المستخدم على شكل حاشية سفلية بضرورة إدخال هذه القيم.
النموذج النموذجي في هذه المقالة هو استبيان مبرمج ASP. تعريف النموذج في جدول التعريفات هو كما يلي:
اسم الحقل نوع التسمية الحد الأقصى المطلوب
نص الاسم (t) - 50 لا يوجد
عمر رقم العمر (n) 1 100 لا يوجد
جنس. الجنس زر تحديد واحد (ص) - - نعم
نص عنوان البريد الإلكتروني (t) - - نعم
مربع القائمة المنسدلة للغة برمجة اللغة (ل) - - لا
يتم استخدام القوائم لحفظ بعض المعلومات الإضافية المحددة في حقل الإدخال. في هذا المثال، يتم استخدام "الجنس لقيمتي الإدخال" و"اللغات". قوائم الجدول بسيطة للغاية وتحتوي فقط على الحقول الثلاثة التالية:
اسم الحقل - حقل إدخال النموذج الذي ينتمي إليه السجل الحالي
القيمة - قيمة
تسمية التحديد - النص الفوري للاختيار الذي يراه المستخدم
حقل الإدخال "الجنس" لا يمكن إدخالها إلا من قيمتين للاختيار من بينها: "ذكر" أو "أنثى". تسرد "اللغة" العديد من لغات البرمجة التي يمكن تطبيقها على بيئة ASP، بما في ذلك: VBScript، وJavaScript، وC، وPerl، و"أخرى".
الجدول الثالث "السجلات" يحفظ المحتوى المقدم من قبل المستخدم، ويحتوي أيضًا على ثلاثة حقول، كل سجل يتوافق مع إرسال من قبل المستخدم:
السجل - نوع الملاحظة، يتم حفظ إدخال المستخدم في شكل سلسلة استعلام.
تم الإنشاء - التاريخ والوقت الذي أرسل فيه المستخدم النموذج. RemoteIP - عنوان IP الخاص بمرسل النموذج.
في التطبيقات الفعلية، قد يكون من الضروري جمع المزيد من المعلومات حول المستخدمين، ولتبسيط الأمر، يسجل هذا المثال معلومتين إضافيتين فقط: وقت الإرسال وعنوان IP الخاص بالمستخدم.
2. التحضير
بعد الانتهاء من تعريف بنية البيانات والنموذج أعلاه، يمكنك بعد ذلك كتابة البرنامج النصي. تتمثل مهمة البرنامج النصي في إنشاء النماذج ومعالجة النماذج المقدمة من قبل المستخدم.
سواء كان ذلك إنشاء نموذج أو معالجته، تعد العمليات (المهام) الثلاث التالية ضرورية: الأول هو تحديد نوع التحقق من الصحة عند إنشاء النموذج، يتم الحصول على قيمة نوع التحقق من خلال سلسلة الاستعلام، وعند معالجة النموذج يتم الحصول على الحقول المخفية من النموذج للقراءة. هناك أربعة أنواع من طرق التحقق من النماذج التي يدعمها البرنامج: عدم التحقق، والتحقق من جانب العميل عبر JavaScript، والتحقق من البرنامج النصي ASP من جانب الخادم، والتحقق من جانب العميل والخادم (الأسماء الرمزية هي من 0 إلى 3 على التوالي). إذا لم يتم تحديد طريقة مصادقة صالحة في سلسلة الاستعلام، فستكون طريقة المصادقة الرابعة هي الطريقة الافتراضية. تسمح لنا طريقة معالجة التحقق هذه بتطبيق نظام إنشاء النموذج ومعالجته بمرونة. عندما يحظر العميل استخدام التحقق من JavaScript، لا يمكن تنفيذ عملية التحقق إلا من جانب الخادم. إليك الرمز لتحديد نوع التحقق من الصحة:
التحقق من نوع التحقق من الصحة
إليك مقتطف الاقتباس:
iValType = Request.QueryString("val")
إذا كان IsNumeric(iValType) = خطأ، فإن iValType = 3
إذا كان iValType > 3 أو iValType < 0، فإن iValType = 3
المهمة الثانية هي فتح اتصال قاعدة بيانات وإنشاء كائنين لمجموعة السجلات: كائن RS، وهو كائن مجموعة السجلات الرئيسي في هذا البرنامج، المستخدم لتشغيل جدول التعريفات؛ وكائن RSList، المستخدم بشكل أساسي لقراءة البيانات من جدول القوائم. يوفر نموذج البرنامج طريقتين للاتصال بقاعدة البيانات: استخدام ODBC DSN أو عدم استخدام ODBC DSN (عند استخدام DSN، تحتاج إلى إنشاء DSN باسم Dynamic أولاً، وتم التعليق على التعليمات البرمجية الخاصة باستخدام DSN للاتصال بقاعدة البيانات).
المهمة الثالثة هي إخراج بعض أكواد HTML الثابتة قبل (وبعد) إنشاء (أو معالجة) البرنامج النصي للنموذج، مثل <HEAD>< /HEAD>، وتحرير RS وRSList والكائنات الأخرى المشغولة عند انتهاء مورد البرنامج النصي .
بالإضافة إلى التعليمات البرمجية التي تكمل المهام المذكورة أعلاه، هناك نوعان من الصفحات التي قد يتم إنشاؤها بواسطة نصوص ASP المتبقية في نموذج التطبيق: نموذج الأسئلة (انظر الصورة أعلاه) وصفحة النتائج التي تظهر بعد النموذج المقدمة (الأخير مسؤول أيضًا عن تسجيل النتائج المقدمة من قبل المستخدم). إن أبسط طريقة لتحديد أي جزء من البرنامج النصي سيتم تشغيله هو التحقق مما إذا كان النموذج قد تم إرساله: إذا كان الأمر كذلك، فقم بمعالجة النموذج، وإلا قم بإنشاء النموذج.
هل يتم إنشاء نموذج أو معالجة نموذج،
وفيما يلي مقتطف اقتباس:
إذا كان Len(Request.Form) = 0 إذن
'إنشاء نموذج... قليلاً...
آخر
'معالجة النموذج... قليلاً...
End If
3. قم بإنشاء النموذج ديناميكيًا
عند إنشاء النموذج، يحدد البرنامج السجلات وفقًا لكل حقل إدخال في جدول Definitons، ويقوم بإنشاء كود HTML للنموذج المقابل وكود JavaScript بدوره. أول شيء يتم إنشاؤه في كود HTML هو علامة النص:
إليك مقتطف الاقتباس:
sHTML = sHTML & vbTab & "< TR >" & vbCrLf & vbTab & vbTab
sHTML = sHTML & "< TD VALIGN=" & Chr(34) & "TOP" & Chr(34)
sHTML = sHTML & " >" & vbCrLf & vbTab & vbTab & vbTab
sHTML = sHTML & "< B >" & RS.Fields("التسمية")
يقوم البرنامج بعد ذلك بالتحقق مما إذا كان حقل الإدخال الحالي يتطلب الإدخال. إذا لزم الأمر، أضف علامة النجمة بعد نص التسمية (تشير إلى أنه يجب إدخال القيمة)، وبالنسبة للقيمة التي يجب إدخالها، يجب إنشاء كود JavaScript المقابل للتحقق منها. بالنسبة لأزرار الاختيار أو قوائم التحديد، هناك تحقق إضافي من أن المستخدم قد قام بالفعل بتحديد خيار لجميع أنواع الإدخال الأخرى، فقط تأكد من أن قيمة الإدخال ليست فارغة.
بعد تسمية النص توجد عناصر الإدخال للنموذج، ويتم إنشاء كود HTML لهذه العناصر بناءً على الأنواع والسمات المحددة في جدول التعريفات. والخطوة التالية هي إنشاء كود JavaScript الذي ينفذ مهام التحقق من جانب العميل بناءً على متطلبات قيمة الإدخال. في هذا المثال، تتطلب القيم الرقمية فقط مزيدًا من التدقيق للتأكد من أن إدخال المستخدم هو بالفعل رقم وأن القيمة الرقمية تقع بين الحد الأقصى والحد الأدنى المسموح به للقيم. بعد إنشاء التعليمات البرمجية أعلاه، يمكنك إنهاء صف الجدول (أي حقل الإدخال) ومتابعة معالجة السجل التالي لجدول التعريفات. بمجرد معالجة جميع سجلات قاعدة البيانات، فإن الخطوة التالية هي إضافة كود HTML للزر "إرسال" والزر "مسح". إذا نظرت إلى الأمر من زاوية أخرى، فإن مهمة البرنامج هنا هي إنشاء كل حقل إدخال بناءً على سجل قاعدة البيانات، ويشغل كل حقل إدخال صفًا في الجدول، ويحتوي كل صف في الجدول على خليتين: يتم استخدام الخلية الأولى للعرض التسميات النصية، والثانية تعرض الوحدة عنصر الإدخال نفسه (انظر dForm.asp للحصول على التعليمات البرمجية).
بعد اكتمال العملية المذكورة أعلاه، يتم حفظ كود HTML الخاص بالنموذج ووظيفة JavaScript للتحقق في المتغيرين sHTML وsJavaScript على التوالي. قبل كتابة هذه المحتويات إلى الصفحة، يتحقق البرنامج مما إذا كان العميل يتطلب التحقق من صحة JavaScript. إذا لم يكن هذا التحقق مطلوبًا، فسيتم مسح متغير sJavaScript:
إذا كان iValType = 0 أو iValType = 2 ثم sJavaScript = ""
بعد إخراج علامة BODY، يقوم البرنامج بإخراج وظيفة JavaScript التالية:
ما يلي هو جزء من الاقتباس:
< لغة البرنامج = "جافا سكريبت" >
<!--
التحقق من صحة الوظيفة (النموذج) {
// التحقق من صحة نموذج العميل
< %=sJavaScript% >
عودة صحيحة؛
}
وظيفة CheckRadio(objRadio){
// ما إذا تم تحديد قيمة في زر الاختيار
for(var n = 0; n < objRadio.length; n++){
إذا (objRadio[n].checked){
عودة صحيحة؛
}
}
عودة كاذبة.
}
قائمة التحقق من الوظيفة (objList) {
// ما إذا تم تحديد قيمة في قائمة الاختيار
for(var n = 1; n < objList.length; n++){
إذا (objList.options[n].selected){
عودة صحيحة؛
}
}
عودة كاذبة.
}
//-->
</ / البرنامج النصي >
إذا لم يطلب العميل التحقق من صحة JavaScript، فسيتم ترك وظيفة التحقق من الصحة مع عبارة "return true". يتم استخدام آخر وظيفتين ثابتتين في JavaScript (CheckRadio وCheckList) في الكود أعلاه للتحقق من صحة أزرار الاختيار ومربعات القائمة المنسدلة، وستستدعيهما وظيفة التحقق عندما يلزم التحقق من صحة حقلي الإدخال هذين.
يمكنك الآن البدء في كتابة النموذج إلى الصفحة:
< FORM ACTION="./dform.asp" METHOD="POST" NAME="MyForm" onSubmit="return validate(this)" >
هنا، فقط إذا عادت وظيفة التحقق من الصحة صحيح وعندها فقط قم بإجراء عملية إرسال النموذج. لذلك، عند إيقاف تشغيل وظيفة التحقق من JavaScript من جانب العميل، ستعود وظيفة التحقق تلقائيًا إلى القيمة الحقيقية.
الشيء التالي الذي يجب إضافته هو حقل مخفي يسمى val. كما ذكرنا سابقًا، تشير هذه القيمة إلى وضع التحقق من صحة النموذج.
< INPUT TYPE="HIDDEN" NAME="val" VALUE="< %=iValType% >" >
عندما يرسل المستخدم النموذج، سيستخدم البرنامج النصي للمعالجة هذه القيمة لتحديد ما إذا كان سيتم إجراء التحقق من جانب الخادم.
ثم الإخراج هو علامة الجدول وعنوان الجدول. يتم حفظ العنوان في المتغير sTitleLabel، والذي تتم تهيئة قيمته عندما يبدأ تنفيذ البرنامج النصي:
إليك مقتطف الاقتباس:
< حدود الجدول = "0" >
<TR>
< TD COLSPAN = "2" محاذاة = "المركز" >
< H2 >< %=sTitleLable% >< /H2 >
< /تد>
< /تر>
كإجراء تحسين، يمكن إضافة حقل FormID إلى تعريفات الجداول والقوائم والسجلات. يقوم FormID بتعريف النموذج بشكل فريد، بحيث يمكن للبرنامج تعريف نماذج متعددة في نفس الوقت وحفظ نتائج استجابة المستخدم لنماذج متعددة. أما بالنسبة لـ sTitleLabel أعلاه، فيمكننا استخدام جدول آخر (مثل النماذج) لحفظه.
بعد علامة الجدول وعنوان الجدول، يقوم البرنامج بإخراج نموذج HTML ورمز زري "إرسال" و"مسح". بعد ذلك، يتحقق البرنامج مما إذا كانت سلسلة sHTML تحتوي على "*". إذا كان الأمر كذلك، فهذا يعني أن هناك محتوى يجب إدخاله في النموذج. في هذا الوقت، يتم إخراج حاشية سفلية لشرح معنى العلامة النجمية.
هنا اقتباس:
< %=sHTML% >
<TR>
< TD COLSPAN = "2" محاذاة = "المركز" >
< نوع الإدخال = "إرسال" VALUE = "إرسال النموذج" > < نوع الإدخال = "إعادة تعيين" VALUE = "مسح" >
< /تد>
<%
'ما إذا كان هناك حقل نموذج يتطلب إدخالاً، إذا كان الأمر كذلك، فأخرج حاشية النموذج لشرح معنى '*'
إذا كان InStr(sHTML،"*") ثم
%>
< /تر>
< TD COLSPAN = "2" محاذاة = "المركز" >
< FONT SIZE="2" >ملاحظة: القيم التي تحمل علامة النجمة مطلوبة. < /الخط>
< /تد>
< /تر>
<%
نهاية إذا
%>
< /الجدول>
</ / النموذج >
حتى الآن، تم إكمال مهمة إنشاء النموذج.
4. معالجة نتائج الإرسال
تتمثل المهام المتبقية لبرنامج ASP النصي في معالجة النماذج من جانب الخادم، بما في ذلك التحقق من الصحة وحفظ النتائج في قاعدة البيانات وعرض صفحة "نجاح/فشل الإرسال". يتم استخدام متغير السلسلة sBadForm في هذا الجزء من رمز التحقق من صحة النموذج، ويستخدمه البرنامج لحفظ معلومات الخطأ. إذا كان sBadForm فارغًا في نهاية عملية التحقق، فهذا يعني أن النموذج المقدم من قبل المستخدم قانوني؛ وإلا فسيتم رفض إرسال النموذج وإرجاع sBadForm إلى المتصفح.
بغض النظر عن وضع التحقق من الصحة الذي يستخدمه النموذج الخاص بك، فمن الممارسات الجيدة التحقق من وجود HTTP_REFERER. يمنع هذا الفحص سرقة البرنامج النصي. للتحقق مما إذا كان منشور معين يأتي من صفحة أو برنامج نصي من هذا الموقع، ما عليك سوى مقارنة متغيرين للخادم:
إليك مقتطف الاقتباس:
إذا كان InStr(Request.ServerVariables("HTTP_REFERER")، _
Request.ServerVariables("HTTP_HOST")) = 0 إذن
sBadForm = "<LI>تم إرسال النموذج من موقع غير صحيح."
نهاية إذا
إذا كان الحقل المخفي للنموذج يشير إلى أنه يجب إجراء التحقق من جانب الخادم، فسيقوم البرنامج باجتياز سجلات قاعدة بيانات تعريف النموذج وإجراء عمليات التحقق المقابلة، تشبه العملية إلى حد كبير عملية إنشاء النموذج، باستثناء أن البرنامج يتحقق هذه المرة النموذج ويضيف معلومات قيمة الإدخال غير القانونية إلى ما عليك سوى الانتقال إلى sBadForm. راجع dForm.asp للحصول على تعليمات برمجية محددة.
يتحقق البرنامج أخيرًا مما إذا كان sBadForm فارغًا. إذا لم يكن فارغًا، فسيتم رفض إرسال النموذج وتتم كتابة sBadForm في المتصفح. إذا كان sBadForm فارغًا، أضف سجلاً إلى جدول السجلات لحفظ بيانات النموذج. يجب حذف قيمة الحقل المخفي قبل حفظ محتوى النموذج. هذا الحقل المخفي هو دائمًا حقل الإدخال الأول للنموذج:
ما يلي هو جزء الاقتباس:
إذا كان Len(sBadForm) = 0 إذن
RS.فتح "السجلات"، DB، 3، 2، &H0002
RS.AddNew
RS.Fields("Record") = Mid(Request.Form, InStr(Request.Form, "&") + 1)
RS.Fields("تم الإنشاء") = الآن()
RS.Fields("RemoteIP") = Request.ServerVariables("REMOTE_ADDR")
تحديث RS
Response.Write("< H1 >شكرًا لك.< /H1 >")
RS.إغلاق
آخر
Response.Write("< H1 >فشل إرسال النموذج. < /H1 >")
الاستجابة.الكتابة (vbCrLf وsBadForm)
نهاية إذا
نهاية إذا
هذا كل شيء بالنسبة لمعالجة النماذج من جانب الخادم. اعتمادًا على ما إذا كان هناك نموذج مُرسل، يمكننا تغليف كود إنشاء النموذج السابق ورمز معالجة النموذج هنا بعبارة If، بحيث يتشارك جزأا البرنامج النصي في بعض التعليمات البرمجية الشائعة، مثل رأس مستند HTML، إنشاء كائنات قاعدة البيانات والإفراج عن الموارد الانتظار.
بشكل عام، يحتوي dForm.asp فقط على الوظائف الأساسية اللازمة لإنشاء النماذج الديناميكية والتحقق منها، ويتجاهل معالجة العديد من المشكلات التفصيلية. على سبيل المثال، مشكلة النماذج المتعددة المذكورة سابقًا: إضافة جدول لإدارة نماذج متعددة يمكّن البرنامج النصي من القدرة على إدارة النماذج المحددة وإنشائها ومعالجتها. هناك نقص صارخ آخر وهو القدرة على إضافة البيانات المحددة بالنموذج وحذفها وتحديثها، بالإضافة إلى الوصول إلى بيانات النتائج المقدمة من المستخدم. ويمكن تنفيذ هذه الوظيفة في برنامج مستقل، وفي معظم الحالات يمكن تحويلها إلى برنامج التطبيق التقليدي (التطبيقات بدون بنية B/S). وأخيرًا، فإن أنواع حقول الإدخال التي يدعمها dForm.asp محدودة أيضًا في الممارسة العملية، وقد تكون هناك متطلبات أخرى لإدخال النموذج، مثل مربع إدخال عنوان بريد إلكتروني مخصص. ومع ذلك، بالنسبة لمواقع الويب التي تقوم بتحديث النماذج بشكل متكرر، فإن إنشاء النماذج الديناميكية ووظائف التحقق الديناميكي التي تمت مناقشتها في هذه المقالة مفيدة جدًا بالفعل.