لنبدأ بملف «rubrique.html» فارغ.
اول نسخة من الملف ستكون بسيطة جداً. سندخل مباشرة حلقة الهرمية BOUCLE_hierarchy التي لا تحتوي على اي تعقيد.
<html>
<title>[#NOM_SITE_SPIP]
<BOUCLE_title(RUBRIQUES){id_rubrique}>#TITRE</BOUCLE_title></title>
</head>
<body>
<blockquote>
<BOUCLE_main(RUBRIQUES){id_rubrique}>
<BOUCLE_hierarchy(HIERARCHIE){" : "}>
<a href="#URL_RUBRIQUE">#TITRE</a>
</BOUCLE_hierarchy>
<h1>#TITRE</h1>
[(#LOGO_RUBRIQUE|right)]
[(#TEXTE|justifier)]
[<hr>(#NOTES)]
</BOUCLE_main>
</blockquote>
</body>
</html>
اذا قمت بتثبيت هذه الصفحة في موقعك لن تكون مدهشة!
المقالات الموجودة في هذا القسم
سنضيف قائمة المقالات الموجودة في القسم. سنضع حلقة المقالات BOUCLE_articles في اسفل الحلقة الرئيسية BOUCLE_main (اي بعد نص القسم TEXTE# والملاحظات NOTES# العائدة له).
...
<B_articles>المقالات:
<ul>
<BOUCLE_articles(ARTICLES){id_rubrique}>
<li> <a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_articles>
</ul>
</B_articles>
</BOUCLE_main>
...
في الحقيقة، لا تأتي هذه الحلقة بأي مهم: فإنها تعرض المقالات دون ترتيب معين (فلا تأخذ في الحسبان مفاتيح انواع المقالات). نضعها حالياً، كما هي للحصول على تصفح اولي في الموقع. سنعود الى هذا الجزء في ما بعد في هذا التدريب.
الاقسام الفرعية
سندخل الآن حلقة الاقسام الفرعية (بعد حلقة المقالات):
...
<B_sub_sections>الاقسام الفرعية:
<ul>
<BOUCLE_sub_sections(RUBRIQUES){id_parent}{par titre}>
<li> <a href="">#TITRE</a>
</BOUCLE_sub_sections>
</ul>
</B_sub_sections>
</BOUCLE_main>
...
وهنا نواجه المشكلة الحقيقية في تدريبنا: الاقسام التي تحدد اصناف الالعاب تختلط مع الاقسام المخصصة مباشرة للالعاب.
فعلى سبيل المثال، في البنية المعتمدة، يحتوي قسم «المغامرات» في الوقت نفسه وبطريقة العرض نفسها، على:
– قسمي اصناف («اكتشاف واحاجي» و«رعب»)
– وقسمي العاب («Devil May Cry» و«Soul Reaver 2»).
اذاً، عندما يتم عرض الحلقة اعلاه، سنحصل على القائمة:
– Devil May Cry
– اكتشاف واحاجي
– Soul Reaver 2
– رعب.
لذلك يجب تمييز الاقسام «اصناف الالعاب» (التي تستخدم اساساً للتصفح) واقسام «الالعاب» (التي تعطي اسماء الالعاب).
للتغلب على هذه المشكلة سنستخدم نظام الحلقات. فلا توجد اي عملية برمجية هنا الا انه من الضروري استيعاب منطق الموقع ومنطق الحلقات.
اما منطق الموقع فهو: قسم «لعبة» هو قسم يحتوي على مقالات. وقسم «صنف العاب» لا يحتوي مباشرة على مقالات. فهكذا عرّفنا موقعنا: كل مقال يتعلق بلعبة معينة يكون داخل قسم يحمل اسم هذه اللعبة. هكذا، فإن قسم «صنف العاب» لا يحتوي الا على اقسام فرعية لأصناف فرعية من الالعاب اضافة الى اقسام تحمل اسماء العاب وبالتالي لا يحتوي ابداً مقالات بشكل مباشر. فمثلاً في الوضع الحالي:
– «Soul Reaver 2» و«Devil May Cry» يحتويان على مقالات حول هاتين اللعبتين (اختبرات، استعراضات،...)
– اما «رعب» و«اكتشاف واحاجي» فلا يحتويان على مقالات. واذا كان هناك العاب في قسم «رعب»، فإن المقالات المتعلقة بها ستكون في اقسام فرعية تحمل اسماءها وليس مباشرة في قسم «رعب».
بالتالي، يكون هدفنا هنا فصل الاقسام بدون مقالات عن الاقسام مع مقالات، والابسط هو انشاء حلقتين مختلفتين.
الاقسام بدون مقالات
لنبدأ بالاقسام الفرعية التي لا تحتوي مقالات (اي الاصناف الشاملة «رعب»، «اكتشاف»...). سنعدل حلقة الاقسام الفرعية هكذا:
<BOUCLE_sub_sections(RUBRIQUES){id_parent}{par titre}>
<BOUCLE_without_articles(ARTICLES){id_rubrique}>
</BOUCLE_without_articles>
<h3><a href="#URL_RUBRIQUE">#TITRE</a></h3>
<//B_without_articles>
</BOUCLE_sub_sections>
المبدأ هنا بسيط:
– في الحلقة BOUCLE_sub_sections، ندخل حلقة جديدة BOUCLE_without_articles تسترجع المقالات التي تحتويها. لاحظ ان حلقة BOUCLE_without_articles لا تحتوي اي شيء: فإذا كانت الحلقة تحتوي على مقالات، لا يتم عرض هذه المقالات (تُستخدم الحلقة للتأكد من وجود المقالات وحسب).
– ويتم ادراج العنوان TITRE# العائد لحلقة BOUCLE_sub_sections في النص الاختياري «بدون» في الحلقة BOUCLE_without_articles مباشرة قبل العلامة /B_without_articles>. هكذا، لا يتم عرض عنوان القسم الا اذا كانت حلقة BOUCLE_without_articles لا تحتوي اي مقال (اي اذا كانت الحلقة BOUCLE_sub_sections نفسها لا تحتوي اي مقال).
في المطلق، تقوم حلقة BOUCLE_sub_sections باسترجاع كل الاقسام (حتى اقسام الالعاب). لكن العنوان TITRE# (المزوّد بوصلة هايبرتكست) لا يظهر الا اذا كانت الحلقة BOUCLE_without_articles فارغة.
اقسام الالعاب (مع المقالات)
سوف نطبق العكس تماماً على الحلقة الجديدة BOUCLE_games (التي سنضعها مباشرة بعد حلقة BOUCLE_sub_sections).
<BOUCLE_games(RUBRIQUES){id_parent}{par titre}>
<B_with_articles>
<h4><a href="#URL_RUBRIQUE">#TITRE</a></h4>
[(#LOGO_RUBRIQUE|right)]
<ul>
<BOUCLE_with_articles(ARTICLES){id_rubrique}>
<li><a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_with_articles>
</ul>
</B_with_articles>
</BOUCLE_games>
هذه المرة، يتم وضع عنوان القسم TITRE# في النص الشرطي «قبل». كما نعرض شعار القسم LOGO_RUBRIQUE# (بالطبع في ما بعد سننشئ جداول جميلة لتجنب تراكب العناصر فوق بعضها). ولا ننسى ان نعرض قائمة بالمقالات الموجودة في حلقة BOUCLE_with_articles.
في البداية، تكون الحلقتان BOUCLE_games وBOUCLE_sub_sections متماثلتان تماماً: فمعايرهما هي نفسها. بالتالي، في داخل هاتين الحلقتين، ستتم معالجة الاقسام نفسها. في المقابل، تُستخدم حلقتا BOUCLE_without_articles وBOUCLE_with_articles كأداتي «ترشيح»: فتأخذان كل من اقسام حلقتي BOUCLE_games وBOUCLE_sub_sections وتتأكدان من وجود مقالات ام لا.
هل كان بإمكاننا استخدام معيار {doublons}
هنا؟ كلا، لأن اول حلقة معروضة (BOUCLE_sub_sections) تعالج فعلاً كل الاقسام الفرعية (ونكتفي بعرض عناوين هذه الاقسام الفرعية ام لا، حسب الحالة). فإذا ادخلنا عليها معيار {doublons}
سوف يمنع في ما بعد من معالجة اي من هذه الاقسام الفرعية. فبعدها، ستحاول حلقة BOUCLE_games استرجاع الاقسام التي لم تعالجها الحلقة الاولى، وبما ان الحلقة الاولى عالجت كل الاقسام، لن تتمكن حلقة BOUCLE_games من عرض اي شيء.
لندع الآن صفحة «rubrique.html»، سنعود اليها في ما بعد.