SPIP - Contrib

SPIP - Contrib

[ar] [en] [es] [fr] [it]

64 visiteurs en ce moment

fontsizeup fontsizedown
[10 commentaires]

Portrait ou Paysage ?

vendredi 1er avril 2005, par mortimer

Toutes les versions de cet article : [عربي] [Español] [français]

1 vote

Comment sélectionner les images d’une boucle DOCUMENTS en fonction de leur orientation.

Un exemple de nouvelles fonctionnalités de SPIP 1.8

Dans une boucle DOCUMENTS qui sert à afficher des images (par exemple pour une galerie), on peut vouloir sélectionner les images par leur orientation.

En fonction de la mise en page que l’on recherche, cela peut être important de savoir si l’image qu’on va afficher sera en portrait [1] ou en paysage [2].

Voici quelques solutions utilisant les nouvelles fonctionnalités de SPIP 1.8.

Zip - 1.5 ko
Plugin 1.9
Pour les utilisateurs de la version 1.9, vous pouvez telecharger le plugin directement.

Ce qui vient à l’esprit

On sait que dans une boucle document, on peut accéder aux balises #HAUTEUR et #LARGEUR. Cela signifie que l’on peut aussi mettre un critère limitant la hauteur ou la largeur des DOCUMENTS sélectionnés :

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

On pourrait donc être tenté de comparer la largeur et la hauteur de la même façon :

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

SPIP autorise la première boucle. En effet, on peut comparer n’importe quelle colonne de la base de donnée avec une valeur constante. Cependant dans la 2e boucle proposée, la valeur à droite n’est pas une constante, mais un nom de colonne. Ce critère va donc échouer.

La solution intuitive n’était pas la bonne.

Une solution limitée : imbriquer les boucles

Quand on dit que la valeur à droite doit être une constante, cela veut dire qu’elle peut être :

  • une constante numérique (un id, une taille, etc...),
  • une chaîne de caractères (un titre d’article, de rubrique, etc...)
  • une expression régulière
  • la valeur d’une balise d’une boucle englobante.

Effectivement, quand on est dans une itération spécifique d’une boucle, les valeurs de ses balises sont constantes quand elles sont observées par les boucles imbriquées.

On va donc pouvoir utiliser une boucle englobante pour passer la taille du document à droite de l’opérateur :

On boucle donc avec _doc pour trouver tous les documents d’un article (mais on pourrait utiliser d’autres critères). Ensuite, la boucle _portrait grâce au critère id_document ne sélectionne qu’un document (celui choisi par la boucle _doc).

Elle vérifie aussi que la hauteur de ce document soit plus grande ou égale à la largeur du document sélectionné par la boucle englobante (donc exactement le même).

Voici donc une première solution fonctionnelle pour sélectionner des documents en fonction de leur orientation.

Malheureusement, un critère souvent utilisé ne marchera pas correctement avec cette boucle : {a,b}. En effet, la limitation du nombre de résultats doit être appliquée à la première boucle. Mais celle ci sélectionne tous les documents et donc le compte de documents sera faussé.

Une solution plus souple : utiliser les doublons

Une solutions pour pouvoir utiliser le critère {a,b} est d’utiliser les doublons :

Une première boucle parcours les documents que l’on ne veut pas et n’affiche rien, mais remplie la pile de doublons. La deuxième boucle parcoure tous les documents sauf ceux qui sont dans doublons, c’est à dire ceux qui n’ont pas été éliminés par la boucle précédente.

Une solution intégrée : fournir de nouveaux critères

Bon, tout cela devient compliqué mais reste du code SPIP pur. Malheureusement, même la deuxième solution — dans des cas spéciaux — a certaines limitations.

Voici une solution utilisant l’extensibilité de la version 1.8 de SPIP, pour ajouter trois nouveaux critères de boucle. C’est du code php mais vous n’êtes pas obligé de le comprendre pour l’utiliser. Les critères {portrait} et {paysage} seront alors disponibles. Par exemple :

Il faut placer ce code dans mes_fonctions.php3, ou dans un fichier qu’on incluera depuis mes_fonctions.php3.

