الحلقات الدورية

تقدم الحلقات الدورية (recursive loops) وظيفة قوية للغاية لإدارة تصميم صفحة تنظيم هرمي. اما برمجة هذه الحلقات فلا تعدى يضعة سطور، الا ان استخدامها يتطلب تحكماً قوياً بمنطق تسلسل الحلقات.

لبناء حلقة دورية، في نوع الحلقة (TYPE) يكفي ادخال اسم حلقة تحتوي تلك التي نكتبها:

<BOUCLEx ....>
....
<BOUCLEn(BOUCLEx)></BOUCLEn>
....
</BOUCLEx>

تتصرف الحلقة n كما لو اننا نسخنا كامل الحلقة x (كل علامات SPIP وعلامات html والنصوص الشرطية قبل وبعد والنصوص البديلة) في المكان الذي أدخلنا فيه . وتعمل اوامر الحلقة كما لو اننا قمنا بنسخ كامل الحلقة x (اي كل العلامات واوامر HTML والنصنص الشرطية قبل وبعد وبدلاً من) في المكان الذي وضعنا فيه الحلقة n. وبما ان الحلقة n موجودة داخل الحلقة x، نحصل على تصرف دوري: الحلقة x تحتوي على الحلقة n التي بدورها تعيد إنتاج الحلقة x التي تحتوي على الحلقة n وهكذا دواليك الى ان تنتهي الحلقة x من استرجاع نتائجها. ولا تحتوي الحلقة n على اي معيار، فتغيير السياق من جراء كل نداء للحلقة x يؤدي بمعايير هذه الأخيرة الى اسنفاد العناصر المسترجعة.

والابسط هنا هو «مضاعفة» (duplicate) الحلقة بدلاً من نسخها. هكذا، كل تعديل يدخل على الحلقة الاصلية x ينعكس آلياً في الحلقة n.

وتتيح هذه التقنية بناء عرض خيوط المنتديات. ببساطة: تنشئ حلقة اولى مدخل الخيوط (اي المشاركات التي تعقّب مباشرة علي مقال)، وتأتي حلقة ثانية لتعرض الردود على هذه المشاركات وتؤدي حلقة دورية الى تكرار الحلقة الاخيرة:

<BOUCLE_forum(FORUMS){id_article}>
<P>#TITRE

      <B_replies>
      <UL>
      <BOUCLE_replies(FORUMS){id_parent}>
      <LI>#TITRE
           <BOUCLE_recursive(boucle_replies)>
           </BOUCLE_recursive>
       </BOUCLE_replies>
       </UL>
       </B_replies>

</BOUCLE_forum>

يمكننا هكذا، وببضعة سطور عرض كامل بنية الموقع (الاقسام والاقسام الفرعية...).

ملاحظة ١: يقوم المحرك الجديد الذي إدخله SPIP ١.٨ باعتبار ان الكتابة <BOUCLEn(BOUCLEx)> الموجودة خارج الحلقة x لا معنى لها مما يتيح له الوصول الى أفضل مستوى لعدد حقول استفسارات القاعدة التي ينتجها.
هذا التصرف ليس دورياً ولكنه إدراجياً وهو التصرف الذي تناسبه علامة balise INCLURE التي يفضل استخدامها.

ملاحظة ٢: في الوضع الحالي للمحرك (SPIP ١.٩)، يجب على السلسلة <BOUCLEn(BOUCLEx)></BOUCLEn> ان توجد في اعلى مستوى من الحلقة x، بمعنى آخر يجب ان تكون الحلقة n محاطة مباشرة بالحلقة x لا ان تكون داخل حلقة أخرى موجودة داخل حلقة x.
نحن في صدد دراسة إلغاء هذا الشرط.

ملاحظة ٣: منذ الاصدار ١.٨، ١.٨.١ من SPIP، يمكن نداء علامة تحمل الاسم نفسه الذي تحمله الحلقة التي تشمل هذه العلامة. يجب عندها تحديد اسم الحلقة بين رمز # واسم العلامة. مزيد من التفاصيل في المقال علامات SPIP: التركيب اللغوي.

تكتب اذاً العلامة #TAG العائدة لحلقة _loop هكذا:
#_loop:TAG.

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

الترجمات: عربي, català, Deutsch, English, Español, français, italiano, Nederlands