on laisse tomber spip_log("Afficher_si incorrect. Champ $champ inexistant", "saisies"._LOG_CRITIQUE); return ''; } $saisie = $saisies_form[$champ]['saisie']; if ($saisie == 'radio' or $saisie == 'oui_non' or $saisie == 'true_false') { $saisie = 'radio'; } $saisie = pipeline('saisies_afficher_si_js_type', array( 'args' => array('saisie' => $saisies_form[$champ]), 'data' => $saisie ) ); // Cas d'une valeur numérique : pour le test js, cela ne change rien, on la passe comme valeur if (strlen($valeur_numerique) and !$valeur) { $valeur = $valeur_numerique; } if (!$f = charger_fonction("saisies_afficher_si_js_$saisie", 'inc', true)) { if ($operateur === 'MATCH' or $operateur === '!MATCH') { if ($operateur === '!MATCH') {//Si double negation, on simplifie $negation = $negation? '' : '!'; } $cond = "$valeur.test(\$(form).find('[name=\"$champ\"]').val())"; if ($negation) { $cond = "!($cond)"; } return $cond; } else { return "$negation\$(form).find('[name=\"$champ\"]').val() $operateur $guillemet$valeur$guillemet"; } } return $f($champ, $total, $operateur, $valeur, $guillemet, $negation, $saisies_form[$champ]); } /** * Génère les tests js pour les cas de case * @param string $champ * @param string $total * @param string $operateur * @param string $valeur * @param string $guillemet * @param string $negation * @param array $saisie **/ function inc_saisies_afficher_si_js_case($champ, $total, $operateur, $valeur, $guillemet, $negation, $saisie) { if ($valeur and $operateur) { return "$negation($(form).find(\".checkbox[name='$champ']\").is(':checked') ? $(form).find(\".checkbox[name='$champ']\").val() : '') $operateur $guillemet$valeur$guillemet"; } else { return "$negation($(form).find(\".checkbox[name='$champ']\").is(':checked') ? $(form).find(\".checkbox[name='$champ']\").val() : '')"; } } /** * Génère les tests js pour les cas de radio * @param string $champ * @param string $total * @param string $operateur * @param string $valeur * @param string $guillemet * @param string $negation * @param array $saisie; **/ function inc_saisies_afficher_si_js_radio($champ, $total, $operateur, $valeur, $guillemet, $negation, $saisie) { return "$negation$(form).find(\"[name='$champ']:checked\").val() $operateur $guillemet$valeur$guillemet"; } /** * Génère les tests js pour les cas de fichiers * @param string $champ * @param string $total * @param string $operateur * @param string $valeur * @param string $guillemet * @param string $negation * @param array $saisie **/ function inc_saisies_afficher_si_js_fichiers($champ, $total, $operateur, $valeur, $guillemet, $negation, $saisie) { $nb_fichiers = isset($saisie['options']['nb_fichiers']) ? $saisie['options']['nb_fichiers'] : 0; if (!$nb_fichiers) { $nb_fichiers = 1; } else { $nb_fichiers = intval($nb_fichiers); } $total = "$(form).find(\"[name^='cvtupload_fichiers_precedents[$champ]']\").length"; $i = 0; while ($i < $nb_fichiers) { $total .= " + $(form).find(\"[name^='$champ']\")[$i].files.length"; $i++; } $total = "($total)"; $result = "$negation $total $operateur $valeur"; return $result; } /** * Génère les tests js pour les cas de checkbox * @param string $champ * @param string $total * @param string $operateur * @param string $valeur * @param string $guillemet * @param string $negation * @param array $saisie **/ function inc_saisies_afficher_si_js_checkbox($champ, $total, $operateur, $valeur, $guillemet, $negation, $saisie) { if ($total) {// Cas 1 : on cherche juste à savoir le nombre total de case coché $result = "$negation$(form).find(\"[name^='$champ']:checked\").length $operateur $valeur"; return $result; } else {// Cas 2 : on cherche à savoir s'il y a une case avec une certaine valeur // Convertir les conditions en test IN (compatibilité historique) if ($operateur == '==') { $operateur = 'IN'; } elseif ($operateur == '!=') { $operateur = '!IN'; } // La négation de l'opérateur remonte globalement if ($operateur == '!IN' and $negation) { $negation = ''; } elseif ($operateur == '!IN') { $negation = '!'; } // Spliter la valeur pour trouver toutes les cases qui doivent être cochées (ou pas) $valeurs = explode(',', $valeur); $valeurs = array_map('saisies_afficher_si_js_IN_individuel', $valeurs, array_fill(0,count($valeurs),$champ)); $valeurs = implode(' || ', $valeurs); return "$negation($valeurs)"; } } /** * Génère le sous-test js pour le cas où on a l'operateur IN ou !IN * c'est-à-dire, en pratique, pour les checkboxes * Par "sous-test js", nous entendons le test pour une valeur précise d'un checkbox * Attention : $valeur en premier (car fonction appelée dans un array_map()) * @param string $valeur * @param string $champ * @return string **/ function saisies_afficher_si_js_IN_individuel($valeur, $champ) { return "$(form).find('[name=\"$champ".'[]"'."][value=\"$valeur\"]').is(':checked')"; }