critere like et blocs multi

Bonjour a tous,

Dans la série questions casse-tete-ou-toutes-bêtes-mais-j-ai-tellement-la-tete-dans-le-guidon-que-je-deviens-benêt, quelqu’un aurait-il une piste concernant le problème suivant ?

  • Des mots-clés dont le titre contient une balise multi

  • Une boucle MOTS

  • Un critère de boucle LIKE

→ Des réponses de boucle insatisfaisantes, vu que le LIKE recherche dans tout le champ titre, et pas uniquement dans la partie du bloc multi réservé a la langue de l’environnement.

Un exemple : Si je veux afficher, sur la version anglaise de mon site, tous les mots-clés contenant « equa », un des résultats est « Ecuador », vu que le titre du mot-clé est « [en]Ecuador[fr]Equateur »…

Quelqu’un aurait-il une solution qui va bien a ce petit problème, svp ? :slight_smile:

Alex Gomes

IT Unit

ITUC International Trade Union Confederation

Boulevard du Roi Albert II 5, B 1, B-1210 Brussels, Belgium
Tel: 32(0)2 224 0211 Direct: (0)2 224 0281

Le 20/05/10 17:25, Gomes, Alex a écrit :

Quelqu'un aurait-il une solution qui va bien a ce petit problème, svp ? :slight_smile:

hum...

hypothèse :

une boucle doit rechercher sur MOTS en fonction d'une valeur
passée dans le contexte et ce, uniquement dans la langue du contexte.

donc :
   #SET{regmult, #VAL{\[#LANG\][^\*}|concat{#ENV{rec}}}
   <BOUCLE_m(MOTS) {titre == #GET{regmult}} {"<br />"}>
     #TITRE
   </BOUCLE_m>

explications :

   #SET
      on définit préalablement la regexp qui sera utilisée dans
      le critère. ce faisant, on se permet d'utiliser les [
      qui exploseraient le critère sinon ;

   #VAL
      obligatoire pour pouvoir utiliser le |concat qui suit ;

   \[#LANG\]
      permet de récupérer la langue du contexte : deviendra donc
      littéralement [fr] ou [en] ;

   [^\*
      suite du motif de la regexp : n'importe quel caractère autre que [
      zéro ou plusieurs fois. permet ainsi de se limiter à un seul
      élément du bloc <multi> compris entre ] et [ ;

   |concat
      obligatoire pour que #ENV ne soit pas pris comme motif
      de la regexp mais bien interprété par le compilateur de spip.
      dans notre exemple deviendra donc littéralement equa .

à partir de l'exemple donné :
   recherche de 'equa' dans '<multi>[en]Ecuador[fr]Equateur</multi>'

le sql résultant dans un contexte anglais :
   mots.titre REGEXP '\\[en\\][^\\*equa'
donc rien (aucun retour)

le sql résultant dans un contexte français :
   mots.titre REGEXP '\\[fr\\][^\\*equa'
donc 'Equateur' (bon retour)

note 1 : je n'ai pas trouvé comment faire plus simple, désolé.
note 2 : testé *rapidement*, il y a sans doute des améliorations
          possibles.

Wow...merci mille fois; je testerai ca demain!

-----Original Message-----
From: denisb [mailto:denisb@laposte.net]
Sent: jeudi 20 mai 2010 18:53
To: spip@rezo.net
Subject: Re: [Spip] critere like et blocs multi

Le 20/05/10 17:25, Gomes, Alex a écrit :

Quelqu'un aurait-il une solution qui va bien a ce petit problème, svp ? :slight_smile:

hum...

hypothèse :

une boucle doit rechercher sur MOTS en fonction d'une valeur
passée dans le contexte et ce, uniquement dans la langue du contexte.

donc :
   #SET{regmult, #VAL{\[#LANG\][^\*}|concat{#ENV{rec}}}
   <BOUCLE_m(MOTS) {titre == #GET{regmult}} {"<br />"}>
     #TITRE
   </BOUCLE_m>

explications :

   #SET
      on définit préalablement la regexp qui sera utilisée dans
      le critère. ce faisant, on se permet d'utiliser les [
      qui exploseraient le critère sinon ;

   #VAL
      obligatoire pour pouvoir utiliser le |concat qui suit ;

   \[#LANG\]
      permet de récupérer la langue du contexte : deviendra donc
      littéralement [fr] ou [en] ;

   [^\*
      suite du motif de la regexp : n'importe quel caractère autre que [
      zéro ou plusieurs fois. permet ainsi de se limiter à un seul
      élément du bloc <multi> compris entre ] et [ ;

   |concat
      obligatoire pour que #ENV ne soit pas pris comme motif
      de la regexp mais bien interprété par le compilateur de spip.
      dans notre exemple deviendra donc littéralement equa .

à partir de l'exemple donné :
   recherche de 'equa' dans '<multi>[en]Ecuador[fr]Equateur</multi>'

le sql résultant dans un contexte anglais :
   mots.titre REGEXP '\\[en\\][^\\*equa'
donc rien (aucun retour)

le sql résultant dans un contexte français :
   mots.titre REGEXP '\\[fr\\][^\\*equa'
donc 'Equateur' (bon retour)

note 1 : je n'ai pas trouvé comment faire plus simple, désolé.
note 2 : testé *rapidement*, il y a sans doute des améliorations
          possibles.

_______________________________________________
liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

Le 20/05/2010 18:53, denisb a écrit :

une boucle doit rechercher sur MOTS en fonction d'une valeur
passée dans le contexte et ce, uniquement dans la langue du contexte.

donc :
#SET{regmult, #VAL{\[#LANG\][^\*}|concat{#ENV{rec}}}
<BOUCLE_m(MOTS) {titre == #GET{regmult}} {"<br />"}>
#TITRE
</BOUCLE_m>

explications :

yeah, ça mériterait d'intégrer une boite à outil multilinguisme,
ou de devenir un critère du core genre {multi titre == xxx}...

"en attendant" je l'ai ajouté dans
http://www.spip-contrib.net/FAQ-Multilinguisme

JLuc

#SET
on définit préalablement la regexp qui sera utilisée dans
le critère. ce faisant, on se permet d'utiliser les [
qui exploseraient le critère sinon ;

#VAL
obligatoire pour pouvoir utiliser le |concat qui suit ;

\[#LANG\]
permet de récupérer la langue du contexte : deviendra donc
littéralement [fr] ou [en] ;

[^\*
suite du motif de la regexp : n'importe quel caractère autre que [
zéro ou plusieurs fois. permet ainsi de se limiter à un seul
élément du bloc <multi> compris entre ] et [ ;

|concat
obligatoire pour que #ENV ne soit pas pris comme motif
de la regexp mais bien interprété par le compilateur de spip.
dans notre exemple deviendra donc littéralement equa .

à partir de l'exemple donné :
recherche de 'equa' dans '<multi>[en]Ecuador[fr]Equateur</multi>'

le sql résultant dans un contexte anglais :
mots.titre REGEXP '\\[en\\][^\\*equa'
donc rien (aucun retour)

le sql résultant dans un contexte français :
mots.titre REGEXP '\\[fr\\][^\\*equa'
donc 'Equateur' (bon retour)