[spip-dev] Comportement inatendu du critère conditionnel {recherche ?}

Bonjour à tous,

J'ai déjà envoyé un message sur spip.user qui n'a pas eu beaucoup de succès
et comme ce que j'ai découvert ressemble à un petit bug (en tout cas un
comportement qui n'est pas documenté), je le rapporte ici.
Voir http://thread.gmane.org/gmane.comp.web.spip.user/128423 pour le message
originel.

J'ai remarqué sur Spip stable (1.9.2d par ex.), que le critère conditionnel
{recherche ?} a un comportement étrange quand la recherche passée en
contexte ne donne pas de résultat :
en effet, si le(s) mot(s) passé(s) dans le contexte de recherche
(#ENV{recheche}) n'existe(ent) pas dans le site, les boucles qui utilisent
{recherche ?} retournent l'ensemble des objets au lieu d'aucun ! Alors que
si ce qui est passé en contexte existe sur le site, la boucle renvoie bien
seulement les objets dans lesquels la recherche a été fructueuse.
Ex:
<BOUCLE_Articles(ARTICLES){recherche?}{"<br>"}>
<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_Articles>

Retourne tous les articles de la base si on passe en
contexte «recherche=dkjsbv» (qu'on a aucune chance de trouver sur le
site... enfin sur la plupart en tout cas !). Alors que cette boucle ne
devrait retourner aucun article. Mais un contexte
contenant «recherche=spip» donnera bien une sélection de résultats
pertinents.

Est-ce que quelqu'un avait déjà remarqué ça ? Si oui, avez-vous un moyen
joli de contourner ce problème (en évitant de multiplier les boucles, ce
qui était l'objectif des critères conditionnels) ?

MARNE Bertrand a écrit :

Bonjour à tous,

J'ai déjà envoyé un message sur spip.user qui n'a pas eu beaucoup de succès
et comme ce que j'ai découvert ressemble à un petit bug (en tout cas un
comportement qui n'est pas documenté), je le rapporte ici.
Voir http://thread.gmane.org/gmane.comp.web.spip.user/128423 pour le message
originel.

J'ai remarqué sur Spip stable (1.9.2d par ex.), que le critère conditionnel
{recherche ?} a un comportement étrange quand la recherche passée en
contexte ne donne pas de résultat :
en effet, si le(s) mot(s) passé(s) dans le contexte de recherche
(#ENV{recheche}) n'existe(ent) pas dans le site, les boucles qui utilisent
{recherche ?} retournent l'ensemble des objets au lieu d'aucun ! Alors que
si ce qui est passé en contexte existe sur le site, la boucle renvoie bien
seulement les objets dans lesquels la recherche a été fructueuse.
Ex:
<BOUCLE_Articles(ARTICLES){recherche?}{"<br>"}>
<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_Articles>

Retourne tous les articles de la base si on passe en
contexte «recherche=dkjsbv» (qu'on a aucune chance de trouver sur le
site... enfin sur la plupart en tout cas !). Alors que cette boucle ne
devrait retourner aucun article. Mais un contexte
contenant «recherche=spip» donnera bien une sélection de résultats
pertinents.

Est-ce que quelqu'un avait déjà remarqué ça ? Si oui, avez-vous un moyen
joli de contourner ce problème (en évitant de multiplier les boucles, ce
qui était l'objectif des critères conditionnels) ?

Oui, j'ai déjà remarqué ce comportement, mais je me suis dit que c'était sans doute un comportement normal, en ce sens que {recherche ?} veut dire "on filtre sur le critère de recherche si et seulement si on a saisi une chaine dans le formulaire de recherche, sinon on affiche tout".

Le résultat est donc identique dans les 2 cas suivants :
- on ne demande aucune chaine particulière ( #ENV{recherche} est vide)
- on demande une chaine qui n'existe pas*

Mais il est vrai que ce serait plus logique d'obtenir 3 cas :
- on ne demande aucune chaine particulière => on obtient tout
- on demande une chaine qui existe => on obtient une liste filtrée
- on demande une chaine qui n'existe pas => on obtient rien

Sachant que le critère {recherche ?} est placé dans une boucle où d'autres critères de choix sont possibles (date, auteur...) j'ai expliqué aux utilisateurs du site que la recherche agissait plus comme un "filtre" que comme une vraie fonction de recherche; ils ont semblé convaincus...

Cyril.

*ou trop court, je crois que le moteur ne fonctionne que pour des chaines de 3 caractères au moins.

MARNE Bertrand a écrit :

Est-ce que quelqu'un avait déjà remarqué ça ? Si oui, avez-vous un moyen
joli de contourner ce problème (en évitant de multiplier les boucles, ce
qui était l'objectif des critères conditionnels) ?

Oui, j'avais même fait un ticket, et qui a été corrigé :
http://trac.rezo.net/trac/spip/ticket/1143

Et comme c'est dans le core, et que c'est pas un problème de sécurité, bah la 192 elle bouge pas. Donc pour que ça marche il faut utiliser SPIP 2.0 :slight_smile:

RastaPopoulos wrote:

MARNE Bertrand a écrit :
Oui, j'avais même fait un ticket, et qui a été corrigé :
http://trac.rezo.net/trac/spip/ticket/1143

Effectivement, cela avait échappé à mes investigations !

Et comme c'est dans le core, et que c'est pas un problème de sécurité,
bah la 192 elle bouge pas. Donc pour que ça marche il faut utiliser SPIP
2.0 :slight_smile:

J'ai fait la modif' sur une 1.9.2d et suis en cours de tests: ça fonctionne
pour l'instant ! Je teste encore un peu avant la production...

Merci beaucoup tu vas m'éviter des boucles conditionnelles moches !!