صفحة محتويات لكل بيئة

عادة يملك محبو العاب الفيديو جهازاً واحداً اي بيئة واحدة (اثنتين للمدمنين وثلاثة لهواة التجميع...). الا ان صفحة رئيسية شاملة، وان كانت مشروعة لدى الوصول الى الموقع (يدخل الزائر عنوان URL للموقع وبالتالي لا نعرف مسبقاً اي بيئة يستخدم)، فإنها تحتوي على الكثير من المعلومات غير الضرورية لصاحب بيئة واحدة: فصاحب بيئة بلاي ستيشن 2 لا يهمه آخر لعبة ظهرت لبيئة دريم كاست.

بالتالي، يجب تقديم صفحة محتويات لكل بيئة، اي صفحة لا تعرض الا العاب تلك البيئة.

سنقوم اذاً بإنشاء صفحة نموذجية يتغير محتواها حسب البيئة. وسنطلق على ملفي هذه الصفحة اسمي «index_platform.php3» و«index_platform.html». وبما انه حسب بنية الموقع، يتم تحديد البيئة بواسطة مفتاح، سوف تعتمد هذه الصفحات على قيمة رقم المفتاح «id_mot». وسيتم نداء كل بيئة مختلفة بواسطة عنوان URL من نوع:
 index_platform.php3?id_mot=23 (و23 هو رقم مفتاح البيئة).

لنعد الى صفحتنا الرئيسية الشاملة: سندخل فيها وصلات الى صفحات المحتويات المتخصصة. ويجنبنا انشاء هذه الوصلات (بواسطة ارقام «id_mot» المناسبة) مهمة تجربة البحث عن ارقام (id_mot) كل بيئة. ندخل في «sommaire.html» الحلقة التالية:

<table cellpadding="5"><tr>
<BOUCLE_cont_plat(MOTS){type=البيئة}{par titre}>
<td><a href="index_platform.php3?id_mot=#ID_MOT">#LOGO_MOT</a></td>
</BOUCLE_cont_plat>
</tr></table>

تحذير: اذا قمت بإنشاء شعارات للحوم، لن تعمل الوصلة بشكل سليم لأن SPIP سيضيف امر جافاسكريبت. ولا تعمل الفقرة البرمجية اعلاه الا اذا كان شعار كل مفتاح مكون من ملف واحد (دون ملف للحوم).

وابسط طريقة لتجنب هذه المسألة، هي عدم استخدام #LOGO_MOT مباشرة، الامر الذي يبني كامل علامة HTML للصورة مع مقطع جافاسكريبت اذا دعت الحاجة، بل استخدام نداء الصورة التي يكون ملفها: [(#LOGO_MOT|fichier)] (مما يسترجع اسم ملف الصورة فقط ).

وتصبح الحلقة:

<table cellpadding="5"><tr>
<BOUCLE_cont_plat(MOTS){type=البيئة}{par titre}>
<td><a href="index_platform.php3?id_mot=#ID_MOT"><img src='IMG/[(#LOGO_MOT|fichier)]' border=0></a>
</td>
</BOUCLE_cont_plat>
</tr></table>

الملف «index_platform.php3»

كالعادة:

<?
$fond = "index_platform";
$delais = 24 * 3600;

include ("inc-public.php3");
?>

الصفحة النموذجية للمحتويات حسب البيئة

لا حاجة لتعقيد الامور: لنكرر ملف «sommaire.html» ونغير اسمه ليصبح «index_platform.html».

وبما ان هذه الصفحة تعتمد على رقم «id_mot»، نباشر بإضافة حلقة رئيسية BOUCLE_main سوف تحتوي على كل الحلقات الاخرى. يكفي اذاً اضافة امر هذه الحلقة مباشرة بعد علامة <body> واقفالها مباشرة قبل علامة </body> في آخر الملف:

<body>
<BOUCLE_main(MOTS){id_mot}>

     ...

</BOUCLE_main>
</body>

سنغير عنوان الصفحة الذي كان يقتصر حتى الآن على <h1>#NOM_SITE_SPIP</h1> ليعرض اسم البيئة وشعارها (اي المفتاح المناسب لرقم «id_mot»):

<h1>#NOM_SITE_SPIP / #LOGO_MOT #TITRE</h1>

لا يجب بعد الآن على حلقة BOUCLE_cont_plat، التي تعرض كل شعارات البيئات مع وصلات الى المحتويات المتخصصة، ان تحتوي شعار البيئة الرئيسية (لأننا بالفعل في صفحتها، فلا داعي لإنشاء وصلة اليها). فيكفي ادخال معيار {exclus} في امر الحلقة:

