Des champs multivalués, une alternative ponctuelle aux Extras

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

Cette contrib permet de quicher plusieurs contenus dans un même champ contenant, et de les récuperer au besoin par un filtre.

Spip est tellement pratique qu’il sert pour plein d’autres choses que ce pour quoi il est prévu à l’origine... Pour cela, l’utilisateur affecte des fonctions particulières aux champs des articles et autres objets spip : par exemple, le sous titre contiendra en fait la référence d’un livre, ou le PS la fiche technique d’un produit ... Mais parfois, il arrive qu’il manque de champs prédéfinis !!! Dans sa grande vérsatilité, SPIP propose alors des champs extras (en phase de rodage...), qui, au prix d’une mise en oeuvre un peu technique (c’est pas du presse bouton pour le webmaster), sont d’une utilisation complètement transparente pour le rédacteur.
Cette contribution présente une alternative : les champs multi-contenus, gérés « à la main ».

Pour cela il faut :
-  un formalisme de description d’un champ multi-contenu
-  un filtre pour récupérer un contenu : val_contenu

formalisme

Un champ dont on souhaite qu’il soit multi-contenu doit contenir une suite de couples #clé#valeur du contenu associé à la clé#, où clé est la clé permettant de récupérer le contenu.

Exemple :

Le site d’un voyagiste présente des voyages dans des ARTICLES. Les différents champs standards sont utilisés pour décrire le titre et les caractéristiques principales du voyage. Mais le voyagiste voudrait aussi décrire les caractéristiques du pays traversé, or il n’y a plus que le champ PS de disponible !! Alors on utilisera ce champ PS comme champ multicontenu.

Ainsi, PS contiendra, pour un voyage à Cuba :

#pays#CUBA#
#superficie#110 860 km2 (0,2 x la France)#
#capitale#La Havane#

#population#11 millions d'habitants#
#origines#La majorité de la population cubaine trouve ses racines en Espagne. Plus de 10% de la population de l'île est d'origine africaine, 1% d'origine chinoise et 22% est métissée.#
#langues#espagnol#
#religions#Santerías, catholicisme, protestantisme#

#politique#République communiste#
#président#Fidel Castro# 78 ans en janvier 04 ...
#monnaie#Le peso cubain (le peso convertible, le dollar US)#
  

Notez qu’entre chaque couple, on peut juste mettre un espace, ou aller à la ligne, ou même sauter une ligne pour plus de clarté avec les grands textes dans la zone de saisie, ou bien même, on peut glisser un commentaire.

le filtre

définition

Le filtre val_contenu doit être défini dans mes_fonctions.php3 :

/*
 *   +----------------------------------+
 *    Nom du Filtre :    val_contenu
 *   +----------------------------------+
 *    Date : mercredi 22 janvier 2003
 *    Auteur :  JLuc
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *    extraire une valeur d'un champ multicontenu
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, question ou remarque 
 * reportez-vous au forum de l'article :
 * http://www.spip-contrib.net/Filtre-val-contenu-pour-champs
*/

function val_contenu ($texte, $cle)
{
      if (eregi ("#$cle#([^#]*)", $texte, $regs))
         return $regs[1];
      else return "";
}

domaine d’application

A priopri, tous les champs de tous les objets peuvent en bénéficier : TITRE, SOUSTITRE, SURTITRE, DESCRIPTIF, TEXTE, CHAPO, PS, NOM_SITE, ..., pour les ARTICLES, les BREVES, les AUTEURS, les RUBRIQUES, les DOCUMENTS...

exemple

Toujours dans le cas de l’article sur un voyage à Cuba, PS contenant les multiples contenus définis ci-dessus, le filtre val_contenu permet d’y accéder pour les restituer à leur place adéquate dans le squelette :

