Formidable/ 'masquer les champs vides' ne fonctionne pas??

Bonsoir
à nouveau un souci de formulaire:
Je voudrais n’envoyer par courriel que les réponses significatives, et donc masquer les champs qui restent vierges.
J’ai donc coché la case 'Masquer les champs vides’
la réponse envoyée contient toujours l’ensemble des champs avec la mention « Sans réponse »
'Masquer les champs vides’ semble donc sans effet. J’ai tenté de contourner en cherchant du côté de ‹ formulaire_analyse ›, mais sans succès jusqu’ici.
Merci de vos lumières!

id_formulaire: '21'
identifiant: Inscriptions_2023_test
titre: 'Inscriptions 2023'
descriptif: ''
css: ''
message_retour: ''
saisies:
  -
    options: { label: 'Champ 1', datas: "choix1|Un\r\nchoix2|Deux\r\nchoix3|Trois", choix_alternatif_label: 'Autre choix', maximum_choix: '1', nom: checkbox_1 }
    verifier: {  }
    identifiant: '@6474c85b63736'
    saisie: checkbox
  -
    options: { label: 'Champ 2', datas: "choix1|Un\r\nchoix2|Deux\r\nchoix3|Trois", choix_alternatif_label: 'Autre choix', maximum_choix: '1', nom: checkbox_2 }
    verifier: {  }
    identifiant: '@6474c8aa60be2'
    saisie: checkbox
traitements:
  email:
    modification_reponse: ''
    champ_sujet: ''
    champ_sujet_modif_reponse: ''
    champ_sujet_valeurs_brutes: ''
    exclure_champs_email: ''
    pj: ''
    masquer_liens: ''
    activer_ip: ''
    masquer_champs_vides: on
    destinataires_plus: tadzokuit@free.fr
    destinataires_selon_champ: ''
    activer_vrai_envoyeur: ''
    champ_nom: ''
    activer_accuse: ''
    sujet_accuse: ''
    texte_accuse: ''
    masquer_valeurs_accuse: ''
    courriel_envoyeur_accuse: ''
    nom_envoyeur_accuse: ''
    champ_courriel_destinataire_form: ''
public: non
apres: formulaire
url_redirect: ''
statut: publie
date_creation: '2023-05-29 19:17:17'
maj: '2023-05-29 19:18:14'

Bah t’a pas de chance. Il se trouve que c’était aussi un truc bugé.

Corrigé par cette PR.

(et je ne vois pas comment formulaire_analyse aurait pu t’aider)

Merci du coup de main

Le correctif avait l’effet inverse (n’afficher que les saisies vides), du coup j’ai remplacé

		$saisies_vides = array_diff(array_keys($valeurs), array_filter($valeurs));

Par

	$saisies_vides = array_diff(array_keys($valeurs_libellees), array_keys($valeurs));

Et c’est OK.

Par contre, je ne comprends pas le rôle de ?? ’ ’ dans le code?

Et j’essaie de ne plus faire bugger formidable, promis :grinning:

J’ai parlé trop vite… marche pas sur un formulaire plus complexe… je m’y recolle, déjà pour comprendre pourquoi…

Est-ce que tu pourrais pas plutot répondre directement sur la PR. Ce serait plus simple pour le suivi.

Tu peux demander un compte ici SPIP-Contrib

En attendant :

  • je ne comprend pas comment cela avait pu passer chez moi… je devait avoir doublement les yeux pas en face des trou
  • j’ai envoyé une nouvelle version du code qui semble marcher…sur un formulaire simple.
  • pour $options['masquer_champs_vides'] ?? '' cela veut dire "si $options['masquer_champs_vides'] n’existe pas, prendre '' à la place. Cela éviter d’avoir des warnings de clé indéfini.

@Philbzh un retour sur la nouvelle version du code ?

Bonjour
Pas au clair avec le fonctionnement de git… du coup, je re-poste ici :
Il restait un souci avec les champs imbriqués (par ex. plusieurs fieldset) et de type ‹ date ›.
Ceci fonctionne, mais peut sans doute être amélioré :

	// Récuperer les valeurs saisies
	
	
	list($valeurs,$valeurs_libellees) = formidable_tableau_valeurs_saisies($saisies);
	
	
	// Traiter le masquage des champs vides si demandé
	// 1-Supprimer	les champs vides de la liste
	// 2-Ajouter les conteneurs avec au moins un champ non-vide
	
	if (isset($options['masquer_champs_vides']) and $options['masquer_champs_vides'] == 'on') 
		{
		$valeurs_libellees = array_filter($valeurs_libellees);
		$valeurs = array_filter($valeurs);	
		
		// Cas particulier rencontré avec les champs de type 'date'
		// nettoyer les incohérences avec les champs sans réponse mais avec une valeur associée 
		foreach ($valeurs as $key => $value){
				if(($valeurs_libellees[$key] === "sans reponse") && ($value != ''))
				{unset($valeurs[$key]);}
				}
				
		// liste des clés à ne pas vérifier, il en manque sûrement		
		$cles = array('options', 'verifier', 'saisie', 'identifiant');
		
		//Vérifier si le champ doit être affiché car il contient des saisies valides
		function valider_champs($saisie = array(), &$valeurs = array()) {
			global $cles;	
			foreach($saisie as $key => $value) {
		// $saisie est une saisie valide si une valeur est assignée ->	 $retour='true'					
				if ($key === "options" ){
							$retour = $retour || (isset($valeurs[$saisie["options"]["nom"]]));			
						}	
											
		// Appel récursif de la fonction pour lire un autre niveau de profondeur, en évitant les itérations inutiles.
				if((is_array($value)) && (!in_array($key, $cles, true))){	
					$retour_fct = valider_champs($value, $valeurs);	
					}
				$retour = $retour || $retour_fct;	
				}
				
			if ($retour && (isset($saisie["options"]["nom"]))){
			// Assigne une valeur au conteneur - fieldset - pour afficher le champ
				if(!isset($valeurs[$saisie["options"]["nom"]])) {
				$valeurs[$saisie["options"]["nom"]] = true; 
					}
				}
			return $retour;
		}
	
		valider_champs($saisies, $valeurs);		
	
		$saisies_vides = array_diff(array_keys($valeurs_libellees), array_keys($valeurs));	
			foreach ($saisies_vides as $saisie_vide) {
				$saisies_fond_notification = saisies_supprimer($saisies_fond_notification, $saisie_vide);
				}	
	}//Fin traitement des saisies vides

Merci

oui, bah tu avais ferrmé le ticket.

Je prendrai le tps prochainement de refaire une PR pour avoir quelque chose de propre. On passera surement par une fonction dans saisies pour faire le filtre.

Bon j’ai truvé un peu de tps.

Du coup peux tu regarder sur #149 - issue147_masquer_reponse_vide - formidable - SPIP on GIT
ET REPONDRE SUR git.spip.net pour ne pas foutre le bazar.

@Philbzh peux tu me dire si les 2 PR répondent à tes besoins.

Bonjour Maïeul
La solution que j’avais trouvé en modifiant traiter/email.php était pleinement fonctionnelle. Du coup, j’ai jeté un coup d’oeil aux PR, mais sans mettre en oeuvre la solution proposée, faute de temps.
Mais d’après ce que j’ai compris, ça correspond

fonctionnelle certes, mais peu propres et sans doute peu maintenable.

Bon du coup je vais merger sans autre.