<BOUCLE_cont_plat(MOTS){type=البيئة}{exclus}{par titre}>
...
</BOUCLE_cont_plat>

اما حلقة BOUCLE_tests، التي تعرض احدث الاختبارات المنشورة، فيجب ان تعرض الاختبارات العائدة لألعاب البيئة المحددة فقط. من اجل ذلك، سنضيف داخل الحلقة حلقة BOUCLE_verif_test تقوم بالتأكد من ان كل مقال مسترجع يتعلق فعلاً بالبيئة المحددة.

ولكن هنا يدخل عيب ملحوظ: فكانت حلقة BOUCLE_tests تعرض احدث خمسة اختبارات. ولكن الآن، ومن بين هذه المقالات الخمسة نختار فقط تلك المتعلقة بالبيئة المحددة. ومن المحتمل جداً ان عدد المقالات المختارة قد يقل عن خمسة وقد لا يعرض هذا الاختيار اي مقال. علينا اذاً تعديل معيار الاختيار بحيث لا نعود نسترجع احدث خمسة مقالات ({0,5}) بل كل الاختبارات المنشورة منذ ثلاثة اشهر ({age<90}). ويمكن تغيير هذه القيمة حسب وتيرة النشاط الحقيقية في الموقع (اذا كان الموقع نشطاً جداً يمكن تقصير المدة واذا كان الموقع ينشر عدد قليل من المقالات يمكن زيادتها).

في طريقنا هذا، دعنا نحذف ايضاً الحلقة الصغيرة التي كانت تعرض شعار البيئات المناسبة: فلم يعد ذلك ضرورياً بما ان الصفحة لا تعرض الا المعلومات حول بيئة واحدة.

تصبح الحلقة:

