You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

111 lines
5.0 KiB

<?php
/**
* Gestion de l'affichage conditionnelle des saisies.
* Partie spécifique js
*
* @package SPIP\Saisies\Afficher_si_js
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/saisies_afficher_si_commun');
include_spip('inc/saisies_lister');
/**
* Transforme une condition afficher_si en condition js
* @param string $condition
* @param array $saisies_par_etapes les saisies du même formulaire, regroupées par etapes. Nécessaire pour savoir quel type de test js on met.
* @return string
**/
function saisies_afficher_si_js($condition, $saisies_par_etapes = array()) {
if (!$condition) {
return '';
}
$saisies_par_etapes = pipeline('saisies_afficher_si_saisies', $saisies_par_etapes);
if ($etape = _request('_etape')) {
$saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes["etape_$etape"]['saisies']);
$saisies_toutes_par_nom = saisies_lister_par_nom($saisies_par_etapes);
} else {
$saisies_toutes_par_nom = $saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes);
}
if ($tests = saisies_parser_condition_afficher_si($condition)) {
if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", "saisies"._LOG_CRITIQUE);
return '';
}
foreach ($tests as $test) {
$expression = $test['expression'];
unset($test['expression']);// Les les fonctions saisies_afficher_si_js n'ont pas besoin de l'expression qui est deja parsée, et cela évite qu'elles l'insèrent dans le js, avec le risque du coup de remplacement recursif et du coup de saisie js invalide.
$negation = isset($test['negation']) ? $test['negation'] : '' ;
$champ = isset($test['champ']) ? $test['champ'] : '' ;
$total = isset($test['total']) ? $test['total'] : '';
$operateur = isset($test['operateur']) ? $test['operateur'] : null ;
$negation = isset($test['negation']) ? $test['negation'] : '';
$booleen = isset($test['booleen']) ? $test['booleen'] : '';
$valeur = isset($test['valeur']) ? $test['valeur'] : null ;
$valeur_numerique = isset($test['valeur_numerique']) ? $test['valeur_numerique'] : '' ;
$plugin = saisies_afficher_si_evaluer_plugin($champ, $negation);
if ($plugin !== '') {
$condition = str_replace($expression, $plugin ? 'true' : 'false', $condition);
} elseif (stripos($champ, 'config:') !== false) {
$config = saisies_afficher_si_get_valeur_config($champ);
$test_modifie = eval('return '.saisies_tester_condition_afficher_si($config, $total, $operateur, $valeur, $negation).';') ? 'true' : 'false';
$condition = str_replace($expression, $test_modifie, $condition);
} elseif ($booleen) {
$condition = $condition;
} else { // et maintenant, on rentre dans le vif du sujet : les champs.
if (!isset($saisies_toutes_par_nom[$champ])) {//La saisie conditionnante n'existe pas pour ce formulaire > on laisse tomber
spip_log("Afficher_si incorrect. Champ $champ inexistant", "saisies"._LOG_CRITIQUE);
$condition = '';
} elseif (!isset($saisies_etape_courante_par_nom[$champ])) {//Cas 1. La saisie existe bien dans le formulaire, mais pas à l'étape courante.
$test_modifie = eval('return '.saisies_tester_condition_afficher_si(saisies_get_valeur_saisie($saisies_toutes_par_nom[$champ]), $total, $operateur, $valeur, $negation).';') ? 'true' : 'false';
$condition = str_replace($expression, $test_modifie, $condition);
} else {//Cas 2, la saisie est dans l'étape courante. On délégue cela à une autre fonction, par type de champ.
if (!$type_saisie = $saisies_toutes_par_nom[$champ]['saisie']) {
$type_saisie = 'defaut';
}
if (!$f = charger_fonction($type_saisie, 'saisies_afficher_si_js', true)) {//Y-a-t'il une fonction spécifique pour la génération du JS de cette saisie ?
$f = charger_fonction('defaut', 'saisies_afficher_si_js');
}
$condition = str_replace($expression, $f($test, $saisies_etape_courante_par_nom, $saisies_par_etapes), $condition);
}
}
}
} else {
if (!saisies_afficher_si_verifier_syntaxe($condition)) {
spip_log("Afficher_si incorrect. $condition syntaxe incorrecte", "saisies"._LOG_CRITIQUE);
return '';
}
}
return str_replace('"', "&quot;", $condition);
}
/**
* Vérifier qu'une test JS d'afficher si est statique, c'est à dire qu'il ne dépend d'aucune saisie de l'étape en court.
*
* Exemple
* `false && false` => statique, la fonction renvoie true
* `true && afficher_si(...)` => pas statique, la fonction renvoie
* @param string $afficher_si
* @return bool
**/
function saisies_afficher_si_js_est_statique($test) {
$test = str_replace('false', '', $test);
$test = str_replace('true', '', $test);
$test = str_replace('&&', '', $test);
$test = str_replace('||', '', $test);
$test = str_replace('(', '', $test);
$test = str_replace(')', '', $test);
$test = str_replace('!', '', $test);
$test = trim($test);
if ($test) {//S'il reste encore quelque chose, c'est qu'on a des choses variables
return false;
} else {
return true;
}
}