rechercher dans des tables externes

Bien le bonjour à tous,

Bon, j'en suis encore a mon probleme de recherche dans des tables externes mais je tiens peut etre qqchose...

je fais 2 pages :

test0.html :
------------

--8<-----8<-----8<-----8<-----8<-----8<---

<form action="spip.php?page=test1" method="post">
   <input type="text" name="field1"/>
   <input type="submit" />
</form>

--8<-----8<-----8<-----8<-----8<-----8<---

bon, rien de sorcier la,

test1.html :
------------

--8<-----8<-----8<-----8<-----8<-----8<---

<BOUCLE_aa(memo_adr){pays==#ENV{field1, ".*"}}{"<br />"}>
   #ID - #ORG1 - #PAYS
</BOUCLE_aa>
</B_aa>
No results...
<//B_aa>

--8<-----8<-----8<-----8<-----8<-----8<---

La, je cherche dans la table 'memo_adr' tous les enregistrements dont le pays contient ce que j'ai mis dans le champ de la page precedente. si ce dernier est vide, je met '.*' qui en regexp veut grosso modo dire : "tout"

Ca marche pas mal... Si je met 'ran', ca me sort tout ce qui est en france et tout ce qui est en Grande Bretagne. Normal. Mais si je met 'U.S', ca me sort tout ce qui est aux U.S.A et tout ce qui est en suisse. C'est normal car en regexp, u.s signifie 'tout ce qui contient un u et un s séparés par n'importe quel caractere' donc, U.S.A ressort mais aussi suisse (uis)

Est ce que qq1 a une idée de comment faire soit pour escaper les caracteres de #ENV{field1} si ce dernier n'est pas vide ou bien pour ne pas passer par une regexp mais pouvoir faire un like a la place d'un '=' ou une autre idée...

Merci d'avance.

Chag

--
"Ca ne marche pas" ne veut rien dire. Alors ne dites rien
"it doesn't work" means nothing. So, say nothing

chag a écrit :

Est ce que qq1 a une idée de comment faire soit pour escaper les caracteres de #ENV{field1} si ce dernier n'est pas vide ou bien pour ne pas passer par une regexp mais pouvoir faire un like a la place d'un '=' ou une autre idée...

Fait une recherche sur la liste dev car fil avait introduit expérimentalement le critère LIKE justement.
Son exemple est :
<BOUCLE_a(ARTICLES){titre like (#ENV{initiale,A}|concat{'%'})}>
#TITRE
</BOUCLE_a>

Je ne crois pas que ça ait bougé depuis.

MM.

whaou... nickel. bon, me reste plus qu'a trouver comment rajouter un '%' devant :slight_smile:

merci

Chag

Matthieu Marcillaud a écrit :

chag a écrit :

Est ce que qq1 a une idée de comment faire soit pour escaper les caracteres de #ENV{field1} si ce dernier n'est pas vide ou bien pour ne pas passer par une regexp mais pouvoir faire un like a la place d'un '=' ou une autre idée...

Fait une recherche sur la liste dev car fil avait introduit expérimentalement le critère LIKE justement.
Son exemple est :
<BOUCLE_a(ARTICLES){titre like (#ENV{initiale,A}|concat{'%'})}>
#TITRE
</BOUCLE_a>

Je ne crois pas que ça ait bougé depuis.

MM.

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.spip.net/
irc://irc.freenode.net/spip
FAQ : http://www.spip-contrib.net/spikini/FaQ

--
"Ca ne marche pas" ne veut rien dire. Alors ne dites rien
"it doesn't work" means nothing. So, say nothing

chag a écrit :

whaou... nickel. bon, me reste plus qu'a trouver comment rajouter un '%' devant :slight_smile:

merci

Bah...
[(#ENV{toto}|=={''}|?{'','%'}|concat{#ENV{toto}}|concat{'%'})]

Ca devrait donner % si toto est vide ou %lemot% sinon...
(testé et OK !)

Cette syntaxe aussi fonctionne mais renvoie %% ou %lemot% : [(#REM|concat{'%'}|concat{#ENV{toto}}|concat{'%'})]

Le mettre dans un set avant peut être ?
#SET{like, [(#ENV{toto}|=={''}|?{'','%'}|concat{#ENV{toto}}|concat{'%'})]}

<BOUCLE_a(ARTICLES){titre like #GET{like}}>

MM.

genial, merci :slight_smile: j'etais passé par un filtre perso :slight_smile:

Chag

Matthieu Marcillaud a écrit :

chag a écrit :

whaou... nickel. bon, me reste plus qu'a trouver comment rajouter un '%' devant :slight_smile:

merci

Bah...
[(#ENV{toto}|=={''}|?{'','%'}|concat{#ENV{toto}}|concat{'%'})]

Ca devrait donner % si toto est vide ou %lemot% sinon...
(testé et OK !)

Cette syntaxe aussi fonctionne mais renvoie %% ou %lemot% : [(#REM|concat{'%'}|concat{#ENV{toto}}|concat{'%'})]

Le mettre dans un set avant peut être ?
#SET{like, [(#ENV{toto}|=={''}|?{'','%'}|concat{#ENV{toto}}|concat{'%'})]}

<BOUCLE_a(ARTICLES){titre like #GET{like}}>

MM.

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.spip.net/
irc://irc.freenode.net/spip
FAQ : http://www.spip-contrib.net/spikini/FaQ

--
"Ca ne marche pas" ne veut rien dire. Alors ne dites rien
"it doesn't work" means nothing. So, say nothing

Yop,

peut on faire un 'OR' dans une requete generee par une boucle ?
J'ai une table avec 3 champs et je voudrai savoir si l'un de ces 3 champs contient une certaine valeur.

Chag

--
"Ca ne marche pas" ne veut rien dire. Alors ne dites rien
"it doesn't work" means nothing. So, say nothing

chag a écrit :

Yop,

peut on faire un 'OR' dans une requete generee par une boucle ?
J'ai une table avec 3 champs et je voudrai savoir si l'un de ces 3 champs contient une certaine valeur.

Chag

Ca devient compliqué !

Proposition en 4 boucles (autant que de champs à tester ! + 1 qui affiche)

#SET{like, [(#ENV{toto}|=={''}|?{'','%'}|concat{#ENV{toto}}|concat{'%'})]}

#SET{tab_id_articles_recherches, #ARRAY{0,0}}
<BOUCLE_a(ARTICLES){titre like #GET{like}}>
[(#GET{tab_id_articles_recherches}|array_push{#ID_ARTICLE})]
</BOUCLE_a>

<BOUCLE_b(ARTICLES){soustitre like #GET{like}}>
[(#GET{tab_id_articles_recherches}|array_push{#ID_ARTICLE})]
</BOUCLE_b>

<BOUCLE_c(ARTICLES){chapo like #GET{like}}>
[(#GET{tab_id_articles_recherches}|array_push{#ID_ARTICLE})]
</BOUCLE_c>

[(#REM) bon, il faut enlever les doublons... array_unique(), mais comment ? ]

#SET{tab_id_articles_recherches_dedoublonnes, [(#GET{tab_id_articles_recherches}|array_unique)]}

<BOUCLE_affichage(ARTICLES){id_article IN #GET**{tab_id_articles_recherches_dedoublonnes}}>
  #TITRE<br />
</BOUCLE_affichage>

Je n'ai même pas oser tester tellement ça parait tordu :wink:

Dis nous si tu arrives à faire quelque chose avec ça !
Les critères OU, c'est pas vraiment prévu !

MM.

Matthieu Marcillaud wrote:

[(#REM) bon, il faut enlever les doublons... array_unique(), mais comment ? ]

Ben, justement en utilisant {doublons} , ça pourrait donner:

<BOUCLE_elimine(ARTICLES){titre!==#ENV{toto}}{soustitre!==#ENV{toto}}{chapo!==#ENV{toto}}{doublons}>
[(#REM)#ID_ARTICLE]
</BOUCLE_elimine>

<BOUCLE_affichage(ARTICLES){doublons}>
  #TITRE<br />
</BOUCLE_affichage>

La première boucle n'affiche rien, elle sert juste à éliminer les articles n'ayant #ENV{toto} ni dans titre, soustitre ou chapo.
J'ai mis une [(#REM)#ID_ARTICLE] dedans car il semble me souvenir que {doublons} ne fonstionne que si l'élément est utilisé dans la boucle (à confirmer)

J'ai utilisé match (==) car je ne sais pas si like accepte une négation, éventuellement si on veut des mots complets il faudrait encadrer #ENV{toto} par des \b (word boundary)

... enfin, comme tu dis, ça devient compliqué :slight_smile:
--
toggg

chag a écrit :

Yop,

bon, j'ai bien essaye d'utiliser les doublons sur les tables externes mais il doit me manquer un truc car ca ne marche pas.

C'est dommage, ça permettrait une syntaxe plus courte pour récupérer le tableau de ces éléments... Tu as vraiment besoin de like en fait sur ces champs consult1 ?

Dans l'idéal, si tu peux faire la syntaxe de toggg, ça raccourcirait un peu le nombre de boucles.

<BOUCLE_elimine_lieu(memo_fiches)
    {consult1!==#ENV{consult}}
    {consult3!==#ENV{consult}}
    {doublons}
>
[(#REM)#REF]
</BOUCLE_elimine_lieu>

(tu dois même pouvoir mettre si ça se trouve : !like à la place de !== ?)
Mais, je me demande si la boucle fait bien ce que tu souhaites, j'ai l'impression qu'elle elimine tout en fait, sauf les entrées qui ont ==#ENV{consult} dans les 3 champs en même temps. Encore un AND au lieu d'un OR ?
Toi, c'est éliminer les entrées qui n'ont #ENV{consult} dans aucun des 3 champs que tu veux évidemment !

<BOUCLE_resultat_bd(memo_fiches)
  {auteur like (#ENV{nom_auteur}|=={''}|?{'','%'}|concat{#ENV{nom_auteur}}|concat{'%'})}
  {titre like (#ENV{titre}|=={''}|?{'','%'}|concat{#ENV{titre}}|concat{'%'})}
  {sujets like (#ENV{theme}|=={''}|?{'','%'}|concat{#ENV{theme}}|concat{'%'})}
  {pays like (#ENV{pays}|=={''}|?{'','%'}|concat{#ENV{pays}}|concat{'%'})}
  {doublons}
  {"<br />"} {par auteur}
>
    #AUTEUR
</BOUCLE_resultat_bd>

    [(#REM) pas de résultat, on fait sans consult (pas de doublons)...]

    <BOUCLE_resultat_bd_tout(memo_fiches)
      {auteur like (#ENV{nom_auteur}|=={''}|?{'','%'}|concat{#ENV{nom_auteur}}|concat{'%'})}
      {titre like (#ENV{titre}|=={''}|?{'','%'}|concat{#ENV{titre}}|concat{'%'})}
      {sujets like (#ENV{theme}|=={''}|?{'','%'}|concat{#ENV{theme}}|concat{'%'})}
      {pays like (#ENV{pays}|=={''}|?{'','%'}|concat{#ENV{pays}}|concat{'%'})}
      {"<br />"} {par auteur}
    >
        #AUTEUR
    </BOUCLE_resultat_bd_tout>

<//BOUCLE_resultat_bd>

J'ai donc fait autrement. c'est surement pas top mais ca devrait aller :

Mais, si ca fonctionne comme tu as fait, c'est déjà merveilleux !
Tu es presque chanceux :wink:

MM.

Cette syntaxe aussi fonctionne mais renvoie %% ou %lemot% :
[(#REM|concat{'%'}|concat{#ENV{toto}}|concat{'%'})]

Il vaudrait mieux utiliser #NOOP pour ce genre de trucs, #REM est réserver
aux commentaires de code et ne devrait pas servir à ce dernier.

Il vaudrait mieux utiliser #NOOP pour ce genre de trucs, #REM est réserver
aux commentaires de code et ne devrait pas servir à ce dernier.

D'un autre côté #NOOP est sensible à un paramètre ?noop=truc passé
dans l'URL.

-- Fil

Fil a écrit :

Il vaudrait mieux utiliser #NOOP pour ce genre de trucs, #REM est réserver
aux commentaires de code et ne devrait pas servir à ce dernier.

D'un autre côté #NOOP est sensible à un paramètre ?noop=truc passé
dans l'URL.

Heu... voyez-vous, c'est une chose que je n'avais pas vu passé ce #NOOP ... #REM est sur spip.net, mais pas cette balise.

Heu, mis à part "no operation", et des exemples sur la zone, je n'ai pas retrouvé les archives. Quelqu'un peut il dire à quoi sert cette balise ? (je comprends volontiers que #rem n'est pas bien adapté ici)

Est-ce qu'on peut dire : #rem = commentaires et #noop = lancer des traitements ? [(#noop|filtre) et autre chose ]

MM.

> Il vaudrait mieux utiliser #NOOP pour ce genre de trucs, #REM est
> réserver aux commentaires de code et ne devrait pas servir
à ce dernier.

D'un autre côté #NOOP est sensible à un paramètre ?noop=truc
passé dans l'URL.

Ah mais ça c'est pas faute d'avoir milité pour qu'il rejoigne #REM dans le
core...

Heu... voyez-vous, c'est une chose que je n'avais pas vu
passé ce #NOOP ... #REM est sur spip.net, mais pas cette balise.

Heu, mis à part "no operation", et des exemples sur la zone,
je n'ai pas retrouvé les archives. Quelqu'un peut il dire à
quoi sert cette balise ?
(je comprends volontiers que #rem n'est pas bien adapté ici)

En fait, toutes les balises que SPIP ne connaît ne renvoient rien par défaut
(sauf présence dans l'environnement). Donc tu pourrais tout aussi bien
écrire [(#MABALISEQUIFAITDESTRUCS|filtre)], filtre ne recevrait rien (et
agirait en conséquence). La formalisation #REM/#NOOP a été introduite il y a
peut-être deux ans pour essayer de formaliser certains 'hacks' qui
permettaient de déclencher des fonctions PHP sans avoir besoin de contenu,
sans pour autant perturber la lecture des squelettes (puisqu'on sait qu'on a
affaire à un commentaire quand on croise #REM, à un appel à une fonction
étrange quand on croise #NOOP).

Bref, #NOOP devrait être dans le core et renvoyer systèmatiquement vide.

Est-ce qu'on peut dire : #rem = commentaires et #noop =
lancer des traitements ? [(#noop|filtre) et autre chose ]

Oui, on devrait pouvoir le dire.

> D'un autre côté #NOOP est sensible à un paramètre ?noop=truc
> passé dans l'URL.

Ah mais ça c'est pas faute d'avoir milité pour qu'il rejoigne #REM dans le
core...

Fais un ticket ? Personnellement je ne suis pas pour (mais pas
hostile non plus).

-- Fil

> Ah mais ça c'est pas faute d'avoir milité pour qu'il rejoigne #REM
> dans le core...

Fais un ticket ? Personnellement je ne suis pas pour (mais
pas hostile non plus).

Hop: http://trac.rezo.net/trac/spip/ticket/948