[SPIP Zone] Saisies et afficher si : la grande réécriture

Chers tous, chères toutes,

**Message court**

J'ai créé une branche pour réécrire la manière dont les afficher_si fonctionnaient niveau javascript. Est-ce que des bonnes âmes voudraient bien tester d'ici le 15 septembre ?

C'est la branche
afficher_si_js_reecriture

QUestion subsidiaire : vu que cela peut potentiellement casser des certains cas très particulier, est-ce qu'on fera pas une v.4 ?

**Messsage long**

En décembre j'avais procédé à une réécriture de la partie "vérification PHP" des affichages conditionnelles des saisies.

Le but à l'époque était triple :
- avoir un code plus lisible, et donc plus testable
- définir une bonne fois pour toute une syntaxe propre pour ces tests, en posant AU PREALABLE la syntaxe et A POSTERIORI la transformation en code PHP/JS, et pas, comme cela s'était fait jusqu'a maintenant, en pensant d'abord JS puis en bidouillant un bout de code pour faire venir cela depuis un syntaxe defini à la va vite.
- s'assurer que cette syntaxe ne permettait pas d'executer du code arbitraire (en fait : j'avais oublié un cas, mais c'est corrigé depuis un commit d'aujourd'hui).

Ce travail avait abouti à
- la création d'un parseur d'afficher_si
- la création de fonctions qui depuis le résultat du parsage, produisait un code php puis l'évaluait

Il manquait l'équivalent côté JS, où on se trainait toujours des expressions régulières pas clair. De plus, depuis longtemps, Rasta disait qu'il vaudrait avoir un code JS unique, et des infos stockées en data-afficher-si.

J'ai donc réécrit la partie de js en ce sens, dans une branche à part.

Intérêts :
         - gain de performance niveau js :
    - on ne teste que les champs qui viennent de changer, et pas tous
         - un seul js en cache
         - moins de ligne de code envoyées (200 ko sur un cas simple !)
  - gain de lisibilité de code, mieux découpé
       - tests unitaires pour s'assurer de la perenitté dans le temps
       - uniformisation de la syntaxe entre la version PHP et la version JS, en utilisant le même parseur

À terme, possibilité d'ajouter des nouvelles fonctionnalités, en modifiant un peu le parseur et les fonctions filles (je vais faire un article sur contrib) :
  - MATCH pour des regexp
  - @champ:total@ pour le nombre de case cocher sur des checkbox multiple
  - également une fonctionnalité que j'aimerai ajouter : considéré que si un champ est masqué, sa valeur est nul. Il me semble que c'est deja le cas en PHP

Nouveauté en bonus :
- si une condition fait appel à champ qui n'existe pas, elle est ignorée, et un message de log est enregistrée. On le voit plus rapidement
- plus possibilité de programmer un afficher_si pour avoir du code js arbitraire

Ce que cela casse pour les gens :
  - si on ne respecte pas strictement la syntaxe décrite dans
https://contrib.spip.net/5080, les tests JS ne fonctionneront pas. Mais de toute facon, cela échouait deja en PHP (mais c'était moins grave, car l'echec ne se voyait que sur les champs obligatoire)
  - pour les saisies autonomes, qui n'utilisent pas _base, il faut ajouter data-afficher_si sur le conteneur. Cf https://zone.spip.net/trac/spip-zone/changeset/116067/spip-zone

J'aurais besoin de tests. J'ai deja fait des test avec mes exemples, mais plus on a mieux c'est.

L'idée étant qu'avec l'été, tout ca, on ne merge pas avant le 15 septembre.

Merci de vos retours

Maïeul

Le 21/07/2019 à 17:45, Maïeul a écrit :

Chers tous, chères toutes,

J'ai créé une branche pour réécrire la manière dont les afficher_si fonctionnaient niveau javascript. Est-ce que des bonnes âmes voudraient bien tester d'ici le 15 septembre ?

Cher Maïeul,

merci pour tout ce boulot (énorme).

