[Résolu] Problème dans une saisie

Bonjour,
J’ai une saisie (inspirée de checkbox.html) qui me retourne des erreurs:

Erreur d’exécution squelettes/saisies/checkbox_mots.html | File […]/ecrire/public/composer.php(94) : eval()'d code Line 68 : in_array(): Argument #2 ($haystack) must be of type array, null given

Une pour chaque in_array de la saisie:

[ (#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)checked="checked"]

Je pense que c’est suite à la dernière mise à jour de saisies/formidable …
Je ne me souviens plus exactement de la raison pour laquelle on avait créé cette saisie …
Mais bon il me semble que j’ai déjà vu passer ce problème sur Discuter, mais je ne retrouve pas … on dirait un souci d’initialisation (un array pas initialisé qui retourne cette erreur), si je redescend de PHP8.1 en 7.4 je ne l’ai plus …

J’ai une saisie (inspirée de checkbox.html) qui me retourne des erreurs:

il vaudrait mieux dans l’idéal faire une saisie héritée qu’une saisie inspirée

Je pense que c’est suite à la dernière mise à jour de saisies/formidable …

faudrait vérifier en remettant une version ancienne, mais pour autant que je me souvienne, on n’a pas changé. Et pour autant que je puisse voir la saisie checkbox fonctionne toujours

on dirait un souci d’initialisation (un array pas initialisé qui retourne cette erreur), si je redescend de PHP8.1 en 7.4 je ne l’ai plus …

oui, c’et bien cela. tu n’a ni #ENV{valeur_forcee}, ni #GET{valeur}, ni #GET{defaut}. Tu aurais le code complet de ta saisie pour regarder plus en détails ?

Bonjour,

Le code complet. Mon souci est que je n’en suis pas l’auteur, je ne connais pas forcément la raison pour laquelle cela a été fait comme ça …

[(#REM) data peut être une chaine qu'on sait décomposer ]
#SET{data, #ARRAY|saisies_chaine2tableau}
  <BOUCLE_checkbox_mots (MOTS) {id_groupe = '(#ENV{groupe_mots}'} {par titre}>
    #SET{data, #GET{data}|push{#ID_MOT}}
	</BOUCLE_checkbox_mots>

<BOUCLE_checkbox(POUR){tableau #GET{data}}>
  [(#REM) Soit c'est un tableau simple ]
  <div class="#ENV{choix,choix}[ (#ENV{choix,choix})_#CLE][ (#ENV{class})]">[(#SET{id,champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]_[(#COMPTEUR_BOUCLE|concat{'-',#CLE}|md5)]})]
  	<input type="checkbox" name="#ENV{nom}[]" class="checkbox checkbox_[(#ENV{nom}|saisie_nom2classe)]" id="#GET{id}"[ (#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)checked="checked"] value="#VALEUR"[(#CLE|in_array{#GET{disabled}}|oui) disabled="disabled"][ aria-describedby="(#ENV{describedby})"][ (#ENV*{attributs})] />
  	<label for="#GET{id}"[(#CLE|in_array{#ENV{valeur_forcee,#GET{valeur,#GET{defaut}}}}|oui)class="on"][(#ENV{attribut_title}|oui) title="#CLE"]>
      <BOUCLE_nom_checkbox_mots (MOTS) {id_mot=#VALEUR}>
        #TITRE
      </BOUCLE_nom_checkbox_mots>
    </label>
  </div>
</BOUCLE_checkbox>

Indépendamment du bug, ce code pose plusieurs problèmes :

  • il utilise une boucle POUR qui est déprécie
  • il duplique du code
  • il fait un saisies_chaine2tableau sur quelque chose qui est deja du tableau.

Il vaudrait mieux faire une saisie héritière.

  • déclarer la saisie comme autonome (et repasser par la page de gestion des plugins)

  • dans le squelette de la saisie, se contenter de

#SET{data, #ARRAY}
 <BOUCLE_checkbox_mots (MOTS) {id_groupe = '(#ENV{groupe_mots}'} {par titre}>
   #SET{data, #GET{data}|push{#ID_MOT}}
   </BOUCLE_checkbox_mots>
`<INCLURE{fond=saisies/_base,env,type_saisie=checkbox,data=#GET{data}} />`

Bonjour,
Ok merci pour ce retour détaillé, je vais devoir m’y pencher pour comprendre ce que la personne souhaitait faire et changer ce qui doit être changé :frowning:
Je vois que toutes les saisies ont été faites sur ce modèle qui j’imagine n’a pas été inventé par lui, il a dû récupérer ce code quelque part …

je vais devoir m’y pencher pour comprendre ce que la personne souhaitait faire et changer ce qui doit être changé

c’est pas très compliqué à comprendre : elle voulait proposer des mots en checkbox. Et pour changer ce qui doit être changé je te l’ai expliqué et montré la base: il vaut mieux faire de l’héritage de saisies

Je vois que toutes les saisies ont été faites sur ce modèle qui j’imagine n’a pas été inventé par lui, il a dû récupérer ce code quelque part …

oui elle a copier-coller saisies/checkbox.html et adapté

Et d’une ancienne version de checkbox.html car la nouvelle utilise bien la boucle DATA, pas la boucle POUR. Mais je devrai y arriver, faut juste que je trouve une heure pour le faire :slight_smile:
Encore merci !
Pierre.

Pour l’instant pas vraiment de succès, j’arrive à afficher les checkboxes et elles ont l’air fonctionnelles mais le label de la checkbox reprends son identifiant, pas le titre prévu … J’ai fait un .yaml pour l’héritage mais je n’ai quasi rien mis dedans, seulement la déclaration d’héritage.

si tu partageais ton code on comprendrait mieux.

J’ai lu le lien proposé et j’ai essayé plusieurs choses, pour la première j’ai utilisé exactement le code proposé ci-dessus sans rien ajouter, j’ai juste retiré les backquotes autour du qui me semblaient bizarres, (et un autre truc qui me semble bizarre c’est la parenthèse ouvrante devant #ENV, ça me laisse à penser que je ne comprends pas tout car si je l’enlève ça me fait une erreur), donc j’avais finalement un checkbox_mots.html comme suit:

#SET{data, #ARRAY}
<BOUCLE_checkbox_mots (MOTS) {id_groupe = '(#ENV{groupe_mots}'} {par titre}>
  #SET{data, #GET{data}|push{#ID_MOT}}
</BOUCLE_checkbox_mots>
<INCLURE{fond=saisies/_base,env,type_saisie=checkbox,data=#GET{data}} />

Auquel j’ai adjoint un checkbox_mots.yaml tout simple:

heritage:
  parent: 'checkbox'

Le résultat comme je le disais semble fonctionnel mais les labels des checkbox sont maintenant les id des mots correspondants, pas les titres. Et plus d’erreur en PHP8.1.

Ensuite j’ai essayé plusieurs combinaisons entre le code précédent (3ème post) et celui ci-dessus en remplaçant bien sûr la boucle_checkbox POUR par une boucle DATA (ça c’est assez simple) et en utilisant le code ci-dessus en remplacement de la boucle_checkbox_mots.
Quand plus haut je disais qu’il fallait que j’essaye de comprendre ce qu’il avait fait, je voulais en fait dire qu’il fallait que j’essaye de comprendre la raison pour laquelle il n’avait pas utilisé la saisie checkbox de base, j’avais bien vu qu’il s’agissait de checkbox pour des mots …
Je pourrai donner une url mais pour atteindre ce stade il faut être signé dans le site !
Je m’interroge sur ce qu’il faut faire pour déclarer une saisie autonome, s’il faut dans le yaml des enlever_options, modifier_options, ajouter_options (là il faudrait que je pige pourquoi cette saisie différente de la parente …)…
Je ne suis pas super à l’aise dans ces saisies, j’en avais fait autrefois sans du tout cette notion d’héritage, les choses ont évoluées, moi un peu moins :frowning:

Le résultat comme je le disais semble fonctionnel mais les labels des checkbox sont maintenant les id des mots correspondants, pas les titres. Et plus d’erreur en PHP8.1.

c’est à cause de ton ```
#SET{data, #GET{data}|push{#ID_MOT}}


là tu rempli un tableau avec uniquement des identifiants, donc forcément ca ne peut trouver que... des identifiants :) Ce qu'il faut c'est avoir les identifiants en clé de tableau et les valeurs en libellés. Pour ce faire je t'invite à regarder ici 

https://www.spip.net/fr_article4009.html

#SET{data, #ARRAY}
<BOUCLE_checkbox_mots (MOTS) {id_groupe = '(#ENV{groupe_mots}'} {par titre}>
  #SET{data, #GET{data}|array_merge{#TITRE,#ID_MOT}}
</BOUCLE_checkbox_mots>
#SET{data,#GET{data}|array_flip}}

Je ne suis pas super à l’aise dans ces saisies, j’en avais fait autrefois sans du tout cette notion d’héritage, les choses ont évoluées, moi un peu moins

la notion d’héritage, a laquelle tu n’est pas forcément obligé de souscrire, à l’avantage de permettre d’avoir des saisies cohérentes.

les options_supprmer/ajouter/ etc permettent ensuite d’affiner. Par exemple l’a clairement puisque les cases à cochées sont determinées automatiquement, il ne faut pas qu’on puisse configurer le valeur DATA.

{id_groupe = '(#ENV{groupe_mots}'} c’est chelou tout de même.

As-tu essayé {id_groupe = #ENV{groupe_mots}} tout simplement ? (sans les quotes)

J’ai déjà essayé sans la (, je vais tenter ce matin sans les quotes … oui je trouve ça bizarre, c’est copié-collé de la réponse de Maïeul (c pas un reproche, j’ai constaté ce souci en copiant-collant depuis la doc de Spip, ça reprend parfois les caractères spéciaux de l’éditeur, je suppose que ça vient de là).
Erratum: en fait la parenthèse était là avant, que je l’enlève ou la mette c’est pareil … donc je l’ai enlevée.