<BOUCLE_tests(ARTICLES){titre_mot=إختبار}{par date}{inverse}{age < 90}>
<BOUCLE_verif_test(ARTICLES){id_article}{id_mot}>
	<p><div style="border:1px solid black">
		
	[(#LOGO_ARTICLE_RUBRIQUE|left|#URL_ARTICLE)]

	<BOUCLE_sec_tests(RUBRIQUES){id_rubrique}>
	<h3>#TITRE</h3>
	</BOUCLE_sec_tests>

	<h4>#TITRE</h4>
	
	<BOUCLE_rating_tests(MOTS){id_article}{type=علامة}>
	<b>العلامة : #TITRE/10</b><p>
	</BOUCLE_rating_tests>
			
	[(#DESCRIPTIF)]
	<p align="right"><a href="#URL_ARTICLE">الاطلاع على هذا الاختبار...</a>
	</div>
</BOUCLE_verif_test>
</BOUCLE_tests>

المبدأ لا يتغير بالنسبة للاستعراضات والحلول والنصائح: نضيف حلقة تدقيق ونحذف الحلقة التي تعرض لائحة البيئات المحددة:

<B_previews>
<p><b>الاستعراضات:</b>
<ul>
<BOUCLE_previews(ARTICLES){titre_mot=إستعراض}{par date}{inverse}{age < 90}><BOUCLE_verif_previews(ARTICLES){id_article}{id_mot}>	
	<BOUCLE_sec_previews(RUBRIQUES){id_rubrique}>
	<li><b>#TITRE</b> /
	</BOUCLE_sec_previews>
	<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_verif_previews></BOUCLE_previews>
</ul>
</B_previews>

<B_solutions>
<p><b>الحلول:</b>
<ul>
<BOUCLE_solutions(ARTICLES){titre_mot=حلول}{par date}{inverse}{age < 90}><BOUCLE_verif_solutions(ARTICLES){id_article}{id_mot}>
	<BOUCLE_sec_solutions(RUBRIQUES){id_rubrique}>
	<li><b><a href="#URL_ARTICLE">#TITRE</a></b>
	</BOUCLE_sec_solutions>
</BOUCLE_verif_solutions></BOUCLE_solutions>
</ul>
</B_solutions>

<B_tips>
<p><b>النصائح:</b>
<ul>
<BOUCLE_tips(ARTICLES){titre_mot=نصائح}{par date}{inverse}{0,5}><BOUCLE_verif_tips(ARTICLES){id_article}{id_mot}>	
	<BOUCLE_sec_tips(RUBRIQUES){id_rubrique}>
	<li><b><a href="#URL_ARTICLE">#TITRE</a></b>
	</BOUCLE_sec_tips>
</BOUCLE_verif_tips></BOUCLE_tips>
</ul>
</B_tips>

<B_news>
<p><b>الاخبار:</b>
<ul>
<BOUCLE_news(ARTICLES){titre_mot=أخبار}{par date}{inverse}{0,5}><BOUCLE_verif_news(ARTICLES){id_article}{id_mot}>	
	<BOUCLE_sec_news(RUBRIQUES){id_rubrique}>
	<li><b><a href="news_game.php3?id_rubrique=#ID_RUBRIQUE">#TITRE</a>:</b>
	</BOUCLE_sec_news>
	#TITRE
</BOUCLE_verif_news></BOUCLE_news>
</ul>
</B_news>

مهم جداً: تلاحظ في ما سبق ان حلقة التدقيق «ملتصقة» بالحلقة الاولى (مثلاً، بين <BOUCLE_previews(ARTICLE)...> و<BOUCLE_verif_previews(ARTICLE)...>، لا يوجد اي مسافة او عودة الى اول السطر). والحال، ان النص الشرطي قبل التابع للحلقة الاولى (هنا عبارة «الاستعراضات») ينشط اذا كانت الحلقة تحتوي على الاقل على حرف واحد. فإذا كانت هناك مسافة او عودة الى اول السطر قبل نداء حلقة التدقيق، فحتى لو ان الحلقة لا تعرض اي مقال (لأنه لا توجد مقالات منشورة منذ ثلاثة اشهر حول هذه البيئة)، تقوم هذه المسافة المتطفلة بتفعيل النص الشرطي.

لنتحدث الآن عن عرض الاصدارات المقبلة. قد نقرر انشاء صفحة جديدة للاصدارات تتعلق بالبيئة المحددة فقط، ولكننا نفضل عرض هذه الاصدارات مباشرة في صفحة المحتويات المخصصة للبيئة (لأن الاصدارات المحصورة ببيئة واحدة ليست كثيرة). وبتطبيق الطرق نفسها التي طبقناها سابقاً، نستبدل وصلة «الاصدارات القادمة» بالتالي:

<B_out>
<b>إصدارات #TITRE خلال الشهر القادم:</b>
<ul>
<BOUCLE_out(ARTICLES){titre_mot=تاريخ_الصدور}{par date}{age < 0}><BOUCLE_out_verif(ARTICLES){id_article}{id_mot}>
	<li>[(#DATE|affdate)]:
	
	<BOUCLE_sec_out(RUBRIQUES){id_rubrique}>
	#TITRE
	</BOUCLE_sec_out>
	
</BOUCLE_out_verif></BOUCLE_out>
</ul>
</B_out>

وبالاعتماد على المبدأ نفسه، نعرض لائحة بالالعاب المفضلة في هذه البيئة خلال الاشهر الستة الماضية:

<B_ratings>
<b>العابنا المفضلة منذ ستة اشهر:</b>
<ul>
<BOUCLE_ratings(ARTICLES){type_mot=علامة}{par titre_mot}{inverse}{age<120}><BOUCLE_ratings_verif(ARTICLES){id_article}{id_mot}>
	<BOUCLE_sec_ratings(RUBRIQUES){id_rubrique}>
	<li> #TITRE
	</BOUCLE_sec_ratings>
	<BOUCLE_therate(MOTS){id_article}{type=علامة}>
	(#TITRE/10)
	</BOUCLE_therate>
	
</BOUCLE_ratings_verif></BOUCLE_ratings>
</ul>
</B_notes>

الامر الدقيق الوحيد حالياً هو ترتيب المقالات المرتبطة بالمفاتيح من نوع «علامة» حسب المعيار {par titre_mot}{inverse} (وهي وظيفة ظهرت في الاصدار 1.3 من SPIP). فالمفاتيح من نوع «علامة» هي على شكل «01»، «02»،...، «10»، يمكننا اذاً ترتيبها من 10 الى 1.

الا ان هذا العرض لا يزال غير مرض: فنزعم اننا نعرض «العابنا المفضلة» والمعروض هو ترتيب حسب العلامات. فإذا صدرت لعبة منذ اقل من ستة اشهر وحصلت على علامة مخيّبة، سوف تظهر في لائحة «الالعاب المفضلة» رغم ذلك (ولو في آخر اللائحة)!

نريد اذاً وسيلة لعرض الالعاب التي حصلت على علامة اعلى من «07» فقط (هذا خيار اعتباطي). فإذا اردت استخدام حلقة BOUCLE_ratings من اجل ذلك بإضافة معيار {titre_mot>07}، لن تعمل: فلا يقبل SPIP الا معياراً واحداً يعتمد على المفاتيح في الحلقات غير تلك التي تكون من نوع (MOTS).

سنستخدم اذاً حلقة BOUCLE_therate (التي تعرض العلامة) ونطلب منها ان لا تسترجع الا العلامات الاعلى من 7 (يمكننا ذلك لأن الحلقة من نوع (MOTS) ويمكننا ادخال عدة معايير حول المفاتيح). ويتم عندها وضع حلقة BOUCLE_sec_ratings التي تعرض اسم اللعبة في النص الاختياري بعد لحلقة BOUCLE_therate:
 فإذا كانت العلامة اعلى من 7 يتم تنفيذ حلقة BOUCLE_sec_ratings
 والا لا يعرض اي شيء

تحذير يشكل وضع حلقة في النص الاختياري لحلقة اخرى عملية لا تخلو من الخطر (يمكن لـSPIP ان يفقد توازنه بسهولة). ولسبب غير معلوم، يمكن تنفيذ هذه العملية في النص الاختياري بعد وليس في النص الاختياري قبل.

مع العلم اننا لن نسترجع الا المقالات ذات العلامات «08» و«09» و«10»، بالترتيب التنازلي، نعتبر انه من غير المفيد التذكير بالعلامة نفسها. بالتالي تصبح الحلقة BOUCLE_therate فارغة ولن تؤدي الا الى تفعيل الحلقة BOUCLE_sec_ratings او تعطيلها.

اخيراً، بما ان حلقة BOUCLE_therate اصبحت «مرشحاً» يطبق على اختيار المقالات، يتحتم حذف المسافات والعودة الى اول السطر حول هذه الحلقة بشكل لا يتم تفعيل العبارة «العابنا المفضلة منذ 6 اشهر» الا اذا تم عرض مقال واحد على الاقل.

مما يعطينا:

<B_ratings>
<b>العابنا المفضلة منذ ستة اشهر:</b>
<ul>
<BOUCLE_ratings(ARTICLES){type_mot=علامة}{par titre_mot}{inverse}{age<120}><BOUCLE_ratings_verif(ARTICLES){id_article}{id_mot}><BOUCLE_therate(MOTS){id_article}{titre>07}{type=note}>
	</BOUCLE_therate>
	<BOUCLE_sec_ratings(RUBRIQUES){id_rubrique}>
	<li> <a href="#URL_RUBRIQUE">#TITRE</a>
	</BOUCLE_sec_ratings>
	</B_therate></BOUCLE_ratings_verif></BOUCLE_ratings>
</ul>
</B_ratings>

يبدو ذلك عسير الهضم للوهلة الاولى لكن المهم انه يعمل بشكل صحيح ودون اية اوامر PHP!

الآن ونحن نقترب من نهاية صفحات المحتويات المتخصصة، نلاحظ خلال التنقل من واحدة الى اخرى، ان بعضها فارغ. والحال اننا لا نعرض هنا الا المعلومات التي لا يتعدى عمرها الثلاثة اشهر (الاختبرات والاخبار...). واذا لم يحصل اي جديد في ما يتعلق ببيئة معينة منذ ثلاثة اشهر، او اذا كان هناك بيئة لا يتحدث عنها اي مقال من الاساس (فحتى لو كان هناك مفتاح مخصص لنظام لينكس مثلاً، قد لا يكون احد قد كتب مقال حول العاب لينكس بعد).

لذلك يجب تعديل حلقة BOUCLE_cont_plat (وهي الحلقة التي تعرض شعارات البيئات المختلفة) لتعرض البيئات التي تملك مقالات عمرها اقل من ثلاثة اشهر فقط. ويكفي هنا اضافة حلقة تتأكد من وجود مقال عمره اقل من ثلاثة اشهر ومرتبط بهذا المفتاح. مما يعطينا:

<BOUCLE_cont_plat(MOTS){type=البيئة}{exclus}{par titre}>
<BOUCLE_verif_cont(ARTICLES){id_mot}{0,1}{age < 90}>
	<td>
	<a href="index_platform.php3?id_mot=#ID_MOT"><img src='IMG/[(#LOGO_MOT|fichier)]' border=0></a>
	</td>
</BOUCLE_verif_cont>
</BOUCLE_cont_plat>

علينا الا ننسا ادخال التعديل نفسه في صفحة «sommaire.html» الرئيسية (عدم نسيان حذف المعيار {exclus} في هذه الحال).

مؤلف George نُشر في: تم التحديث: 21/03/23

الترجمات: عربي, català, français, italiano