J'ai une utilisatrice qui génère régulièrement de (très) gros formulaires administratifs pleins d'afficher_si et de tonnes d'autres options dans tous les sens.
Je vais prévoir une séance de tests de mon côté, et avec elle.
On devrait pouvoir caser ça avant le 15 septembre.

La bise,

--
nicod_

PS : avec l'expérience, elle maitrise plutôt bien maintenant les tests et les conditions et leur logique (et/non/ou). Mais le principal souci qu'elle a par moment, c'est que n'étant pas développeuse, il lui arrive faire une erreur de syntaxe dans une conditions et dans ces cas là, elle est perdue.

Je n'ai pas encore regardé ton code, mais tu penses possible d'intercepter les erreurs de syntaxe dans les conditions, pour lever une alerte ou un message par exemple ?

Ça me parait un peu complexe, vu que la syntaxe n'est pas du JS pur...

--
nicod_

Le 21/07/2019 à 21:46, nicod_ a écrit :

PS : avec l'expérience, elle maitrise plutôt bien maintenant les tests et les conditions et leur logique (et/non/ou). Mais le principal souci qu'elle a par moment, c'est que n'étant pas développeuse, il lui arrive faire une erreur de syntaxe dans une conditions et dans ces cas là, elle est perdue.

Je n'ai pas encore regardé ton code, mais tu penses possible d'intercepter les erreurs de syntaxe dans les conditions, pour lever une alerte ou un message par exemple ?

Ça me parait un peu complexe, vu que la syntaxe n'est pas du JS pur...

Merci

je dirais que même des dev font des erreurs de syntaxe. J'ai apporté une petite modif à formidable (indépendamment du problème ici) : le memento affiche désormais aussi les clé possibles pour un champ.

