المكررات SPIP - حلقة (DATA)

SPIP ٣٫٠ قدم مفهوماً عاماً للحلقات يعتمد على المكررات (iterators)

توسع استخدام حلقات (DATA) ليشمل، فضلاً عن استفسارات SQL [1]، اي نوع من قوائم البيانات.

مثلاً:

  • جدول بيانات ناتج عن اي نوع من الدوال (ومن بينها مكررات PHP)
  • محتوى ملف محلي بتنسيقات XML وCSV وJSON وYAML الى آخره
  • قائمة ملفات في مجلد على الخادم
  • استفسار من اي خدمة على النسيج
  • استفسار SQL (كالذي يدعمه SPIP مثلاً)
  • دليل LDAP

كتابة حلقة (DATA) وتنسيقها

انها حلقة يمكنها ان تجري اي جدول بيانات. اما كتابتها فهي كالتالي:

<BOUCLE_example(DATA){source format, données}>
	#BALISES
</BOUCLE_example>

يحدد المعيار {source format, data} البيانات التي ستمر عليها الحلقة.

يتطلب تحديد مصدر (source) البيانات عنصرين:
— قسم البيانات data: يمكن ان يكون هذا العنصر من أنواع مختلفة:
- جدول بيانات، مثلاً #ENV*
- مسار ملف على القرص الثابت، مثلاً sources/definitions.csv
- عنوان URL لملف او خدمة نسيج، مثلاً http://per.sonn.es/bases/phobia.fr.yaml
- أو حتى اي سلسلة يمكن للتنسيق ان يحولها الى جدول بيانات، مثلاً "select * from flickr.photos.search where text='spip'"

— قسم التنسيق format احد الأنواع التالية:
- table (او array او code>tableau) لجدول موجود مسبقاً
- csv أو json أو , yaml لملف يخضع لهذه التنسيقات
- file للممرور على اسطر ملف ما
- glob أو pregfiles للمرور على ملفات مجلد ما (أو أكثر)
- rss (أو atom) لقراءة تدفق اي جديد
- plugins لعرض قائمة بالملحقات النشطة في الموقع
- yql لاستفسار خدمة النسيج العائدة لياهو Yahoo Query Language
- sql لإرسال استفسار خام الى خادم قاعدة البيانات (يتم استخدام {source sql, connecteur:query})
- ics للمرور على الرونامة (يتطلب ملحق icalendar، أنظر Plugin iCalendar)
- الى آخره

كل هذه التنسيقات متوافرة ومن السهل إضافة غيرها وذلك بإنشاء دالة inc_FORMAT_to_array($u). على سبيل المثال، هذه دالة تحول ملف بتنسيق JSON الى جدول بيانات

function inc_json_to_array_dist($u) {
  if (is_array($json = json_decode($u))
  OR is_object($json))
    return (array) $json;
}

يمكن تحديد حلقة DATA جديدة في ملف inc/my_source_to_array.php

function inc_my_source_to_array_dist($data,$param1='',$param2='') {
     // $data يحتوي على محتوى الملف (محلي | بعيد) أو قيمة المتغير في المعيار.
    // $param1, $param2... هي معاملات اختيارية
...
}

ثم عرضها:

<BOUCLE_example(DATA){source my_source,test}>
	#VALEUR
</BOUCLE_example>

مفيد: يتم حفظ نتيجة حلقة DATA في ذاكرة كاش. يمكن إزالة هذا التصرف من خلال معيار {datacache 0}.

ترشيح وفرز وتصفح ودمج

المرسحات. مثل حلقات SQL، يمكن ترشيح حلقات (DATA) بواسطة معايير من نوع {value=x}. العوامل المتوافرة هي = و> و< و>= و<= و== (عبارة منطقية) وLIKE.

الا ان هذا الترشيح لا ينفذ في البداية خلال الاستفسار مثل حلقات SQL بل في النهاية على جدول البيانات المسترجع.

الفرز. الفرز من نوع {par xx} ممكن في هذه الحلقات كما البديل {!par xx} للفرز العكسي.

التصفح. يعمل التصفح بشكل طبيعي وكذلك معيار الخطوة/الحد {a,b}

