Browse Source

afficher_si : nouvelle syntaxe '@checbox_x@:TOTAL > 3', permet de tester si le nombre total de case cochée est supérieur à 3

svn/root/tags/v3.30.0
maieul@maieul.net 3 years ago
parent
commit
9bf3d2a0cd
  1. 26
      inc/saisies_afficher_si_commun.php
  2. 66
      inc/saisies_afficher_si_js.php
  3. 3
      inc/saisies_afficher_si_php.php
  4. 2
      javascript/afficher_si.js.html
  5. 5
      tests/saisies_afficher_si/saisies_afficher_si_js.php
  6. 5
      tests/saisies_afficher_si/saisies_afficher_si_verifier_syntaxe.php
  7. 8
      tests/saisies_afficher_si/saisies_evaluer_afficher_si.php
  8. 121
      tests/saisies_afficher_si/saisies_tester_condition_afficher_si.php

26
inc/saisies_afficher_si_commun.php

@ -18,6 +18,7 @@ function saisies_parser_condition_afficher_si($condition) {
$regexp =
'(?<negation>!?)' // négation éventuelle
. '(?:@(?<champ>.+?)@)' // @champ_@
. '(?<total>:TOTAL)?' // TOTAL éventuel (pour les champs de type case à cocher)
. '(' // partie operateur + valeur (optionnelle) : debut
. '(?:\s*?)' // espaces éventuels après
. '(?<operateur>==|!=|IN|!IN|>=|>|<=|<)' // opérateur
@ -59,12 +60,13 @@ function saisies_afficher_si_evaluer_plugin($champ, $negation = '') {
* - un string
* - un tableau
* - un tableau sérializé
* @param string $total TOTAL si on demande de faire le décompte dans un tableau
* @param string $operateur : l'opérateur:
* @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23", "25"
* @param string $negation y-a-t-il un négation avant le test ? '!' si oui
* @return bool false / true selon la condition
**/
function saisies_tester_condition_afficher_si($champ, $operateur=null, $valeur=null, $negation = '') {
function saisies_tester_condition_afficher_si($champ, $total, $operateur=null, $valeur=null, $negation = '') {
// Si operateur null => on test juste qu'un champ est cochée / validé
if ($operateur === null and $valeur === null) {
if ($negation) {
@ -89,7 +91,7 @@ function saisies_tester_condition_afficher_si($champ, $operateur=null, $valeur=n
if (is_string($champ)) {
$retour = saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur);
} elseif (is_array($champ)) {
$retour = saisies_tester_condition_afficher_si_array($champ, $operateur, $valeur);
$retour = saisies_tester_condition_afficher_si_array($champ, $total, $operateur, $valeur);
} else {
$retour = false;
}
@ -132,15 +134,19 @@ function saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur
* @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23", "25"
* @return bool false / true selon la condition
**/
function saisies_tester_condition_afficher_si_array($champ, $operateur, $valeur) {
$valeur = explode(',', $valeur);
$intersection = array_intersect($champ, $valeur);
if ($operateur == "==" or $operateur == "IN") {
return count($intersection) > 0;
} else {
return count($intersection) == 0;
function saisies_tester_condition_afficher_si_array($champ, $total, $operateur, $valeur) {
if ($total) {//Cas 1 : on demande à compter le nombre total de champ
return saisies_tester_condition_afficher_si_string(count($champ), $operateur, $valeur);
} else {//Cas deux : on test une valeur
$valeur = explode(',', $valeur);
$intersection = array_intersect($champ, $valeur);
if ($operateur == "==" or $operateur == "IN") {
return count($intersection) > 0;
} else {
return count($intersection) == 0;
}
return false;
}
return false;
}
/**

66
inc/saisies_afficher_si_js.php

@ -35,6 +35,7 @@ function saisies_afficher_si_js($condition, $saisies_form = array()) {
$expression = $test[0];
$negation = isset($test['negation']) ? $test['negation'] : '' ;
$champ = isset($test['champ']) ? $test['champ'] : '' ;
$total = isset($test['total']) ? $test['total'] : '';
$operateur = isset($test['operateur']) ? $test['operateur'] : '' ;
$guillemet = isset($test['guillemet']) ? $test['guillemet'] : '' ;
$negation = isset($test['negation']) ? $test['negation'] : '';
@ -46,12 +47,12 @@ function saisies_afficher_si_js($condition, $saisies_form = array()) {
$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, $operateur, $valeur, $negation).';') ? 'true' : 'false';
$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. On délégue cela à une autre fonction
$condition = str_replace($expression, saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form), $condition);
$condition = str_replace($expression, saisies_afficher_si_js_champ($champ, $total, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form), $condition);
}
}
} else {
@ -66,6 +67,7 @@ function saisies_afficher_si_js($condition, $saisies_form = array()) {
/**
* Génère à partir de l'analyse d'une condition afficher_si le test js, pour les champs
* @param string $champ
* @param string $total
* @param string $operateur
* @param string $valeur
* @param string $valeur_numerique
@ -75,29 +77,29 @@ function saisies_afficher_si_js($condition, $saisies_form = array()) {
* @param string $saisies_form listée par nom
* @return string condition_js
**/
function saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form) {
function saisies_afficher_si_js_champ($champ, $total, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form) {
if (!isset($saisies_form[$champ])) {//La saisie conditionnante n'existe pas pour ce formulaire > on laisse tomber
spip_log("Afficher_si incorrect. Champ $champ inexistant", "saisies"._LOG_CRITIQUE);
return '';
}
$saisie = $saisies_form[$champ]['saisie'];
if ($saisie == 'checkbox') {
return saisies_afficher_si_js_checkbox($champ, $operateur, $valeur, $negation);
}
// 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;
}
// Guillemets : si double, les échapper
// cas checkbox
if ($saisie == 'checkbox') {
return saisies_afficher_si_js_checkbox($champ, $total, $operateur, $valeur, $negation);
}
// cas case
if ($saisie == 'case') {// case
return saisies_afficher_si_js_case($champ, $operateur, $valeur, $guillemet, $negation);
return saisies_afficher_si_js_case($champ, $total, $operateur, $valeur, $guillemet, $negation);
}
// cas radio
if ($saisie == 'radio' or $saisie == 'oui_non' or $saisie == 'true_false') {// radio et assimilés
return saisies_afficher_si_js_radio($champ, $operateur, $valeur, $guillemet, $negation);
return saisies_afficher_si_js_radio($champ, $total, $operateur, $valeur, $guillemet, $negation);
}
// sinon cas par défaut
return "$negation\$(form).find('[name=\"$champ\"]').val() $operateur $guillemet$valeur$guillemet";
@ -107,12 +109,13 @@ function saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numer
/**
* 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
**/
function saisies_afficher_si_js_case($champ, $operateur, $valeur, $guillemet, $negation) {
function saisies_afficher_si_js_case($champ, $total, $operateur, $valeur, $guillemet, $negation) {
if ($valeur and $operateur) {
return "$negation($(form).find(\".checkbox[name='$champ']\").is(':checked') ? $(form).find(\".checkbox[name='$champ']\").val() : '') $operateur $guillemet$valeur$guillemet";
} else {
@ -123,40 +126,47 @@ function saisies_afficher_si_js_case($champ, $operateur, $valeur, $guillemet, $n
/**
* 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
**/
function saisies_afficher_si_js_radio($champ, $operateur, $valeur, $guillemet, $negation) {
function saisies_afficher_si_js_radio($champ, $total, $operateur, $valeur, $guillemet, $negation) {
return "$negation$(form).find(\"[name='$champ']:checked\").val() $operateur $guillemet$valeur$guillemet";
}
/**
* 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 $negation
**/
function saisies_afficher_si_js_checkbox($champ, $operateur, $valeur, $negation) {
// 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 = '!';
function saisies_afficher_si_js_checkbox($champ, $total, $operateur, $valeur, $negation) {
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)";
}
// 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)";
}
/**

3
inc/saisies_afficher_si_php.php

@ -144,6 +144,7 @@ function saisies_transformer_condition_afficher_si($condition, $env = null) {
if (!isset($test['booleen'])) {
$champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
$total = isset($test['total']) ? $test['total'] : '';
$operateur = isset($test['operateur']) ? $test['operateur'] : null;
$negation = isset($test['negation']) ? $test['negation'] : '';
if (isset($test['valeur_numerique'])) {
@ -154,7 +155,7 @@ function saisies_transformer_condition_afficher_si($condition, $env = null) {
$valeur = null;
}
$test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
$test_modifie = saisies_tester_condition_afficher_si($champ, $total, $operateur, $valeur, $negation) ? 'true' : 'false';
$condition = str_replace($expression, $test_modifie, $condition);
}
}

2
javascript/afficher_si.js.html

@ -8,7 +8,7 @@ $(function(){
);
$(this).find('texteara, input, select').change(function(){
form = $(this).parents('form');
name = $(this).attr('name');
name = $(this).attr('name').replace(/\\[.*\\]/,'');
form.find('[data-afficher_si*=\''+name+'\']').each(function(){
verifier_afficher_si(form, $(this));
})

5
tests/saisies_afficher_si/saisies_afficher_si_js.php

@ -155,6 +155,11 @@
1 => '@checkbox_1@ IN \'toto\'',
2 => $saisies_form
),
'checkbox_TOTAL' => array(
0 => '$(form).find(&quot;[name^=\'checkbox_1\']:checked&quot;).length > 1',
1 => '@checkbox_1@:TOTAL > 1',
2 => $saisies_form
),
'checkbox_NOT_IN' => array(
0 => '!($(form).find(\'[name=&quot;checkbox_1[]&quot;][value=&quot;toto&quot;]\').is(\':checked\'))',
1 => '@checkbox_1@ !IN \'toto\'',

5
tests/saisies_afficher_si/saisies_afficher_si_verifier_syntaxe.php

@ -102,6 +102,11 @@
0 => true,
1 => "true"
),
'total' =>
array(
0 => true,
1 => '@checkbox_1@:TOTAL > 1'
)
);
foreach ($essais as $nom=>$param) {
$essais[$nom][2] = saisies_parser_condition_afficher_si($param[1]);

8
tests/saisies_afficher_si/saisies_evaluer_afficher_si.php

@ -220,6 +220,14 @@
'cascade' => array(
0 => true,
1 => '@cascade[a]@ == \'a\''
),
'total_tableau_sup' => array(
0 => true,
1 => '@tableau_1@:TOTAL > 2'
),
'total_tableau_inf' => array(
0 => false,
1 => '@tableau_1@:TOTAL < 2'
)
);
return $essais;

121
tests/saisies_afficher_si/saisies_tester_condition_afficher_si.php

@ -38,150 +38,175 @@
"champ_uniquement" => array(
0 => true,
1 => "case_1",
2 => '',
),
"chaines_egales_test_egalite" => array (
0 => true,
1 => 'a',
2 => '==',
3 => 'a',
2 => '',
3 => '==',
4 => 'a',
),
"chaines_inegales_test_egalite" => array (
0 => false,
1 => 'a',
2 => '!=',
3 => 'a',
2 => '',
3 => '!=',
4 => 'a',
),
"chaines_egales_test_inegalite" => array (
0 => false,
1 => 'a',
2 => '!=',
3 => 'a',
2 => '',
3 => '!=',
4 => 'a',
),
"chaines_inegales_test_egalite" => array (
0 => false,
1 => 'a',
2 => '!=',
3 => 'a',
2 => '',
3 => '!=',
4 => 'a',
),
"array_presence_test_double_egal" => array (
0 => true,
1 => array("2","3"),
2 => '==',
3 => '2',
2 => '',
3 => '==',
4 => '2',
),
"array_presence_test_double_egal_serialize" => array (
0 => true,
1 => serialize(array("2","3")),
2 => '==',
3 => '2',
2 => '',
3 => '==',
4 => '2',
),
"array_presence_test_IN" => array (
0 => true,
1 => array("2","3"),
2 => 'IN',
3 => '2',
2 => '',
3 => 'IN',
4 => '2',
),
"array_presence_test_IN_serialize" => array (
0 => true,
1 => serialize(array("2","3")),
2 => 'IN',
3 => '2',
2 => '',
3 => 'IN',
4 => '2',
),
"array_presence_test_double_egal_faux" => array (
0 => false,
1 => array("2","3"),
2 => '==',
3 => '4',
2 => '',
3 => '==',
4 => '4',
),
"array_presence_test_double_egal_faux_serialize" => array (
0 => false,
1 => serialize(array("2","3")),
2 => '==',
3 => '4',
2 => '',
3 => '==',
4 => '4',
),
"array_presence_test_IN_faux" => array (
0 => false,
1 => array("2","3"),
2 => 'IN',
3 => '4',
2 => '',
3 => 'IN',
4 => '4',
),
"array_presence_test_IN_faux_serialize" => array (
0 => false,
1 => serialize(array("2","3")),
2 => 'IN',
3 => '4',
2 => '',
3 => 'IN',
4 => '4',
),
"array_absence_test_negation_faux" => array (
0 => false,
1 => array("2","3"),
2 => '!=',
3 => '2',
2 => '',
3 => '!=',
4 => '2',
),
"array_absence_test_negation_faux_serialize" => array (
0 => false,
1 => serialize(array("2","3")),
2 => '!=',
3 => '2',
2 => '',
3 => '!=',
4 => '2',
),
"array_absence_test_NOT_IN_faux" => array (
0 => false,
1 => array("2","3"),
2 => '!IN',
3 => '2',
2 => '',
3 => '!IN',
4 => '2',
),
"array_absence_test_NOT_IN_serialize" => array (
0 => false,
1 => serialize(array("2","3")),
2 => '!IN',
3 => '2',
2 => '',
3 => '!IN',
4 => '2',
),
"array_absence_test_neagation" => array (
0 => true,
1 => array("2","3"),
2 => '!=',
3 => '4',
2 => '',
3 => '!=',
4 => '4',
),
"array_absence_test_negation_serialize" => array (
0 => true,
1 => serialize(array("2","3")),
2 => '!=',
3 => '4',
2 => '',
3 => '!=',
4 => '4',
),
"array_absence_test_NOT_IN" => array (
0 => true,
1 => array("2","3"),
2 => '!IN',
3 => '4',
2 => '',
3 => '!IN',
4 => '4',
),
"array_presence_test_NOT_IN_serialize" => array (
0 => true,
1 => serialize(array("2","3")),
2 => '!IN',
3 => '4',
2 => '',
3 => '!IN',
4 => '4',
),
"array_presence_IN_multiple" => array(
0 => true,
1 => array("2"),
2 => "IN",
3 => "2,3"
2 => '',
3 => "IN",
4 => "2,3"
),
"array_absence_IN_multiple" => array(
0 => false,
1 => array("4", "5"),
2 => "IN",
3 => "2,3"
2 => '',
3 => "IN",
4 => "2,3"
),
"array_absence_NOT_IN_multiple" => array(
0 => true,
1 => array("4", "5"),
2 => "!IN",
3 => "2,3"
2 => '',
3 => "!IN",
4 => "2,3"
),
"array_presence_NOT_IN_multiple" => array(
0 => false,
1 => array("2", "1"),
2 => "!IN",
3 => "2,3"
2 => '',
3 => "!IN",
4 => "2,3"
)
);
return $essais;

Loading…
Cancel
Save