لا يسمح موقعنا حالياً للزوار بالتفاعل معه. غير ان هذا النوع من المواقع مناسب تماماً للمنتديات المفتوحة للزوار:
اولاً لأن هذا النوع من المواضيع يحفز الزوار على إبداء رأيهم، فمن المعروف ان منتديات العاب الفيديو تكون جد نشطة.
لأنه عنصر ضروري لمحتوى الموقع: فمن المستحيل توقع كل الاسئلة المتعلقة بلعبة ما سلفاً (نصائح حول كيفية اللعب، ارشادات في حال التعثر، كفية اعداد بطاقة العرض في الجهاز...). فالمنتديات هي مجال حيوي لهذا النوع من الاسئلة والاجوبة.
قبل ادخال المنتديات في الموقع، يجب تحديد كيفية ادخالها ومكان وضعها.
السؤال الاول: اين؟
عودتنا الصفحات النموذجية القياسية التي تأتي مع SPIP بأن نضع المنتديات مباشرة تحت كل مقال. الا ان في موقعنا، تختلف البنية التحريرية كلياً: فكل المقالات المتعلقة بلعبة ما تجتمع في قسم واحد. يمكننا بالطبع وضع المنتديات تحت كل مقال ولكن لا تبدو هذه الفكرة فعالة: فالارجح ان الزائر يودّ مناقشة اللعبة «بشكل عام» بدلاً من التعليق على مقال معين.
نقرر (وهذا ايضاً قرار تحريري اعتباطي) ان المنتديات لن تتعلق بكل مقال (اي كل اختبار او كل استعراض...) بل باللعبة ككل. بمعنى آخر سيكون هناك منتدى لقسم اللعبة. ونضع في كل مقال وصلة الى صفحة مشتركة تعرض منتدى القسم.
السؤال الثاني: كيف؟
من المهم الاعتناء بواجهة المنتدى: فهل يجب عرض كل شيء مرة واحدة (وهذا حل عملي) والا عرض اولاً لائحة بعناوين المشاركات ثم صفحة مخصصة لكل مشاركة.
في موقع مخصص لألعاب الفيديو يمكننا ان نتوقع منتديات نشطة للغاية تحتوي على الكثير من المشاركات ومنها ما هو طويل جداً (فلا شك ان بعض الزوار سوف ينشر تعليق كامل حول لعبة ما او حل طويل لا ينتهي...). من المستحيل اذن نشر كل محتويات المشاركات على صفحة واحدة.
نقرر اذن عرض لائحة بعناوين المشاركات فقط ثم ننشئ صفحة ثانية تعرض كل مشاركة.
الصفحة forum_game.php3
سيكون اسم الصفحة التي تعرض لائحة كاملة بالمشاركات «forum_game.php3». ويتم نداء هذه الصفحة برفقة رقم قسم (لأن القسم هو الذي يحتوي كل مقالات لعبة معينة).
لنبدأ بإدخال وصلة الى هذه الصفحة في نظام التصفح في موقعنا.
ففي صفحة «article.html»، نضيف الوصلة الى منتدى اللعبة (بعد عرض الحواشي NOTES# مثلاً) على الشكل التالي:
لنكتفي حالياً بهذه الوصلة. فمن اجل تصميم عرض اكثر اكتمالاً (عرض عدد المشاركات مثلاً) يجب علينا كتابة بضع مشاركات لاختبار الواجهة. وفي الوقت الحالي، هذه المنتديات فارغة كلياً.
لنقوم بإنشاء الصفحة النموذجية للمنديات، ونبدأ، كالعادة، بملف النداء «forum_game.php3»:
الصفحة النموذجية forum_game.html
نبدأ بملف «forum_game.html» بسيط جداً:
هذه الصفحة تعرض:
وصلة عودة الى صفحة الموقع الرئيسية
البنية الهرمية التي تصل الى اللعبة الحالية
عنوان اللعبة
بفضل حلقة BOUCLE_main، نحن نوجد فعلاً في القسم المعني باللعبة.
في الوقت الحاضر، لا يزال المنتدى يفتقر الى المشاركات. وقبل انشاء العرض المخطط له (اي عرض لائحة عناوين المشاركات فقط)، يجب انشاء واجهة تتيح ارسال مشاركة الى المنتدى. وبفضل هذه الواجهة يمكننا «تغذية» المنتدى بالمشاركات ثم انشاء واجهة هذه المشاركات.
لنقم بإدخال الوصلة التي ستتيح لنا ارسال مشاركتنا الاولى:
بطريقة آلية، سيحدد متغير PARAMETRES_FORUM# ان الامر يتعلق بمشاركة مرتبطة بقسم معين لأن حلقة BOUCLE_main هي فعلاً من النوع (RUBRIQUES).
نعرض هنا عناوين هذه المشاركات الاولى:
نضيف امكان الرد على المشاركات:
هكذا، يمكننا الرد على مشاركات المستوى «الاول» (المعروفة بالخيوط - threads - اي المشاركات التي تطلق نقاشاً جديداً) ولكننا لا نعرضها.
لنعرض الردود:
هكذا نعرض الردود على الخيوط. ومن الممكن الرد على هذه الردود ولكن دون عرض. لعرض هذه الردود الاخيرة، سوف نضيف حلقة تكرارية (recursive)، بمعنى ان تنداى حلقة BOUCLE_replies نفسها مما يتيح لنا عرض مجمل الردود دفعة واحدة.
سنعدل حلقة BOUCLE_replies كالتالي:
لقد اضفنا داخل حلقة BOUCLE_replies حلقة BOUCLE_rep_messages التي تنادي حلقة BOUCLE_replies. ويتيح ذلك عرض الردود على مشاركات حلقة BOUCLE_replies بشكل متكرر (اي يتم تنفيذ هذه الحلقة الى ان تنتهي كل الردود).
الى هنا، يجب علينا التوقف قليلاً لمتطلبات التطوير، والبدء بإنشاء بعض المشاركات في احد المنتديات. والافضل انشاء عدة خيوط نقاش (threads) وردود عليها وردود على الردود بحيث نحاكي منتدىً حقيقياً. وسيتيح لنا ذلك انشاء واجهتنا التخطيطية بشكل اكثر منطقية.
لنعيد الكرة...
بعد هذه المرحلة، حيث قمنا بتغذية المنتدى بالعديد من المشاركات، سنعود الى تصميم صفحتنا بالاعتماد على ما قررناه في البداية: لن تعرض الصفحة «forum_game» الا عناوين المشاركات وتقوم صفحة اخرى بعرض المشاركات نفسها.
وبما ان حلقاتنا السابقة لا تعرض معلومات، لن تكون التعديلات التي سنتدخلها كبيرة:
يجب عرض العنوان TITRE# كوصلة هايبرتكست نحو صفحة المشاركة المعنية (قررنا استخدام صفحة اسمها «message.php3» من اجل ذلك).
يجب عرض اسم كاتب المشاركة NOM# وتاريخ ارسالها DATE#.
يجب حذف عبارة «الرد على هذه المشاركة».
نستغنم الفرصة لتغيير الواجهة التخطيطية ايضاً. ان علامتي <ul> و<li> تكفيان لعرض البنية المنطقية ولكن لا تتمتعان بميزات جمالية. سنقوم باستبدالهما ببعض اوراق الانماط البسيطة.
اخيراً تصبح فقرتنا البرمجية:
ملاحظة حول الانماط: لقد ادرجنا هنا الانماط مباشرة في العلامة <div>. وقد تفضل تجميعها كلها في ورقة انماط توضع في اول الملف. الا انه خلال تصميم الصفحة يصبح تعديل هذه الانماط مباشرة حيث توجد المعلومات اكثر عملية. من جهة اخرى يتسبب استخدام الانماط في مشاكل توافق مع المتصفح نتسكيب في اصدار 4.7: فهذا الاصدار لا يستخدم كل الانماط اضافة الى ان بعض الانماط تتسبب بأخطاء في ادائه. وفي مثلنا اعلاه، استخدمنا انماطاً لا تتسبب بهذه الاخطاء.
انتهت صفحة عرض كل مشاركات المنتدى. في موقع حقيقي، يكون من المفيد ايضاً عرض وصلات الى مقالات القسم (الاختبارات والاستعراضات،،،) كما فعلنا في صفحات اخرى. ونترك هذه المهمة للقارئ.
عرض كل مشاركة: message.php3 وmessage.html
يجب الآن ان نعرض نص كل مشاركة مع امكان الرد عليها. وبما اننا انشأنا الوصلات في الصفحة السابقة، نعرف اننا بحاجة الى زوج من الملفات: «message.php3» و«message.html» اللذان يتم نداؤهما بواسطة رقم «id_forum» (وهو رقم كل مشاركة في المنتدى).
الملف «message.php3»:
والملف «message.html» الذي يحتوي على الصفحة النموذجية:
هذه النسخة الاولى من الصفحة تعرض:
عنوان الصفحة (داخل <title>...</title>)
وصلة الى صفحة الموقع الرئيسية
عنوان المشاركة ونصها ومؤلفها وموقعه
لم نفعل شيئاً بعد في ما يتعلق بالتصفح داخل الموقع من هذه الصفحة. سنعرض اسم اللعبة المعنية بهذه المشاركة. في حلقة BOUCLE_main ومباشرة قبل عنوان المشاركة TITRE#، نضيف تذكيراً بإسم اللعبة (مع وصلة الى قسم اللعبة) ووصلة الى الصفحة التي تعرض كل المشاركات:
نضيف حلقة BOUCLE_hierarchy المعروفة والتي تتيح عرض هرمية اصناف الالعاب:
نرغب الآن في عرض هرمية المشاركات التي تؤدي الى المشاركة الحالية (واذا كانت المشاركة الحالية رداً على مشاركة اخرى، نريد عرض الوصلة الى هذه الاخيرة قبل عنوان المشاركة الحالية TITRE#):
ملاحظة: تم ادخال المعيار {id_enfant} المطبق على حلقة (FORUMS) في الاصدار 1.3 من SPIP> ويتيح هذا المعيار نداء المشاركة التي ترد عليها المشاركة الحالية. (هناك معيار مشابه لحلقات (RUBRIQUES) ونستخدمه في «article.html» للعودة «درجة واحدة» الى الوراء في هرمية الاقسام.)
نعرض هنا المشاركة التي ترد عليها مشاركة حلقة BOUCLE_main. ولكن هذا لا يكفي اذ نريد عرض كل سلسلة المشاركات حتى نصل الى مشاركتنا الحالية (فإذا كانت المشاركة التي عرضتها حلقة BOUCLE_parents هي نفسها رداً، نريد الصعود خطوة واحدة وهكذا دواليك حتى الوصول الى المشاركة الاولى في الخيط).
يكفي من اجل ذلك استخدام حلقة تكرارية كما فعلنا مع حلقة BOUCLE_replies في صفحة «forum_game.html». ولكننا هنا نعكس المنطق لأننا نريد «صعود» هرمية المشاركة وليس «نزولها». ومن اجل تماسك العرض، نضع نداء الحلقة التكرارية «قبل» عرض عنوان المشاركة TITRE# (اذ يجب ان تظهر المشاركات السلفية - parents - قبل عنوان مشاركتنا الحالية):
تكفي هذه الحلقة لعرض التصفح والبنية المنطقية داخل المشاركات. الا انه من الناحية الجمالية، هذا الوضع لا يرضينا. والحال انه للتشديد على ان ما هو ظاهر هو تسلسل ردود متتالية يجب علينا ادخال الازاحة البسيطة الى اليسار عند كل رد (كما في الصفحة «forum_game.html»).
سنستخدم اذن نمط يؤدي، لدى كل نداء للحلقة التكرارية، الى ازاحة الرد 15 نقطة الى اليسار. ونستغنم الفرصة لعرض عنوان المشاركة TITRE# بالنمط نفسه المعروض به في صفحة «forum_game.html» (اي مع اطار الى يمينه وتحته):
اصبح العرض اكثر تماسكاً بفضل الازاحة الى اليمين والاطارات ولكن لا يزال غير ممتاز: فهذه الازاحة تدخل في الهامش الايمن من الصفحة لأننا نزيح الى اليمين دون ان نكون قد ازحنا كامل الصفحة الى اليسار قبل ذلك (اذا اخذنا في الاعتبار قيمة معينة للهامش، يمكن اعتبار ان الهامش الايمن اصبح «سالباً»: ففي البداية تكون قيمة الهامش صفر ثم -15 ثم -30 ...).
يجب اذن ازاحة كل شيء الى اليسار. ولا يمكننا تنفيذ ذلك من داخل حلقة BOUCLE_parents لأننا هكذا ولدى كل تكرار للحلقة، نكون قد ازحنا مرة الى اليمين ومرة الى اليسار مباشرة فتلغي الازاحتان بعضهما.
سننشئ اذاً حلقة جديدة قبل حلقة عرض السلف (parents) تهدف فقط الى عرض علامات <div> تتسبب بإزاحة العرض الى اليسار.
ستتم ازاحة كامل الصفحة الى اليسار (فإذا كان هناك ثلاث مشاركات قبل الوصول الى المشاركة الاساسية، ستتم ازاحة الكل بمقدار 45 نقطة الى اليسار). ستبدأ اذن المشاركات السلفية من هذه القيمة لتنتقل الى اليمين: فتتم ازاحة اول مشاركة سلفية نحو اليمين بمقدار هامش شامل قيمته 30 نقطة الى اليسار (اي 45 - 15)، اما الثانية فستكون عند النقطة 15 والاولى عند النقطة صفر.
ويصبح برنامجنا:
الحلقة BOUCLE_shift_left هي ايضاً حلقة تكرارية تشبه الحلقة التي تعرض المشاركات السلفية. اما الفرق هنا فيكمن في محتواها: فلدى كل مشاركة سلفية وبدلاً من عرض عنوان المشاركة، نعرض فقط علامة <div> التي تتسبب بالازاحة الى اليسار.
بما اننا ادخلنا ازاحة الى اليسار، يجب بعدها تنفيذ العملية العكسية بإغلاق علامات <div...>. ويتم ذلك بواسطة الحلقة نفسها التي تحتوي الآن علامات الاغلاق </div>. لكن اين نضع هذه الحلقة؟ من المنطقي عرض نص المشاركة الرئيسية مع ازاحة الى اليسار: سيظهر هكذا بوضوح بأنه رد على آخر مشاركة تعرضها حلقة BOUCLE_parents.
اذن سنضع الفقرة التالية مباشرة بعد نص المشاركة الرئيسية TEXTE#:
نريد الآن عرض الردود على المشاركة الرئيسية. بهذه الطريقة لا نكتفي بـ«صعود» الهرمية (بواسطة حلقة BOUCLE_parents) ولكن «نزولها» ايضاً.
يكفينا من اجل ذلك، ان ننسخ حلقة BOUCLE_replies المكررة الموجودة في صفحة «forum_game.html». وندرج هذه الحلقة مباشرة بعد نص المشاركة الرئيسية TEXTE# وقبل الازاحة الى اليمين (من المنطقي ان تكون هذه الردود مزاحة الى يسار المشاركة الرئيسية):
اخيراً يبقى ان نعرض الردود الموجودة في «مستوى المشاركة الرئيسية نفسه» في الهرمية (بمعنى آخر، اذا كانت المشاركة الرئيسية رداً على مشاركة اخرى، نريد عرض الردود الاخرى على هذه المشاركة).
لنعرض كل الردود الاخرى بإدراج الاوامر التالية مباشرة قبل عنوان المشاركة الرئيسية TITRE#:
بفضل الازاحة التي اضفناها سابقاً، يصبح العرض جميلاً جداً...
لنحسّن الآن صفحتنا: سوف نعرض فوق المشاركة الرئيسية المشاركات التي تم ارسالها قبل هذه المشاركة فقط. من اجل ذلك نضيف معياراً الى حلقة BOUCLE_level:
معيار العمر النسبي {age_relatif} (الذي ظهر في SPIP 1.3) يشبه المعيار المعروف {age}. لكن، بينما يقوم {age} بمقارنة تاريخ العنصر (مقال او مشاركة منتدى الخ.) بالتاريخ الحالي (اي اليوم)، يقارن {age_relatif} بين تاريخ العنصر بتاريخ العنصر الحالي: في مثالنا، بما اننا في الحلقة BOUCLE_main التي تعرض المشاركة الرئيسية، نختار المشاركات الاخرى بمقارنة تاريخها بتاريخ المشاركة الرئيسية. بالتالي، باستخدام المعيار {age_relatif>0}، نسترجع فقط المشاركات الاقدم من المشاركة الرئيسية.
وبالمنطق نفسه ندخل حلقة عمر نسبي معكوس بعد مشاركات الحلقة BOUCLE_replies.
لا يبقى الا ان نعدّل قليلاً عرض المشاركة الرئيسية (نضعها ايضاً داخل اطار اسود) واضافة وصلة «الرد على هذه المشاركة»:
انتهت الصفحتان النموذجيتان اللتان تديران منتديات اللعبة. وقد يبدو كل ذلك معقداً بعض الشيء ولكن يجدر التذكير بأننا قررنا تحسين واجهة البنية. وكان يمكننا الاكتفاء بواجهة تصفح اقل اتقاناً.
الوصلات من الصفحات الاخرى
لنعود الى تبويب المنتدى بين صفحات الموقع الاخرى.
ففي الصفحة «article.html»، نعدّل الوصلة ونضيف حلقة:
لا تعرض الحلقة BOUCLE_forum اي شيء، فلا نستخدم الا النص الشرطي بعد. ويدل معيار {plat} في هذه الحلقة الى اننا نريد استرجاع كل مشاركات المنتدى (فبدون هذا المعيار لا نسترجع الا خيوط المنتدى. اما هنا فنسترجع حتى المشاركات التي تشكل ردوداً على مشاركات اخرى). بعد تنفيذ هذه الحلقة (التي لا تعرض اي شيء، يمكننا عرض العدد الاجمالي للمشاركات في النص الشرطي وذلك بفضل TOTAL_BOUCLE# اي عدد المشاركات في المنتدى.
الا ان الامور تتعقد بعض الشيء في صفحة «rubrique.html». والحال، فكما فرّقنا بين عرض اقسام التصفح (اي حسب اصناف الالعاب) وعرض اقسام الالعاب (التي تحتوي المقالات)، لن نعرض وصلة الى منتدى نقاش الا اذا كنا فعلاً في قسم لعبة. من اجل ذلك، ننشئ حلقة تدقق في وجود مقال واحد على الاقل في القسم، ولن يتم عرض وصلة المنتدى الا اذا احتوت هذه الحلقة (BOUCLE_test_game) عنصراً واحداً على الاقل. ندرج هذه الحلقة بعد حلقة BOUCLE_sites ومباشرة قبل نهاية حلقة BOUCLES_the_articles، مما يعطي:
نحذف عرض عدد المشاركات: نحن هنا داخل النص الاختياري للحلقة BOUCLE_test_game ولا يستحسن ادخال حلقة جديدة في هذا المكان (خاصة وان قيمة TOTAL_BOUCLE# ستكون تلك العائدة الى BOUCLE_test_game وليس الى عدد المشاركات في المنتدى).
بالطبع، يمكن اكمال العملية بإضافة وصلات الى المنتديات في صفحات اخرى. مثلاً، في جدول الاعلانات حول صدور الالعاب.

SPIP 1.9.2