Cela étant, pour revenir à ta question des erreurs de syntaxe : le fait de passer par un parseur commun PHP/JS (dont les règles sont décrites dans l'article de doc) permet justement de détecter les erreurs de syntaxe.

Typiquement, dans la nouvelle branche :
  - une condition qui ne respecterait pas cette syntaxe sera mis à vide
  - un message de log sera écrit (dans le fichier saisies.log)

On pourrait imaginer d'afficher un message d'erreur le cas échéant, c'est juste un problème d'intégration/d'ergonomie (et un peu de travail pour mieux séparer encore les choses).

La nouvelle version est-même capable de détecter si tu fais un test sur un champ inexistant (et dans ce cas il supprime le tests correspondant au champ).

L'analyse syntaxique est quasi complète. Pourquoi quasi ? parceque cela fonctionne sous tests par sous tests.

C'est à dire si j'ai
<testfaux> && <testfaux>

il va me renvoyer &&, car il a detecté les deux tests faux, ce qui est est aussi faux.

Mais bon, ca peut se corriger ca. Faux juste reflechir un peu aux différents cas possible

Le 21/07/2019 à 21:46, nicod_ a écrit :

PS : avec l'expérience, elle maitrise plutôt bien maintenant les tests et les conditions et leur logique (et/non/ou). Mais le principal souci qu'elle a par moment, c'est que n'étant pas développeuse, il lui arrive faire une erreur de syntaxe dans une conditions et dans ces cas là, elle est perdue.

Je n'ai pas encore regardé ton code, mais tu penses possible d'intercepter les erreurs de syntaxe dans les conditions, pour lever une alerte ou un message par exemple ?

Ça me parait un peu complexe, vu que la syntaxe n'est pas du JS pur...

plop,
des nouvelles des tests ? pour info je viens de poster une modif qui, lorsqu'on rempli le champ 'afficher_si' d'une config de saisie, vérifie la syntaxe. Cela laisse peut être passer des faux positifs, mais c'est déjà bien mieux.

Par contre, pas moyen de vérifier qu'on appelle les bon champs (enfin, ce serait possible, mais grosse, grosse réécritures).

Le 17/08/2019 à 16:24, Maïeul a écrit :

plop,
des nouvelles des tests ? pour info je viens de poster une modif qui, lorsqu'on rempli le champ 'afficher_si' d'une config de saisie, vérifie la syntaxe. Cela laisse peut être passer des faux positifs, mais c'est déjà bien mieux.

Par contre, pas moyen de vérifier qu'on appelle les bon champs (enfin, ce serait possible, mais grosse, grosse réécritures).

----
spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone

hop, un petit up.

Le 02/09/2019 à 12:44, Maïeul a écrit :

Le 17/08/2019 à 16:24, Maïeul a écrit :

plop,
des nouvelles des tests ?

En parlant de tests/ (unitaires) je crois que faut les adapter justement à tes changements.

MM.

Le 02/09/2019 à 15:31, Matthieu Marcillaud a écrit :

Le 02/09/2019 à 12:44, Maïeul a écrit :

Le 17/08/2019 à 16:24, Maïeul a écrit :

plop,
des nouvelles des tests ?

En parlant de tests/ (unitaires) je crois que faut les adapter justement à tes changements.

MM.

----
spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone

?
les tests unittaires que j'ai ajouté dans le plugins passent tous, et jes les ai adaptés / complétés au fur et à mesure

Le 02/09/2019 à 17:34, Maïeul a écrit :?

les tests unittaires que j'ai ajouté dans le plugins passent tous, et jes les ai adaptés / complétés au fur et à mesure

Une minuscule erreur je pense : Fatal error: Uncaught Error: Call to undefined function saisies_evaluer_afficher_si() in tests/saisies_afficher_si/saisies_evaluer_afficher_si_config.php on line 19

Je n’avais pas regardé le détail.

MM.

Le 02/09/2019 à 17:52, Matthieu Marcillaud a écrit :

Le 02/09/2019 à 17:34, Maïeul a écrit :?

les tests unittaires que j'ai ajouté dans le plugins passent tous, et jes les ai adaptés / complétés au fur et à mesure

Une minuscule erreur je pense : Fatal error: Uncaught Error: Call to undefined function saisies_evaluer_afficher_si() in tests/saisies_afficher_si/saisies_evaluer_afficher_si_config.php on line 19

Je n’avais pas regardé le détail.

Et donc je n’ai pas saisies directement dans plugins/
Donc à la place de
find_in_path("../plugins/saisies/inc/saisies_afficher_si.php",'',true);
Je présume que tu veux soit qqc comme :
find_in_path("inc/saisies_afficher_si.php",'',true);
soit qqc comme :
require_once __DIR__ . '../../inc/saisies_afficher_si.php';

MM.

Le 02/09/2019 à 17:58, Matthieu Marcillaud a écrit :

Le 02/09/2019 à 17:52, Matthieu Marcillaud a écrit :

Le 02/09/2019 à 17:34, Maïeul a écrit :?

les tests unittaires que j'ai ajouté dans le plugins passent tous, et jes les ai adaptés / complétés au fur et à mesure

Une minuscule erreur je pense : Fatal error: Uncaught Error: Call to undefined function saisies_evaluer_afficher_si() in tests/saisies_afficher_si/saisies_evaluer_afficher_si_config.php on line 19

Je n’avais pas regardé le détail.

Et donc je n’ai pas saisies directement dans plugins/
Donc à la place de
find_in_path("../plugins/saisies/inc/saisies_afficher_si.php",'',true);
Je présume que tu veux soit qqc comme :
find_in_path("inc/saisies_afficher_si.php",'',true);
soit qqc comme :
require_once __DIR__ . '../../inc/saisies_afficher_si.php';

MM.
----
spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone

Je met en copie Cedric, qui pourra peut être éclairer ma lanterne.
J'avais fait avec test builder puis recopié pour avoir des nouveaux tests (mais je comprend pas trop l'interface de testbuilder).

