Officialiser extension du filtre |plus #5389

Open
opened 7 months ago by JLuc · 8 comments
JLuc commented 7 months ago

Le filtre |plus est documenté comme "arithmétique" et PHPdocumenté comme acceptant 2 arguments de type int.

La fonction plus n'est toutefois pas typée, ce qui permet de lui passer autre chose que des entiers, des tableaux par exemple ; auquel cas il réalise le merge de ses arguments.

C'est ce que fait par exemple une branche du plugin favicon dans ce code :

#SET{manifest, #ARRAY{
	name, #CONFIG{favmanifest/name, #NOM_SITE_SPIP},
}}
[(#CONFIG{favmanifest/short_name}|oui)
	#SET{manifest, #GET{manifest}|plus{#ARRAY{short_name, #CONFIG{favmanifest/short_name}}}}

Peut on officialiser cette possibilité, la PHPDocumenter et la documenter ?

Le filtre `|plus` est documenté comme "arithmétique" et *PHPdocumenté* comme acceptant 2 arguments de type `int`. La *fonction* `plus` n'est toutefois pas typée, ce qui permet de lui passer autre chose que des entiers, des tableaux par exemple ; auquel cas il réalise le merge de ses arguments. C'est ce que fait par exemple une branche du plugin `favicon` dans ce code : ``` #SET{manifest, #ARRAY{ name, #CONFIG{favmanifest/name, #NOM_SITE_SPIP}, }} [(#CONFIG{favmanifest/short_name}|oui) #SET{manifest, #GET{manifest}|plus{#ARRAY{short_name, #CONFIG{favmanifest/short_name}}}} ``` Peut on officialiser cette possibilité, la PHPDocumenter et la documenter ?
touti commented 7 months ago
Owner

Bonjour,
je trouve que ce n'est pas une bonne pratique d'avoir plusieurs façons d'aboutir au même résultat car cela peut prêter à confusion pour les utilisateurices et de la maintenance également pour les devs SPIP.

Comme ici utiliser |plus pour faire ce que |array_merge fait très bien.

Pour moi, c'est un hack (bidouille) qui n'est pas à documenter mais à corriger.

++

Bonjour, je trouve que ce n'est pas une bonne pratique d'avoir plusieurs façons d'aboutir au même résultat car cela peut prêter à confusion pour les utilisateurices et de la maintenance également pour les devs SPIP. Comme ici utiliser |plus pour faire ce que |array_merge fait très bien. Pour moi, c'est un hack (bidouille) qui n'est pas à documenter mais à corriger. ++
Owner
array_merge et + ne font pas la même chose sur les array : https://stackoverflow.com/questions/5394157/whats-the-difference-between-array-merge-and-array-array
JLuc commented 7 months ago
Poster

Effectivement + n'est pas identique à array_merge dans le cas où des clés identiques existent dans les tableaux.

Effectivement `+` n'est pas identique à `array_merge` dans le cas où des clés identiques existent dans les tableaux.
b_b added the
documentation
label 7 months ago
b_b commented 7 months ago
Owner

Je suis du même avis que @touti => c'est un usage détourné à ne pas documenter.

Je suis du même avis que @touti => c'est un usage détourné à ne pas documenter.
Owner

Même avis que @touti et @b_b : c’est fait pour faire une addition (float ou int, je présume), rien d’autre. Pour typer le code comme cela (int|float), il faut PHP 8.0 minimum.

L’usage là dans Favicon de |plus me semble plutôt malencontreux, et non compréhensible. Dans le cas d’usage mentionné, |array_merge conviendrait.

Tu pourrais aussi probablement faire quelque chose plus clair comme

Avant

#SET{manifest, #ARRAY{
	name, #CONFIG{favmanifest/name, #NOM_SITE_SPIP},
}}
[(#CONFIG{favmanifest/short_name}|oui)
	#SET{manifest, #GET{manifest}|plus{#ARRAY{short_name, #CONFIG{favmanifest/short_name}}}}
]
[(#CONFIG{favmanifest/description}|oui)
	#SET{manifest, #GET{manifest}|plus{#ARRAY{description, #CONFIG{favmanifest/description}}}}
]
[(#CONFIG{favmanifest/display}|oui)
	#SET{manifest, #GET{manifest}|plus{#ARRAY{display, #CONFIG{favmanifest/display}}}}
]

Après

#SET{manifest, #ARRAY{
	name, #CONFIG{favmanifest/name, #NOM_SITE_SPIP},
	short_name, #CONFIG{favmanifest/short_name},
	description, #CONFIG{favmanifest/description},
	display, #CONFIG{favmanifest/display},
}|array_filter}

Le array_filter n’étant là que pour enlever les clés possiblement vides (mais je ne suis même pas sûr que ça soit nécessaire pour l’usage ensuite)...

Même avis que @touti et @b_b : c’est fait pour faire une addition (float ou int, je présume), rien d’autre. Pour typer le code comme cela (`int|float`), il faut PHP 8.0 minimum. L’usage là dans Favicon de `|plus` me semble plutôt malencontreux, et non compréhensible. Dans le cas d’usage mentionné, `|array_merge` conviendrait. Tu pourrais aussi probablement faire quelque chose plus clair comme Avant ```html #SET{manifest, #ARRAY{ name, #CONFIG{favmanifest/name, #NOM_SITE_SPIP}, }} [(#CONFIG{favmanifest/short_name}|oui) #SET{manifest, #GET{manifest}|plus{#ARRAY{short_name, #CONFIG{favmanifest/short_name}}}} ] [(#CONFIG{favmanifest/description}|oui) #SET{manifest, #GET{manifest}|plus{#ARRAY{description, #CONFIG{favmanifest/description}}}} ] [(#CONFIG{favmanifest/display}|oui) #SET{manifest, #GET{manifest}|plus{#ARRAY{display, #CONFIG{favmanifest/display}}}} ] ``` Après ```html #SET{manifest, #ARRAY{ name, #CONFIG{favmanifest/name, #NOM_SITE_SPIP}, short_name, #CONFIG{favmanifest/short_name}, description, #CONFIG{favmanifest/description}, display, #CONFIG{favmanifest/display}, }|array_filter} ``` Le array_filter n’étant là que pour enlever les clés possiblement vides (mais je ne suis même pas sûr que ça soit nécessaire pour l’usage ensuite)...
Owner

Je sais pas si ce filtre à été pensé à la base pour faire uniquement des opérations sur des nombres, mais là le code actuel en fait un simple alias de l'opérateur + en php : https://git.spip.net/spip/spip/src/branch/master/ecrire/inc/filtres.php#L2157-L2159

Je l'ai déjà vu utilisé plusieurs fois dans des cas où il y avait justement besoin de faire une union de 2 tableaux dans des squelettes, et non pas des merge, cf. doc php (en dehors de l'exemple donné au dessus).

