[spip-dev] |in_any

Salut,

En essayant d'améliorer la doc de #ARRAY, je me prends les pieds dans l'explication qui y est donnée de |in_any:

[(#VAL{abc}|in_any{#GET{tablo}, truc à faire si GET_tablo n'est pas un array}|oui|?{truc à faire si abc est une valeur de GET_tablo, truc à faire si abc n'est pas une valeur de GET_tablo})]

D’après mes tests,
[(#VAL{abc}|in_any{#GET{tablo},"tablo n'est pas un tableau mais on s'en fout parce que ce message ne s'affichera jamais :-)"}|oui|?{
     "tablo est un tableau et abc est dedans
OU tablo est une variable égale à abc
OU tablo n'existe pas OU tablo est vide
OU tablo n'est pas un tableau :-)",
     "tablo est un tableau mais abc n'est pas dedans"})]

Si on enlève le |oui, le résultat semble le même et tant mieux, parce qu'on se demande vraiment pourquoi une syntaxe si compliquée (si oui, si oui, si non, et si peut-être bien)

À mon sens, [(#VAL{abc}|in_any{#GET{tablo}})] devrait simplement retourner " " si la variable tablo est égale à abc ou si le tableau tablo contient la variable et "" dans le cas contraire.

Dès qu'on utilise le deuxième paramètre de in_any, sensée être la valeur par défaut si tablo n'est pas un tableau, les filtres |oui, |non, |sinon et |?{} commencent à produire des comportements incompréhensibles.

On s'en fout un peu de savoir si la variable est un tableau ou non, non?

Aurélie

Aurélie a écrit :

En essayant d'améliorer la doc de #ARRAY, je me prends les pieds dans l'explication qui y est donnée de |in_any:

j'ai tentayé (tenté + essayé) de corriger...

Merci denisb pour la doc.

Pour compléter la réflexion
> À mon sens, [(#VAL{abc}|in_any{#GET{tablo}})] devrait simplement
> retourner " " si la variable tablo est égale à abc ou si le tableau
> tablo contient la variable et "" dans le cas contraire.

En fait, on pourrait carrément faire un nouveau filtre qui couvre la plupart des besoins et prend le tableau en premier paramètre pour plus de lisibilité:
[(#GET{tablo}|contient{abc})]
-> si tablo est un tableau, vérifie que abc en fait partie (|in_array)
-> si tablo est d'un autre type, vérifie l'égalité (|==)
-> sinon, renvoie ""

Dans le troisième cas, on ne sait finalement pas si tablo est un tableau, mais je ne vois pas d'exemple où cette information est utile?

Aurélie

http://www.spip.net/ecrire/?exec=articles&id_article=4009#forum174333

denisb dit:
> ** #ARRAY
>
> * |in_any si ma liste de valeurs $vals n'est pas un tableau je
> retourne la valeur par défaut $def et les parties conditionnelles de
> ma balise seront prises en compte si ma valeur $val est dans le
> tableau $vals je retourne un espace donc le test est positif et les
> parties conditionnelles de ma balise seront prises en compte sinon je
> ne retourne rien et les parties conditionnelles de ma balise ne
> seront pas prises en compte

Y'a quand même un truc que je ne m'explique pas.

Je n'arrive pas à me représenter un cas de figure où ceci trouve une application. Soit la valeur est dans le tableau, ok ça affiche les parties conditionnelles (même chose que |find|oui en fait). Soit le tableau n'existe pas, donc la valeur ne peut pas être dedans, et ça affiche aussi les parties conditionnelles. Quel intérêt???

Dès que l'on utilise in_any avec une valeur par défaut $def, sa seule utilité devient de démontrer
soit que $vals n'est pas un tableau,
soit que $vals ne contient pas $val
mais en aucun cas que $val est dans le tableau!

Enfin, dis-moi si je me trompe.

> >find si ma valeur $val est dans $array et que celui-ci est bien un
> tableau je retourne true (1) et les parties conditionnelles de ma
> balise seront prises en compte sinon (ma $val n'est pas dans le
> tableau ou $array n'est pas un tableau) je retourne false (rien) et
> les parties conditionnelles de ma balise ne seront pas prises en
> compte.
>
> les différences ?
>
> >in_any offre la possibillité de retourner une valeur par défaut.

En définitive, find et in_any sont complètement équivalents dès lors que la variable est un tableau, sauf que find a une syntaxe plus jolie puisqu'il prend le tableau en premier paramètre et que in_any a un résultat plus joli puisqu'il retourne ' ' au lieu de 1 (find demande l'ajout de |oui pour obtenir le même résultat).
[(#GET{mon_tableau}|find{une_valeur}|oui)]
[(#VAL{une_valeur}|in_any{#GET{mon_tableau}})]

Une fois que la variable n'est pas un tableau, in_any offre le must de pouvoir préciser une chaîne à retourner, sauf qu'alors, il ne fait plus le boulot qu'on lui demande, à savoir: nous dire si la valeur est dans le tableau.

Ou bien?

Sauf avis contraire, la solution serait de documenter find et éventuellement is_array pour le surplus, et de jeter in_any aux oubliettes de l'histoire...

Aurélie

PS. pour info, in_any arrive ici: http://trac.rezo.net/trac/spip/changeset/5713/spip/ecrire/inc_filtres.php
(Je ne citerai personne ;-))

>> [(#VAL{abc}|in_any{#GET{tablo}, truc à faire si GET_tablo n'est pas un
>> array}|?{truc à faire si abc est une valeur de GET_tablo, truc à
>> faire si abc n'est pas une valeur de GET_tablo})]
>>
>> D’après mes tests,
>> [(#VAL{abc}|in_any{#GET{tablo},"tablo n'est pas un tableau mais on
>> s'en fout parce que ce message ne s'affichera jamais :-)"}|?{
>> "tablo est un tableau et abc est dedans
>> OU tablo est une variable égale à abc
>> OU tablo n'existe pas OU tablo est vide
>> OU tablo n'est pas un tableau :-)",
>> "tablo est un tableau mais abc n'est pas dedans"})]
[...]
>> Dès qu'on utilise le deuxième paramètre de in_any, sensée être la
>> valeur par défaut si tablo n'est pas un tableau, les filtres |oui,
>> >non, |sinon et |?{} commencent à produire des comportements
>> incompréhensibles.
[...]

Je n'ai pas suivi la discussion, j'explique simplement de mémoire ce que je crois de |in_any : il permet de comparer une valeur à un tableau, exactement comme in_array() en PHP, sauf que, php nécessite que le second argument soit un tableau. Donc quand la variable n'est pas définie par exemple, in_array() est pas content...

[(#VAL|in_array{#JE_SUIS_PAS_LA})] <-- php aime pas du tout…
[(#VAL|in_any{#JE_SUIS_PAS_LA})] <-- SPIP n'appelle pas in_array si on n'a pas un tableau. --> php ne rale pas...

Ça ne sert qu'à cela :slight_smile:
Cela dit, donc, quelques exemples :

[(#VAL{8}|in_any{#JE_SUIS_PAS_LA}|oui) Ne doit rien afficher ! ]
[(#VAL{8}|in_any{8}|oui) Ne doit rien afficher (pas un tableau) ! ]
[(#VAL{8}|in_any{#ARRAY{0,8}}|oui) Affiche évidemment ! ]

Ok. Mais donc, |find fait ça très bien aussi. Dans ce sens, on peut les documenter comme équivalents.

La question portait sur la spécificité de in_any en ce qu'il accepte un paramètre optionnel pour dire #JE_SUIS_PAS_LA n'est pas un tableau. Sauf qu'alors il perd sa capacité à dire #JE_SUIS_PAS_LA contient 8.

// http://doc.spip.org/@in_any
function in_any($val, $vals, $def='') {
   return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : ''));
}

in_any retourne un résultat (soit $def soit ' ') que $vals ne soit pas un tableau ou que $vals contienne $val. Donc la partie optionnelle de la balise s'affiche et aussi toutes les variantes possibles de "si oui".

Je ne critique pas la fonction in_any en tant que telle, qui a dû être créée pour répondre à un usage, mais bien l'intérêt de la documenter comme filtre de SPIP (et donc, sa présence dans inc/filtres.php).

Si on me donne un exemple d'un usage de in_any dans les squelettes (autre que ce qu'on fait avec |find), je veux bien le documenter. Dans le cas contraire, je ne le mentionne simplement pas dans la doc (option prise actuellement).

Aurélie

Ok. Mais donc, |find fait ça très bien aussi. Dans ce sens, on peut les documenter comme équivalents.

#TABLEAU|find{#VAL} (je ne me rappelais pas du tout de ce filtre là)
#VAL|in_any{#TABLEAU} sont equivalent oui… mais arguments inversés. Mais find renvoie 0 ou 1 (pas ' ' ou '' ou $def).

La question portait sur la spécificité de in_any en ce qu'il accepte un paramètre optionnel pour dire #JE_SUIS_PAS_LA n'est pas un tableau. Sauf qu'alors il perd sa capacité à dire #JE_SUIS_PAS_LA contient 8.

Je ne comprends pas ce que tu veux dire ; mais je vois pas trop l'utilité d'un 3è argument effectivement.
[(#VAL{8}|in_any{#ARRAY{0,3}, defaut}|oui) valeur par défaut affichée ]
[(#VAL{8}|in_any{#ARRAY{0,8}, defaut}|oui) ' ' affiché ]
[(#VAL{8}|in_any{#ARRAY{0,8}}|oui) Rien n'est affiché ]

in_any retourne un résultat (soit $def soit ' ') que $vals ne soit pas un tableau ou que $vals contienne $val. Donc la partie optionnelle de la balise s'affiche et aussi toutes les variantes possibles de "si oui".

Pas compris, mais pas grave...

Un exemple dans SPIP :
[(#VAL{articles}|in_any{#ENV{tables_liees}})checked='checked']
(prive/formulaire/editer_groupes_mots)

S'lt

Je ne maitrise ni le premier ni le second, mais voici mon avis au vu
de cet échange.

Nous avons deux filtres équivalent find et in_any. |find a
l'antériorité au second et semble faire le meme travail.
Dans un premier temps, je t'invite à faire une recherche dans la zone
et le core pour trouver d'autres cas d'utilisation. Si |find semble
résoudre tous les cas trouvés alors ne commente que celui ci.

Si tu as des cas avec |in_any qui semblent non pertinent/remplaçable
dans ce cas indique les nous. On essaiera alors de faire sauter ce
second filtre qui serait alors inutile.
De meme on peut imaginer faire évoluer |find en terme de résultat pour
être plus lisible. (si on n'a pas de regression sur ce point)

Il est inconvenant d'avoir deux filtres identiques. Attaquons le
régime post Noël :slight_smile:

Km

cam.lafit@azerttyu.net a écrit :