UNE FONCTION POUR APPLIQUER UNE SÉRIE DE FILTRES
UNE FONCTION POUR APPLIQUER UNE SÉRIE DE FILTRES
Techniques SPIP

Vous trouverez ici des trucs et astuces destinés aux développeurs de sites sous SPIP.

La majorité de ces trucs est consacrée aux filtres graphiques introduits dans SPIP 1.9. Il y a là en effet un vaste champ d’expérimentation pour les webmestres et les graphistes.

Chaque truc est suivi d’un forum auquel nous vous invitons à participer.

N.B. La présence de ces trucs et astuces sur notre site professionnel est destinée à faire connaître notre activité de création de sites sous SPIP. Vous pouvez librement utiliser les morceaux de code fournis ici dans vos propres squelettes. Vous pouvez reprendre ces exemples sur votre site ou dans les forums d’un autre site ; dans ce cas, nous vous demandons simplement d’avoir la courtoisie de référencer la page d’où est tiré le code repris.

XML

[SPIP 1.9 et GD2] Si vous suivez ces trucs et astuces depuis un moment, vous avez pu constater que l’utilisation des filtres graphiques devient réellement impressionnante lorsqu’on combine plusieurs filtres successifs. Dans l’exemple du titre en relief, le code SPIP devient interminable, dès lors que non seulement on applique une série de filtres mais que de plus on « fusionne », avec image_masque, deux images calculées.

Et plus votre maîtrise des filtres graphiques progressera, plus vous aurez des idées d’utilisations aussi imaginatives que possibles, et plus le code s’alourdira.

L’idée consistera alors à ne plus appeler successivement une interminable série de filtres, mais à se fabriquer une fonction PHP qui, servant de filtre SPIP, fabriquera directement la longue combinaison de filtres. Votre code SPIP deviendra plus lisible et, par ailleurs, le code PHP de votre fonction spécifique sera certainement plus lisible (et donc facile à modifier et à maintenir).

Reprenons simplement le code auquel nous étions parvenu pour réaliser le texte en relief :

Si vous le copiez-collez dans un éditeur texte (c’est le but !), vous constatez qu’il est assez lourd :
— sept filtres graphiques succesifs,
— un filtre utilisé à l’identique deux fois...

Remplaçons maintenant ce code par l’appel à un unique filtre :

Dans mes_fonctions, on insère la fonction PHP correspondante, qui tout simplement synthétisera la succession de filtres :

  1. function mon_relief($texte,$coul) {
  2.         $source = image_typo($texte,"police=stencil.ttf","couleur=$coul","taille=40","padding=4");
  3.        
  4.         $est = image_flou($source, 2);
  5.         $est = image_estampage_alpha($est, 1, 1.5);
  6.         $est = extraire_attribut($est, "src");
  7.        
  8.         $ret = image_masque($source, $est, "top=-1", "left=-1");
  9.         $ret = image_masque($ret, "masque-grad.png");
  10.        
  11.         return $ret;
  12. }

C’est tout de même beaucoup plus lisible !

Notez tout de même cette « astuce » : certains filtres graphiques, tels que image_typo et image_masque, pour pouvoir passer une liste de paramètres indéterminés et dans n’importe quel ordre, doivent utiliser un format de variables très spécifiques, en tant que chaînes de caractères. D’où les apostrophes, par exemple, pour indiquer :

Notez encore, par rapport aux appels effectués directement en tant que filtres SPIP, qu’ici on retrouve la syntaxe de PHP : les variables sont entourées de parenthèses, alors que dans les squelettes, elles sont passées entourées d’accolades.

Avril 2006
Un plugin ?
izo (izo chez aucuneid.net)

Pourquoi tu fais pas un plugin de tout ça ? C’est quand plus simple à activer ...

Juin 2006
Utilisation de reduire_image
Franz

Salut,

Je suis en train d’essayer d’écrire une fonction personnalisée sur base des conseils que tu donnes ici.

Je n’ai aucun problème avec la plupart des fonctions données ici. Des choses comme ceci fonctionnent très bien (où masque.png est stocké dans le répertoire des squelettes) :

Par contre, je ne parviens pas à faire bouffer une image qui ne vient pas directement de SPIP au filtre reduire_image. Ceci, par exemple, ne fonctionne pas :

C’est moi qui me trompe quelque part ou c’est reduire_image qui ne fonctionne pas de la même manière que les autres ?

Merci

Juin 2006
Une fonction pour appliquer une série de filtres
ARNO* (arnaud chez paris-beyrouth.net)

Tu pourrais aussi tester ceci :

Ce serait plus dans la logique de la comparaison.


Pour les autres fonctions, je n’ai pas vraiment fait de tests, mais il me semble que pour reduire_image, vieille fonction très compliquée (pour des raisons historiques, je crois), il faut absolument que l’image à traiter se trouve dans le dossier /IMG.

Pour utiliser des « images personnelles » prédéterminées (et non, comme dans les exemples ici, des images installées en tant que logo ou fichiers joints à des articles), par exemple pour réaliser des éléments d’interface systèmatiques sur le site (par exemple, sur Paris-Beyrouth.org, le logo du site en haut à gauche change de couleur, et c’est un automatisme), alors je fabrique une rubrique bidon (qui ne sera pas affichée) et j’y installe des documents joints que je nomme de manière plutôt explicite. Ensuite, pour récupérer ces documents, il suffit d’une petite boucle qui récupère le document joint ayant tel nom.

Juin 2006
Une fonction pour appliquer une série de filtres
Franz

Merci de ta réponse. C’est bien ce qu’il me semblait.

Ce que j’essaye de faire, c’est de publier un filtre coins_arrondis permettant d’arrondir les coins des images, qui permette de régler le rayon de la courbure. Pour ce faire, j’ai besoin de redimensionner mon masque avant de l’appliquer. J’essaye d’arriver à un truc très simple à utiliser, du type :

  1. [(#LOGO_ARTICLE||coins_arrondis{rayon})]

La solution passant par l’installation du fichier en pièce jointe quelque part au fond d’une rubrique technique complique assez fort le truc, je trouve.

J’ai créé un ticket trac en suggérant que reduire_image() puisse gérer aussi des images hors de IMG/ http://trac.rezo.net/trac/spip/tick... mais le code de ce filtre a effectivement l’air complexe.

Votre message :
Un message, un commentaire ?

(Pour créer des paragraphes, laissez simplement des lignes vides.)

Qui êtes-vous ? (optionnel)