Sans ça, beh pas moyen.

Donc ça me semble plutôt legit de garder cette possibilité (en tout cas ça casserait des choses si ça changeait).

Je sais pas si ce filtre à été pensé à la base pour faire uniquement des opérations sur des nombres, mais là le code actuel en fait un simple alias de l'opérateur `+` en php : https://git.spip.net/spip/spip/src/branch/master/ecrire/inc/filtres.php#L2157-L2159 Je l'ai déjà vu utilisé plusieurs fois dans des cas où il y avait justement besoin de faire une union de 2 tableaux dans des squelettes, et non pas des merge, cf. [doc php](https://www.php.net/manual/en/language.operators.array.php) (en dehors de l'exemple donné au dessus). Sans ça, beh pas moyen. Donc ça me semble plutôt legit de garder cette possibilité (en tout cas ça casserait des choses si ça changeait).
Owner

Donc ça me semble plutôt legit de garder cette possibilité

Et de la phpdocumenter du coup aussi :p

> Donc ça me semble plutôt legit de garder cette possibilité Et de la phpdocumenter du coup aussi :p
nicod_ commented 1 week ago
Owner

Comme je le disais dans #5600, |plus permet des choses que |push ou |array_merge ne permettent pas :

Exemple, qu'on ne peut pas faire avec |push ni |array_merge (qui écrase les clés) :

#SET{data,#GET{data}|plus{#ARRAY{#ID,#TITRE}}}

Sinon, il faut passer par une fonction PHP maison juste pour ça.

Je serai d'avis de garder cette particularité, qui colle au langage PHP, et de modifier les docs en conséquence.

Et oui, + et array_merge ne font pas la même chose, ce qui peut être trompeur, mais c'est au développeur de savoir ce qu'il fait et ce qu'il utilise.

Comme je le disais dans #5600, `|plus` permet des choses que `|push` ou `|array_merge` ne permettent pas : > Exemple, qu'on ne peut pas faire avec |push ni |array_merge (qui écrase les clés) : > > #SET{data,#GET{data}|plus{#ARRAY{#ID,#TITRE}}} Sinon, il faut passer par une fonction PHP maison juste pour ça. Je serai d'avis de garder cette particularité, qui colle au langage PHP, et de modifier les docs en conséquence. Et oui, + et array_merge ne font pas la même chose, ce qui peut être trompeur, mais c'est au développeur de savoir ce qu'il fait et ce qu'il utilise.
Sign in to join this conversation.
No Milestone
No project
No Assignees
7 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: spip/spip#5389
Loading…
There is no content yet.