بالعرض ام بالطول؟

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

كيف نختار الصور في حلقة DOCUMENTS بالاعتماد على اتجاهاتها.
هنا مثال للوظائف الجديدة في SPIP 1.8

في حلقة DOCUMENTS تُستخدم لعرض مجموعة من الصور (صالة عرض مثلاً)، قد نرغب في تحديد الصور اعتماداً على اتجاهاتها (افقية ام عمودية).

واذا كان تصميم الصفحة يفرض شروطاً على اتجاه الصور، يصبح من المهم جداً معرفة ما اذا كانت الصورة التي نعرضها ستكون عمودية (portrait) او افقية (landscape).

نعرض هنا بعض الحلول التي تستخدم الوظائف الجديدة في SPIP 1.8.

الذي يخطر في البال

نعرف انه في حلقة DOCUMENTS يمكننا استخدام علامتي #HAUTEUR (الارتفاع) و#LARGEUR (العرض). ويعني ذلك اننا نستطيع ادخال معيار يحد من ارتفاع المستندات المحددة او عرضها.

<BOUCLE_doc(DOCUMENTS) {id_article} {largeur < 800}>
#LOGO_DOCUMENT
</BOUCLE_doc>

قد يخطر في بالنا اذاً مقارنة العرض والارتفاع بالاسلوب نفسه :

<BOUCLE_doc(DOCUMENTS) {id_article} {largeur < hauteur}>
#LOGO_DOCUMENT
</BOUCLE_doc>

ويتقبل SPIP الحلقة الاولى، اذ انه من الممكن مقارنة اي حقل في قاعدة البيانات بقيمة ثابتة (هنا 800). غير انه، في الحلقة الثانية، ليست القيمة اليمنى ثابتة ولكنها حقل من القاعدة. اذاً لن يتقبل SPIP الحلقة الثانية.

الحل البديهي لا ينفع

حل محدود : تداخل الحلقات

عندما نقول ان على القيمة اليمنى ان تكون ثابتة، نعني انها قد تكون :

  • ثابت عددي (رقم متسلسل، قياس، ...)
  • سلسلة نصية (عنوان مقال او اسم قسم الخ.)
  • تركيب منتظم (regular expression)
  • قيمة علامة آتية من حلقة حاوية تغلف الحلقة الحالية.

والحال، حين نكون داخل احدى حالات الحلقة التكرارية تكون قيم علاماتها ثابتة بالنسبة للحلقات الموجودة داخلها.

لذلك سوف نستخدم حلقة حاوية لتمرير قيمة حجم المستند اليمنى في المعادلة اللا متساوية :

<BOUCLE_doc(DOCUMENTS) {id_article}>
<BOUCLE_portrait(DOCUMENTS) {id_document} {hauteur >= #LARGEUR}>
#LOGO_DOCUMENT
</BOUCLE_portrait>
</BOUCLE_doc>

نبني اذاً حلقة _doc للحصول على كل مستندات المقال (بالطبع يمكننا استخدام معايير اخرى). ثم تقوم حلقة _portrait بتحديد مستند واحد بفضل معيار id_document (وهو الرقم الذي مررته حلقة _doc).

وتتأكد الحلقة الداخلية ايضاً من ان ارتفاع هذا المستند اكبر من عرضه او يعادله.

هذا اذاً اول حل عملي لاختيار المستندات بالاعتماد على اتجاهاتها.

ولكن هناك معيار يكثر استخدامه لكنه لن يعمل مع هذه الحلقة وهو {a,b}. فالحد من النتائج يجب ان يطبق على الحلقة الاولى. ولكن هذه الحلقة تجلب كل المستندات مما يعني ان تعداد المستندات اصبح غير دقيق لتطبيق هذا المعيار.

حل اكثر مرونة : استخدام المكرر doublons

يشكل استخدام المكرر doublons حلاً للاستفادة من معيار {a,b} :

<BOUCLE_doc(DOCUMENTS) {id_article}>
<BOUCLE_landscape(DOCUMENTS) {id_document} {largeur >= #HAUTEUR} {doublons}>
</BOUCLE_landscape>
</BOUCLE_doc>

<BOUCLE_portrait(DOCUMENTS) {id_aticle} {doublons} {0,5}>
#LOGO_DOCUMENT
</BOUCLE_portrait>

تقوم الحلقة الاولى بجرد المستندات التي لا نريدها ولا تعرض اي شيء ولكنها تكدّس المستندات في خانة المكرر doublons. اما الحلقة الثانية فتجرد كل المستندات باستثناء تلك المصنفة كمكررة اي تلك التي لم يتم الغاؤها في الحلقة السابقة.

حل مدمج : وضع معايير جديدة

مع ان كل ذلك آخذ في التعقيد الا انه لا يزال ضمن اوامر SPIP البرمجية. ولكن لسوء الحظ، حتى الحل الثاني يتعثر في حالات معينة.

وهنا حل يستغل امكانات التوسع التي يقدمها الاصدار 1.8 من SPIP وذلك بإضافة ثلاثة معايير حلقات جديدة. هذه الاضافة تأتي على شكل اوامر PHP ولكن ليس من الضروري استيعابها لاستخدامها. فننشئ هنا معياري {portrait} و{landscape} للاستخدام التالي :

<BOUCLE_portrait(DOCUMENTS) {id_article} {portrait} {0,5}>
#LOGO_DOCUMENT
</BOUCLE_portrait>

يجب وضع الاوامر في ملف mes_fonctions.php3 او في ملف يتم نداؤه من mes_fonctions.php3.

تحذير، يستخدم المعياران معادلات لا متساوية صارمة (اي > وليس >=) لتحديد الصور. بالتالي لن يتم تحديد الصور المربعة (اي Hauteur = Largeur). لذلك ننشئ المعيار الثالث {square} الذي يسترجع الصور المربعة.

<?php

function choice_portrait($idb, &$boucles, $param, $not) {
  $loop = &$boucles[$idb];
  $table = $boucle->id_table;

  if ($not) 
	$loop->where[] = $table.".hauteur <= ".$table.".largeur";
  else
	$loop->where[] = $table.".hauteur > ".$table.".largeur";
}


function choice_landscape($idb, &$boucles, $param, $not) {
  $loop = &$boucles[$idb];
  $table = $boucle->id_table;

  if ($not) 
	$loop->where[] = $table.".largeur <= ".$table.".hauteur";
  else 
	$loop->where[] = $table.".largeur > ".$table.".hauteur";
}

function choice_square($idb, &$boucles, $param, $not) {
  $loop = &$boucles[$idb];
  $table = $boucle->id_table;

  if ($not) 
	$loop->where[] = $table.".largeur != ".$table.".hauteur";
  else
	$loop->where[] = $table.".largeur = ".$table.".hauteur";
}
?>

هاك بعض التفسيرات للذين يرغبون في فهم هذه الاوامر :

  1. يسترجع السطران الاولان الحلقة التي نوجد فيها واسم جدول قاعدة البيانات المطلوب.
  2. ثم نتأكد من ان المعيار لن ينعكس (بفضل العلامة « ! »). وفي حال انعكس نستخدم معيار المقارنة العكسي.
  3. اخيراً نضيف قيداً جديداً على استفسار قاعدة البيانات. ويقارن هذا القيد حقلي hauteur وlargeur في الجدول المناسب.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom