منتدى بملف ASP واحد فقط!

الكاتب : الأنيق   المشاهدات : 582   الردود : 4    ‏2003-08-03
      مشاركة رقم : 1    ‏2003-08-03
  1. الأنيق

    الأنيق عضو

    التسجيل :
    ‏2003-07-11
    المشاركات:
    34
    الإعجاب :
    0
    [ALIGN=JUSTIFY]الكل يحلم بان يملك منتدى خاص به يزيد من شعبية موقعه، وظاهرة انتشار المنتديات العربية تؤكد مدى اقبال مستخدمي الانترنت العرب عليها، فقلما تجد موقع عربي كبير لا يخلو من منتدى خاص به او متنوع المجالات. في السطور التالية سأعرض لك الفكرة الاساسية من تصميم المنتديات باستخدام صفحاتك المفضلة ASP، ولن يكلفك الامر سوى صفحة باسم Forum.ASP واحدة فقط.



    من الاشياء العجيبة جدا والتي لاحظتها في المنتديات العربية، ان 90% من هذه المنتديات تستخدم نفس اكواد المنتديات المصممة بـ PHP من نفس الشركة مع اجراء بعض التعديلات البسيطة في المظهر الخارجي او تعريب الواجهة، وحتى هذه اللحظة لم اجد اي منتدى عربي من تصميم شخص معين حيث يبدأ من الصفر لكتابة اكواده، رغم انني لا ارى ان عملية تصميم المنتديات امر صعب ومعقد لذلك الحد الذي يضطرنا لاستخدام نفس اكواد المنتدى من نفس الشركة. واذا سألتني لماذا يا سيد تركي لا تصمم منتدى ما دمت تعلق على الغير؟ فاجابتي له ستكون قريبة جدا باذن الله، وحتى ذلك الحين سأعطيك الفكرة الاساسية من تصميم المنتديات عسى ان تنفعك لتصمم بها منتدى متكامل قبلي.

    الذي سنقوم بفعله في الحقيقة هو منتدى بسيط جدا جدا يمكننا من اضافة مواضيع وردود الى تلك المواضيع، ما ينقصه شئ واحد تقريبا وهو انشاء جدول خاص للاعضاء بحيث يكون لكل عضو اسم دخول وكلمة مرور كما هو الحال مع سجل اعضاء شبكة المطورون العرب، الا انني تجاهلت جدول العضوية حتى تسهل عليك فكرة المنتديات وتبقى عملية التطوير عليك. ففي منتدانا البسيط يمكن لاي شخص كتابة اسم واضافة موضوع او رد جديد، اي هو اشبه بسجل زوار تقليدي.

    تجهيز قاعدة البيانات
    يوجد ما يقارب 89475903 طريقة وتصميم لقاعدة البيانات، والذي قد يشمل عدة جداول متفرقة تربطها علاقات Relationships او جداول مستقلة لا تربطها علاقات. اما منتدانا البسيط فلا يحتاج الا لجدول واحد فقط، تعمدت ان اجعله بسيط جدا حتى تسهل عليك عملية استيعابه. اسم قاعدة البيانات هو Forum وتحتوي على جدول واحد هو Forum1 الذي يتكون من 6 حقول هي:
    ID وهو يمثل رقم المعرف للسجل بحيث يكون عدد لا يتكرر Unduplicated AutoNumber.
    Date يمثل وقت وتاريخ السجل.
    Title عنوان افتراضي للسجل.
    Writer اسم الكاتب.
    TopicID معرف الموضوع الذي سترتبط به الردود التابعة لنفس الموضوع.
    Text وهذا حقل حرفي طويل -من النوع Memo- حيث يمثل النص الذي يكتبه المستخدم.

    بامكانك استخدام اي نوع من قواعد البيانات SQL Server، ORACLE ... الخ شريطة ان يكون مزود OLEDB Provider مدعوم في الخادم Server حتى يمكننا الاتصال به عن طريق ADO، في منتدانا البسيط استخدمت قاعدة بيانات MS-ACCESS 2000 فهي مناسبة جدا له، واذا استخدمت قاعدة بيانات اخرى فكل ما يلزمك تغيير نص الاتصال ConnectionString عند فتح قاعدة البيانات بالكائن ADODB.Connection. الكود التالي يعرض نص الاتصال الخاص بقاعدة بيانات Access 2000:



    ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\FORUM.MDB"
    set cn = CreateObject("ADODB.Connection")
    cn.Open ConnString




    انشاء الملف Forum.ASP
    كما ذكرت في مقدمة المقالة، منتدانا البسيط لن يكلفك اكثر من صفحة ASP واحدة فقط، بحيث تعرض جميع المواضيع، جميع الردود التابعة لموضوع معين، اضافة موضوع جديد او اضافة رد جديد. انشئ ملف باسم Forum.ASP واكتب به هذا الكود:



    <html dir="rtl">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
    <meta http-equiv="Content-Language" content="ar-sa">
    <title>المنتدى البسيط</title>
    </head>

    <body>

    <% ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\FORUM.MDB"
    If Request.QueryString ("AddTopic") = 1 Then
    AddTopic
    ElseIf Request.QueryString ("TopicID") > 0 Then
    If Request.QueryString ("AddReplay") = 1 Then
    AddReplay CInt (Request.QueryString ("TopicID"))
    Else
    ShowTopic CInt (Request.QueryString ("TopicID"))
    End If
    Else
    ShowAllTopics
    End If

    Sub ShowAllTopics()

    End Sub

    Sub ShowTopic( iTopicID )

    End Sub

    Sub AddTopic()

    End Sub

    Sub AddReplay (iTopicID)

    End Sub%>
    </body>
    </html>




    في بداية ملف Forum.ASP وضعت عدة جمل شرطية متداخلية تختبر نوعية الصفحة التي ريدها المستخدم، ومن ثم يتم استعداء الاجراءات ShowAllTopics، ShowTopic، AddTopic و AddReplay المناسبة. والان دعنا نبدأ في عملية كتابة الاجراءات الاربع:

    ShowAllTopic
    وهو اول اجراء من اجراءات منتدانا البسيط حيث سيعرض جميع المواضيع الموجودة في قاعدة البيانات. في جملة الاستعلام حدد جميع السجلات التي تكون قيمة حقل TopicID فيها يساوي صفر، لاننا نريد عرض المواضيع فقط دون الردود، فلا تنسى ان الجدول يشمل المواضيع والردود، حيث تكون قيمة الحقل TopicID التابع لسجل الرد هي نفس قيمة الموضوع الذي سيعرض فيه الرد، واذا كانت قيمة الحق TopicID تساوي 0 فيعني انه موضوع سيظهر في صفحة المواضيع -اي الرد الرئيسي.
    سنحدد في جملة الاستعلام جميع الحقول باستثناء الحقل الاخير Text لاننا لن نعرض الا عنوان الموضوع، كاتبه وتاريخه فقط، وبالنسبة لعملية الفرز Sorting ستكون تنازلية حتى تظهر المواضيع الجديدة فوق القديمة في الجدول، لنخرج جملة استعلامية كـ:



    SELECT [ID], [Date], [Title], [Writer] FROM [Forum1] WHERE [TopicID] = 0 ORDER BY [Date] Desc



    بعد ذلك تبدأ في الحلقة التكرارية Do...Loop المألوفة والتي تنتهي حتى نهاية جميع السجلات ومن ثم تكتب قيم الحقول على المتصفح، ولا تنسى استخدام الاجراء Server.HTMLEncode حتى تظهر الرموز ><& ... الخ بشكل صحيح:



    <%Do While NOT rs.EOF
    ...
    Response.Write Server.HTMLEncode ( rs ("Title") )
    ...
    rs.MoveNext
    Loop%>



    ليكون الكود النهائي للاجراء ShowAllTopic بهذا الشكل:



    Sub ShowAllTopics()
    set rs = CreateObject("ADODB.Recordset")
    set cn = CreateObject("ADODB.Connection")
    cn.Open ConnString

    Set rs = cn.Execute ( "SELECT [ID], [Date], [Title], [Writer] FROM [Forum1]" _
    & "WHERE [TopicID] = 0 ORDER BY [Date] Desc" )%>

    <p ><b><font size="6">المنتدى البسيط</font>
    </b><br><br></p>
    <table border="1" cellpadding="0" cellspacing="0"
    bordercolor="#111111" width="90%">
    <tr>
    <td>العنوان</td>
    <td>الكاتب</td>
    <td>الوقت والتاريخ</td>
    </tr>
    <% Do While NOT rs.EOF
    Response.Write "<tr>"
    Response.Write "<td>&nbsp;<a href=""forum.asp?TopicID=" & rs ("ID") & """>" _
    & Server.HTMLEncode (rs ("Title")) & "</a> </td>"
    Response.Write "<td>&nbsp;" _
    & Server.HTMLEncode (rs ("Writer")) & "</td>"
    Response.Write "<td>&nbsp;" _
    & rs ("Date") & "</td>"
    Response.Write "</tr>"
    rs.MoveNext
    Loop%>
    </table>
    <p ><a href="forum.asp?AddTopic=1">اضف موضوع جديد</a></p>
    <%rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
    End Sub




    ShowTopic
    هذا الاجراء سيعرض الموضوع وجميع الردود التابعة له، الطريقة التي اتبعتها في جملة الاستعلام هي تحديد جميع السجلات التي تكون قيمة الحقل TopicID نفس قيمة معرف ID الموضوع، وبالنسبة للفرز Sorting ستكون تصاعدية حيث تكون الردود الاقدم فوق الردود الاحدث:



    SELECT * FROM [Forum1] WHERE [TopicID] = " & iTopicID & " ORDER BY [Date]



    من الضروري التوضيح هنا بالنسبة للحقول من نوع Memo، فلا يكفي استخدام Server.HTMLEncode حتى تظهر بشكل صحيح، فهيئة HTML لا تعتبر الحرف ENTER سطر جديد، لذلك ستظهر لك جميع محتويات الموضوع في سطر واحد، بامكانك الالتفاف حول هذه المشكلة البسيطة بتحويل جميع حروف السطر الجديد NewLine الى كود HTML والذي يعرف بـ <BR> باستخدام الدالة Replace:



    Response.Write Replace(Server.HTMLEncode ( rs ("Text")), chr(13), "<BR>")




    AddTopic
    وهذا الاجراء الخاص باضافة موضوع جديد. عند فتح قاعدة البيانات باستخدام الكائن ADODB.Recordset عليك ارسال القيمة 2 مع الـ Argument الرابع حتى تتمكن من الكتابة على قاعدة البيانات واضافة سجل جديد، تفاصيل كائن ADODB.Recordset خارج موضوع المقالة، لذلك سأكتفي بعرض كود الاجراء AddTopic:



    Sub AddTopic()
    If Request.Form ("cmdAdd") = "اضافة" Then
    set cn = CreateObject("ADODB.Connection")
    set rs = CreateObject("ADODB.Recordset")
    cn.Open ConnString
    rs.Open "[Forum1]", cn, , 2
    rs.AddNew
    rs ("Date") = NOW
    rs ("TopicID") = 0
    rs ("Writer") = Request.Form ("txtWriter")
    rs ("Title") = Request.Form ("txtTitle")
    rs ("Text") = Request.Form ("txtText")
    rs.Update
    rs.Close
    cn.Close
    Set cn = Nothing
    Set rs = Nothing
    Response.Redirect "forum.asp"
    Else%>
    <form method="POST" action="forum.asp?AddTopic=1">
    <p>الكاتب:<br>
    <input type="Text" name="txtWriter" size="20"></p>
    <p>العنوان:<br>
    <input type="Text" name="txtTitle" size="20"></p>
    <p>النص:<br>
    <textarea rows="10" name="txtText" cols="50"></textarea></p>
    <p><input type="Submit" value="اضافة" name="cmdAdd" size="20"></p>
    </form>
    <% End If
    End Sub




    AddReplay
    هذا الاجراء هو مشابه الى حد كبير الاجراء السابق AddTopic ولكنه خاص لاضافة الردود الى المواضيع، فنقطة الاختلاف ستكون عند تحديد قيمة الحق TopicID بحيث تساوي قيمة الحقل ID التابع للموضوع:



    rs ("TopicID") = iTopicID



    نقطة اخرى وهي تحديث قيمة الحقل Date التابعة لسجل الموضوع الرئيسي حتى يتم عرض الموضوع فوق جميع المواضيع في الاجراء ShowAllTopic الخاص بعرض جميع المواضيع:



    rs.Open "SELECT [Date] FROM [Forum1] WHERE [ID] = " & iTopicID, cn, , 2
    rs ("Date") = NOW




    خاتمة
    هذه باختصار طريقة المبدأ والفكرة الاساسية من عمل المنتديات، الطبخة كلها ببساطة في تحديد البيانات التي تريد عرضها وفقا لقانونك الخاص. تذكر انني لم استخدم جدول خاص بالاعضاء لتحديد صلاحيات خاصة للمشرفين والاعضاء المشاركين -حيث يكون لكل عضو اسم دخول وكلمة مرور- ففي منتدانا البسيط يستطيع اي شخص كتابة موضوع ورد باي اسم يريده.
     
  2.   مشاركة رقم : 2    ‏2003-08-03
  3. مُجَاهِد

    مُجَاهِد قلم ماسي

    التسجيل :
    ‏2003-05-11
    المشاركات:
    14,043
    الإعجاب :
    0
    رائع :: أخي الأنيق..
     
  4.   مشاركة رقم : 3    ‏2003-08-05
  5. DEDO

    DEDO عضو متميّز

    التسجيل :
    ‏2003-03-24
    المشاركات:
    1,553
    الإعجاب :
    0
    أيش هذا النقل الرائع .... حتى نسيت تمسح اسم الاستاذ تركي العسيري....
     
  6.   مشاركة رقم : 4    ‏2003-08-05
  7. Super Linx

    Super Linx عضو متميّز

    التسجيل :
    ‏2003-02-24
    المشاركات:
    1,880
    الإعجاب :
    0
    أيش هذا النقل الرائع .... حتى نسيت تمسح اسم الاستاذ تركي العسيري....
     
  8.   مشاركة رقم : 5    ‏2003-08-05
  9. ابن الاصول

    ابن الاصول قلم فضي

    التسجيل :
    ‏2003-07-21
    المشاركات:
    2,607
    الإعجاب :
    0
    [TABLE=width:70%;background-color:transparent;background-image:url(backgrounds/2.gif);][CELL=filter: dropshadow(color=gray,offx=4,offy=4);][ALIGN=center]تسلم اخي موضوع ممتاز
    اشكرك وتقبل فائق احترامي وتقديري
    [/CELL][/TABLE]
    [​IMG]
     

مشاركة هذه الصفحة