الدمج. يعمل معيار {fusion /x/y} بشكل طبيعي. مثلاً، في ملف يحتوي دليل عناوين بتنسيق CSV، اذا كان عنوان البريد الالكتروني في الحقل رقم ٣، يمكن اقتصار الاستفسار على سجل واحد لكل عنوان بريد من خلال الحلقة التالية:

 <BOUCLE_csv(DATA){source csv, addresses.csv}{fusion /3}{par /0}{'<br>'}> 
 	#VALEUR{0} : #VALEUR{3} 
 </BOUCLE_csv> 

يتم تطبيق الدمج بعد الفرز واسترجاع أول عنصر يتم العثور عليه. هكذا اذا تم فرز جدول حسب التاريخ المعكوس {!par date} ثم دمجه على عنوان البريد، فالسجل المسترجع لكل عنوان بريد يكون أحدث سجل.

المعيار {liste ...}

لتبسيط كتابة جداول البيانات، اذا كان قائمة عادية من العناصر المسترجعة يديوياً، تتقبل حلقة (DATA) معيار {liste ...} الذي يتيح إنشاء جدول بيانات يفرق بينها بواسطة فواصل.

الحلقة:

<BOUCLE_i(DATA){liste 3,4,5}{"<br>"}>
	<BOUCLE_j(DATA){liste 6,7,8}{" "}>
		[(#VALEUR|mult{#_i:VALEUR})]
	</BOUCLE_j>
</BOUCLE_i>

النتيجة :

١٨ ٢١ ٢٤
٢٤ ٢٨ ٣٢
٣٠ ٣٥ ٤٠

ملاحظة: استخدمنا #_i:VALEUR داخل الحقة j للدلالة على القيمة التي تم حسابها في الحلقة i.

أنظر أيضاً Deux itérateurs simples : les listes et les énumérations

المعيار {enum ...}

<BOUCLE_enumere(DATA){enum 2,10,2}>
      #VALEUR
</BOUCLE_enumere>

النتيجة:

٢ ٤ ٦ ٨ ١٠

<BOUCLE_enum(DATA){enum g,m}{", "}>
	#VALEUR
</BOUCLE_enum>

Résultat :

g, h, i, j, k, l, m

val1 et val2 هما قيمتان رقميتان أو حرفان. يتكفل SPIP بتحديد أيهما الأصغر، وستقوم هذه الحلقة بتعداد القيم الموجودة بين val1 وval2. في الشكل الأول اذا لم يتم تحديد الوثبة تكون ١ افتراضياً.

أنظر أيضاً Deux itérateurs simples : les listes et les énumérations

حماية البيانات التي تتعامل معها المكررات

تحمي حلقة (DATA) كل العلامات الموجودة في داخلها بشكل آلي لأن البينات التي يتم التعامل معها هي عادة من مصادر غير معروفة وقد تكون خطرة. ويسري ذلك على علامات الاستمارات (#FORMULAIRE_xx) التي يجب استخدامها مع * كما هو موضح في [المقال حول العلامات مع النجمwww.spip.net/fr_article4376.html#Balises---toil--es]

<BOUCLE_foreach_protect(DATA){liste a,b,c,d,e}>
	#FORMULAIRE_XXX*{#VALEUR}
</BOUCLE_foreach_protect>

ملاحظة: اذا تم الستخدام الملحق «Bonux»، يكفي استخدام الحلقة (POUR) التي لا تتطلب هذا الشرط.

<BOUCLE_Foreach_non_protect(POUR){liste a,b,c,d,e}>
	#FORMULAIRE_XXX{#VALEUR}
</BOUCLE_Foreach_protect>

 

هناك الهديد من الأمثلة حول حلقة (DATA)

يمكن أيضاً زيارة الموقع المخصص لاستخدام حلقة DATA على العنوان
http://spip-loves-opendata.spip.net...

حواشي

[1من البديهي ان المكرر التقليدي في SPIP اسمه SQL: ينفذ الاستفسار كما حسبه SPIP ويعرف المرور على النتائج لاسترجاعها الى الحلقة

مؤلف جورج نُشر في:

الترجمات: عربي, English, français, Nederlands