[(#PS|val_contenu{pays})] 
a une superficie de [(#PS|val_contenu{superficie})] 
et une population de [(#PS|val_contenu{population})].
[Origines : (#PS|val_contenu{origines})].
On y parle [(#PS|val_contenu{langues})].
Sa capitale s'appelle [(#PS|val_contenu{capitale})]

Lorsqu’il n’y a pas de valeur correspondant à la clé demandée, la fonction retourne une chaîne vide, et il est donc possible de le tester avec les crochets [ et ].

Bilan

Le moinss : Cela demande aux rédacteurs de se conformer au formalisme #clé#valeur de la clé# etc... Si c’est pas envisageable, il faudra les EXTRA !

Le plus : C’est souple puisque c’est appelé par les squelettes et qu’on peut définir très finement le contexte d’utilisation : tout le site, ou juste un secteur, ou juste une rubrique, ou juste un article...

Questions / Réponses

-  Pourquoi / quand utiliser cette contrib plutôt que les champs extra ?

Quand tu le sens. Quand tu n’as pas cherché la doc pour les EXTRAs et que tu ne peux donc pas les utiliser. Quand tu as trouvé la doc pour les EXTRA et que tu te sens pas de les utiliser. Quand tu veux quelquechose d’un peu plus contexte-localement-utilisable. Quand tu tombes sur cette contrib et que ça répond à tes besoins.

-  Est-il prévu/envisagé de modifier articles_edit pour générer un formulaire (en fait, autant de input que de champs) au lieu du champs ?

Pas du tout. Les champs EXTRAs sont très bien pour ça.

-  Il y a des # dans mes textes, je peux pas m’en servir comme ça, comment je fais ?

Le caractère # a été choisi car il est rarement utilisé dans les textes. Si il ne convient pas à un contexte donné, il est possible de le remplacer par un autre caractère, ou par une séquence plus rare de caractères, en modifiant le filtre en conséquence.

-  « Quicher » ça veut dire quoi ?

« quicher », c’est patoisant surement ; ça veut dire « mettre, remplir, serrer, tasser ». Les personnes qui emploient cette expression ont souvent un joli sourire... Comme le « moinss », c’est un clin d’œuil hommage à la diversité de nos régions.

-  2020 : eregi est obsolète maintenant. À partir de PHP 5.3 en fait. Comment je fais ?

En effet, il faut désormais utiliser preg_match() avec le modificateur i à la place de eregi, ce qui donne quelque chose du genre :

if (preg_match ("/#$cle#([^#]*)/i", $texte, $regs))
         return $regs[1];

Si vous essayez, vous dîtes si ça marche ?

Discussion

6 discussions

  • J’utilise le filtre avec spip 1.8.2e. Il y un problème si le texte filtré contient ’ ou ° : le texte est coupé et & apparaît à la place du texte manquant.

    J’ai essayé de l’utiliser avec le filtre texte_script mais cela ne change rien.

    Si quelqu’un a une idée, merci d’avance !

    Répondre à ce message

  • Idée assez géniale : facile à mettre en oeuvre, flexible et puissante !

    Que se passe t’il au niveau du moteur de recherche SPIP ? Je suppose que le nom des champs et leur contenu sont indexés.

    J’envisageais d’utiliser ton approche pour encapsuler de l’information interne aux rédacteurs dans les articles, information qui ne serait pas visible par les visiteurs de mon site. Evidement avec l’indexation SPIP, je pense que cela ne marcherait pas.

    Michel

    Répondre à ce message

  • La version 1.7 de Spip code certains caractères et notamment l’apostrophe, ce qui fait que le filtre se retrouve avec des # partout et s’emmêle les pinceaux…

    Répondre à ce message

  • 1

    Salut, super contrib, merci :D

    Juste une question, je souhaiterais comparer cette technique avec la technique d’extra... je cherche la doc depuis un moment... mais je ne sais pas où elle se cache.

    Serait-il possible d’avoir un lien depuis cet article ?

    Meci d’avance

    • La contrib sur les Extra est pour l’instant accessible dans la partir privée de ce site.

    Répondre à ce message

  • très sympa et simple à mettre en oeuvre

    par contre au niveau syntaxe, ça serait plutôt :

    [(#PS|val_contenu{"pays"})] a une superficie ...

    Amicalement

    Répondre à ce message

  • Bonjour,
    Cette contribution paraît bien intéressante. Peut-on voir quelque part un exemple en ligne ? De mon côté, je cherche à mettre sur site de façon très simple, si possible sur SPIP, toute une bibliothèque de livres : auteur, titre, éditeur, année, lieu... pour une petite librairie. L’idéal serait de mettre la base à jour sur Exel par exemple et de l’interfacer avec SPIP, mais je ne suis pas programmeur !... si quelqu’un a des solutions séduisantes à me proposer, je suis preneur !...
    Merci en tout cas pour cette proposition.

    Amicalement,

    Répondre à ce message

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