Attention, les deux critères utilisent des inégalités strictes pour sélectionner les images. Ainsi, les images carrées : Hauteur = Largeur ne seront pas sélectionnées par ces deux critères. C’est pourquoi on ajoute aussi le critère {carre} qui retourne les images carrées.

Voici quelques explications pour ceux qui s’intéressent au code. Les trois fonctions font essentiellement la même chose :

  1. Les deux premières lignes récupèrent la boucle dans laquelle on se trouve et le nom de la table de la base concernée.
  2. On vérifie ensuite que le critère n’est pas inversé (par le signe « ! ») ; si c’est le cas, on utilise le critère de comparaison inverse.
  3. On ajoute enfin une nouvelle contrainte à la requête qui sera faite à la base. Cette contrainte compare les colonnes hauteur et largeur de la table concernée.

Notes

[1] Verticale

[2] Horizontale

Retour en haut de la page

10 Messages de forum

Voir toute la discussion

  • Répondre à ce message

    6 octobre 2006 12:14 , par mortimer

    Tu as bien compris ;)

    ce n’est pas possible d’appliquer ce critère à la boucle ARTICLES puisqu’il se base sur l’information de HAUTEUR et LARGEUR fournis pas la boucle, et il n’y a que la boucle DOCUMENTS qui a ces balises.

  • Répondre à ce message

    6 octobre 2006 10:37 , par Remy_Metz

    Bonjour, J’aimerais utiliser cette contribution sous forme de plugin pour la 1.9.1. Celui-ci est installé (en local) et activé. Ce nouveau critère est-il compatible avec une boucle ARTICLES ? J’affiche aléatoirement un logo d’article, dans un site de type galerie. J’aimerais que seuls les modes portrait soient à l’écran. J’ai testé, mais j’obtiens une erreur de type "critère non reconnu". Cette erreur répond sans doute à la question...

    Merci pour votre contribution :)

  • Répondre à ce message

    28 septembre 2006 07:49 , par DoriaN

    Merci Mortimer, depuis que je suis devenu spipeur passif je me perds totalement dans la galaxie spip, et j’imagine que je suis pas le seul...

  • Répondre à ce message

    27 septembre 2006 18:31 , par mortimer

    oui, il y a une archive, elle doit être là depuis un moment en fait ;) http://trac.rezo.net/files/spip-zon...

  • Répondre à ce message

    27 septembre 2006 18:17 , par DoriaN

    Sur une version Spip 1.9 ce filtre ne marche plus, est-ce normal ou est-ce moi qui ai pu faire une erreur ?

    La version sous forme de plugin (pas facile à récupérer d’ailleurs via spip-zone, y aurait pas un zip à coller sur cette page par exemple ?) fonctionne correctement sans que je change mes squelettes.

  • Répondre à ce message

    27 juin 2005 23:12 , par IZO

    faut le faire aussi sur les deux autres types (carré et portrait)

    Voir en ligne : DEMO de EXIF :)

  • Répondre à ce message

    20 juin 2005 11:29 , par mortimer

    Salut,

    je suis désolé si c’etait pas clair :

    Il faut ajouter dans les 3 fonctions

    ça veut dire qu’il faut le faire partout : portrait, paysage et carre ;)

  • Répondre à ce message

    18 juin 2005 10:55 , par IZO

    faut aussi l’ajouter à paysage ?

  • Répondre à ce message

    15 juin 2005 16:40 , par mortimer

    Aïe,

    effectivement, l’API pour cela a aussi changée dans la 1.8.2. Donc ça ne marchera pas si tu essais de faire un {!portrait} par exemple.

    Il faut ajouter dans les 3 fonctions, tout au début : $not = $param->not;

    et enlever $not de la liste des params de la fonction. Ainsi, critere_portrait($idb, &$boucles, $param, $not) devient : critere_portrait($idb, &$boucles, $param)

  • Répondre à ce message

    15 juin 2005 15:12 , par DoriaN

    salut, est-il possible que la contrib marche en affichant un message d’erreur avec la version cvs du jour ? Warning : Missing argument 4 for critere_paysage() in...

    mais l’affichage est correct

Répondre à cet article

Retour en haut de la page

Ça discute par ici