En fait je lance pas les tests unitaires depuis testbuilder (parce que je retrouve jamais l'endroit où les lancer, ou bien cela me les lance pour tous les plugins + ceux de spip (qui soit en dit en passant, échouent pour la moitié) mais en allant directement sur

http://localhost/plugins/saisies/tests/

la question que je me pose c'est : quel est donc la bonne pratique?

Le 17/08/2019 à 16:24, Maïeul a écrit :

des nouvelles des tests ? pour info je viens de poster une modif qui, lorsqu'on rempli le champ 'afficher_si' d'une config de saisie, vérifie la syntaxe. Cela laisse peut être passer des faux positifs, mais c'est déjà bien mieux.

Salut,
je viens de tester plusieurs formulaires un peu complexes avec beaucoup de afficher_si, et tout est ok.
Le code généré est bien plus compact et générique, et les tests de syntaxe, génial !

Un grand bravo et merci pour tout ce travail !

Par contre, pas moyen de vérifier qu'on appelle les bon champs (enfin, ce serait possible, mais grosse, grosse réécritures).

C'est déjà une sacrée grosse évolution en l'état, ça ira comme ça je pense.

--
nicod_

Le vendredi 06 septembre 2019 à 17:18 +0200, nicod_ a écrit :

Le 17/08/2019 à 16:24, Maïeul a écrit :

> des nouvelles des tests ? pour info je viens de poster une modif
> qui,
> lorsqu'on rempli le champ 'afficher_si' d'une config de saisie,
> vérifie
> la syntaxe. Cela laisse peut être passer des faux positifs, mais
> c'est
> déjà bien mieux.

Super! Merci. Bon, vu le peu d'enthousiasme a tester, je crois que je
vais merger aujourd'hui, ca me permettra de voir demain s'il ya des
merdes : on lance un formulaire :slight_smile:

Le 17/08/2019 à 16:24, Maïeul a écrit :

Le 21/07/2019 à 21:46, nicod_ a écrit :

Suite aux différents test, notamment ceux de Nicod et de JLuc, et vu qu'il n'y a pas eu d'echo negatifs, je viens de reporter (git rebase!) les commits sur le trunk.

Si vous voyez des problèmes avec les afficher_si dans les prochains jours, me le signaler.

Maïeul

Bonjour

Je me trouve avec un filtre afficher_si_js inconnu.

Une idée de correction ?

Merci.

Le ven. 6 sept. 2019 à 18:49, Maïeul <maieul@maieul.net> a écrit :

Le 17/08/2019 à 16:24, Maïeul a écrit :

Le 21/07/2019 à 21:46, nicod_ a écrit :

Suite aux différents test, notamment ceux de Nicod et de JLuc, et vu
qu’il n’y a pas eu d’echo negatifs, je viens de reporter (git rebase!)
les commits sur le trunk.

Si vous voyez des problèmes avec les afficher_si dans les prochains
jours, me le signaler.

Maïeul

spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone

t'a essayé un var_mode=recalcul ?
c'est vraiment bizarre. Tu pourrais m'envoyer le code du formulaire qui
pose problème?

Le samedi 07 septembre 2019 à 11:37 +0200, Pierre KUHN a écrit :

Bonjour

Je me trouve avec un filtre afficher_si_js inconnu.

Une idée de correction ?

Merci.

Le 06/09/2019 à 17:39, Maïeul Rouquette a écrit :

Super! Merci. Bon, vu le peu d'enthousiasme a tester, je crois que je
vais merger aujourd'hui, ca me permettra de voir demain s'il ya des
merdes : on lance un formulaire :slight_smile:

Hello Maieul, et bien c'est parfait, ça m'a permis de voir des merdes
effectivement :stuck_out_tongue:

Là j'ai mis à jour sur un site avec Profils, et la config de ce plugin
ne marche plus. Ça utilise des afficher_si appliqué à des cases à cocher
qui sont des tableaux : name=config[activer_contact], et quand on clique
dessus, ça doit ouvrir des fieldsets en plus.

Exemple là :
https://zone.spip.net/trac/spip-zone/browser/spip-zone/_plugins_/profils/trunk/formulaires/editer_profil.php#L176

Ou là :
https://zone.spip.net/trac/spip-zone/browser/spip-zone/_plugins_/profils/trunk/formulaires/editer_profil.php#L211

Tout cela marchant parfaitement avant le merge :slight_smile:

--
RastaPopoulos

Le 10/09/2019 à 15:53, RastaPopoulos a écrit :

Le 06/09/2019 à 17:39, Maïeul Rouquette a écrit :

Super! Merci. Bon, vu le peu d'enthousiasme a tester, je crois que je
vais merger aujourd'hui, ca me permettra de voir demain s'il ya des
merdes : on lance un formulaire :slight_smile:

Hello Maieul, et bien c'est parfait, ça m'a permis de voir des merdes
effectivement :stuck_out_tongue:

Là j'ai mis à jour sur un site avec Profils, et la config de ce plugin
ne marche plus. Ça utilise des afficher_si appliqué à des cases à cocher
qui sont des tableaux : name=config[activer_contact], et quand on clique
dessus, ça doit ouvrir des fieldsets en plus.

Exemple là :
https://zone.spip.net/trac/spip-zone/browser/spip-zone/_plugins_/profils/trunk/formulaires/editer_profil.php#L176

Ou là :
https://zone.spip.net/trac/spip-zone/browser/spip-zone/_plugins_/profils/trunk/formulaires/editer_profil.php#L211

Tout cela marchant parfaitement avant le merge :slight_smile:

Ah oui, et il n'y a aucune erreur JS ou autre, ça masque bien ce qui
doit être masqué au démarrage, mais ça ne s'applique pas du tout sur les
événements où on modifie les champs (quand on switch la case ça fait
rien, aucun comportement).

--
RastaPopoulos

Le 10/09/2019 à 16:46, RastaPopoulos a écrit :

Le 10/09/2019 à 15:53, RastaPopoulos a écrit :

Le 06/09/2019 à 17:39, Maïeul Rouquette a écrit :

Super! Merci. Bon, vu le peu d'enthousiasme a tester, je crois que je
vais merger aujourd'hui, ca me permettra de voir demain s'il ya des
merdes : on lance un formulaire :slight_smile:

Hello Maieul, et bien c'est parfait, ça m'a permis de voir des merdes
effectivement :stuck_out_tongue:

Là j'ai mis à jour sur un site avec Profils, et la config de ce plugin
ne marche plus. Ça utilise des afficher_si appliqué à des cases à cocher
qui sont des tableaux : name=config[activer_contact], et quand on clique
dessus, ça doit ouvrir des fieldsets en plus.

Exemple là :
https://zone.spip.net/trac/spip-zone/browser/spip-zone/_plugins_/profils/trunk/formulaires/editer_profil.php#L176

Ou là :
https://zone.spip.net/trac/spip-zone/browser/spip-zone/_plugins_/profils/trunk/formulaires/editer_profil.php#L211

Tout cela marchant parfaitement avant le merge :slight_smile:

Ah oui, et il n'y a aucune erreur JS ou autre, ça masque bien ce qui
doit être masqué au démarrage, mais ça ne s'applique pas du tout sur les
événements où on modifie les champs (quand on switch la case ça fait
rien, aucun comportement).

petit bug idiot, qui n'avait rien à voir avec les trucs imbriqués, mais avec le nom de la saisie conditionnante

https://zone.spip.net/trac/spip-zone/changeset/117805

en gros historiquement les tests permette d'utilise @config:xxx@ pour tester une config. Et en pratique, dans la modif du js, j'avais fait test 'config' et pas 'config:'.

+ j'avais oublié qu'on pouvait tester @case@ == 'on'

https://zone.spip.net/trac/spip-zone/changeset/117806

Bonjour Maïeul,

Je bloque sur le test : ‹ afficher_si › => ‹ (@id_lieu@ == « 0 ») || (@perm_conci_autre@ != «  ») ›
J’ai essayer de le simplifier mais je trouve pas la solution.

J’ai dans les log plugins/saisies/inc/saisies_afficher_si_js.php:L56:saisies_afficher_si_js()::Pub:CRITIQUE: Afficher_si incorrect. syntaxe incorrecte

Une idée de correction ?

Merci.