Changeset 117741 in spip-zone


Ignore:
Timestamp:
Sep 6, 2019, 4:37:00 PM (2 months ago)
Author:
maieul@…
Message:

saisies_afficher_si_js() : mise en place pour les champs classique et checkbox multiple

Location:
_plugins_/saisies/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/saisies/trunk/inc/saisies_afficher_si_js.php

    r117739 r117741  
    3030                        $negation = isset($test['negation']) ? $test['negation'] : '';
    3131                        $valeur = isset($test['valeur']) ? $test['valeur'] : '' ;
     32                        $valeur_numerique = isset($test['valeur_numerique']) ? $test['valeur_numerique'] : '' ;
    3233                        $plugin = saisies_afficher_si_evaluer_plugin($champ, $negation);
    3334                        if ($plugin !== '') {
     
    3738                                $test_modifie = eval('return '.saisies_tester_condition_afficher_si($config, $operateur, $valeur, $negation).';') ? 'true' : 'false';
    3839                                $condition = str_replace($expression, $test_modifie, $condition);
     40                        } else { // et maintenant, on rentre dans le vif du sujet : les champs. On délégue cela à une autre fonction
     41                                $condition = str_replace($expression, saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation), $condition);
    3942                        }
    4043                }
     
    4346}
    4447
     48/**
     49 * Génère à partir de l'analyse d'une condition afficher_si le test js, pour les champs
     50 * @param string $champ
     51 * @param string $operateur
     52 * @param string $valeur
     53 * @param string $valeur_numerique
     54 * @param string $valeur
     55 * @param string $guillemet
     56 * @param string $negation
     57 * @return string condition_js
     58**/
     59function saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation) {
     60        // Cas d'une valeur numérique : pour le test js, cela ne change rien, on la passe comme valeur
     61        if ($valeur_numerique and !$valeur) {
     62                $valeur = $valeur_numerique;
     63        }
     64        // Guillemets : si double, les échapper
     65        if ($guillemet == '"') {
     66                $guillemet = '\"';
     67        }
     68        // Cas de chekbox => convertir les conditions en test IN (compatibilité historique)
     69        if (stripos($champ, 'checkbox') !== false) {
     70                if ($operateur == '==') {
     71                        $operateur = 'IN';
     72                } elseif ($operateur == '!=') {
     73                        $operateur = '!IN';
     74                }
     75        }
     76        if ($operateur) {
     77                if ($operateur != 'IN' and $operateur != '!IN') {
     78                        return "$negation\$form().find('[name=$champ]').val() $operateur $guillemet$valeur$guillemet";
     79                } else {
     80                        // cas des checkbox (au sens saisie @checkbox_xx@) => operateur IN ou !IN
     81                        return saisies_afficher_si_js_IN($champ, $operateur, $valeur, $negation);
     82                }
     83        }
     84}
     85
     86
     87/**
     88 * Génère les tests js pour le cas où on a l'operateur IN ou !IN
     89 * c'est-à-dire, en pratique, pour les checkboxes
     90 * @param string $champ
     91 * @param string $operateur
     92 * @param string $valeur
     93 * @param string $negation
     94**/
     95function saisies_afficher_si_js_IN($champ, $operateur, $valeur, $negation) {
     96        // La négation de l'opérateur remonte globalement
     97        if ($operateur == '!IN' and $negation) {
     98                $negation = '';
     99        } elseif ($operateur == '!IN') {
     100                $negation = '!';
     101        }
     102        // Spliter la valeur pour trouver toutes les cases qui doivent être cochées (ou pas)
     103        $valeurs = explode(',', $valeur);
     104        $valeurs = array_map('saisies_afficher_si_js_IN_individuel', $valeurs, array_fill(0,count($valeurs),$champ));
     105        $valeurs = implode(' || ', $valeurs);
     106        return "$negation($valeurs)";
     107}
     108
     109/**
     110 * Génère le sous-test js pour le cas où on a l'operateur IN ou !IN
     111 * c'est-à-dire, en pratique, pour les checkboxes
     112 * Par "sous-test js", nous entendons le test pour une valeur précise d'un checkbox
     113 * Attention : $valeur en premier (car fonction appelée dans un array_map())
     114 * @param string $valeur
     115 * @param string $champ
     116 * @return string
     117**/
     118function saisies_afficher_si_js_IN_individuel($valeur, $champ) {
     119        return "$(form).find(checkbox[name=$champ".'[]'."][value='$valeur']).is(':checked')";
     120}
    45121/**
    46122 * Génère, à partir d'un tableau de saisie le code javascript ajouté à la fin de #GENERER_SAISIES
     
    111187                                                $condition = preg_replace('#@'.preg_quote($nom).'@#U', '($(form).find(".checkbox[name=\''.$nom.'\']").is(":checked") ? $(form).find(".checkbox[name=\''.$nom.'\']").val() : "")', $condition);
    112188                                                break;
    113                                         case 'checkbox':
    114                                                 /**
    115                                                  * Faire fonctionner @checkbox_xx@ == 'valeur' et @checkbox_xx@ != 'valeur'
    116                                                  */
    117                                                 $condition = preg_replace('#@(.+)@\s*(==|(!)=)\s*(\'[^\']*\'|"[^"]*")#U', "@$1@ $3IN $4", $condition );
    118                                                 /**
    119                                                  * Faire fonctionner @checkbox_xx@ IN 'valeur' ou @checkbox_xx@ !IN 'valeur'
    120                                                  */
    121                                                 preg_match_all('#@(.+)@\s*(!IN|IN)\s*[\'"](.*)[\'"]#U', $condition, $matches3);
    122                                                 foreach ($matches3[3] as $key => $value) {
    123                                                         $not = '';
    124                                                         if ($matches3[2][$key] == '!IN') {
    125                                                                 $not = '!';
    126                                                         }
    127                                                         $values = explode(',', $value);
    128                                                         $new_condition = $not.'(';
    129                                                         foreach ($values as $key2 => $cond) {
    130                                                                 if ($key2 > 0) {
    131                                                                         $new_condition .= ' || ';
    132                                                                 }
    133                                                                 $new_condition .= '($(form).find(".checkbox[name=\''.$nom.'[]\'][value='.$cond.']").is(":checked") ? $(form).find(".checkbox[name=\''.$nom.'[]\'][value='.$cond.']").val() : "") == "'.$cond.'"';
    134                                                         }
    135                                                         $new_condition .= ')';
    136                                                         $condition = str_replace($matches3[0][$key], $new_condition, $condition);
    137189                                                }
    138190                                                break;
    139                                         default:
    140                                                 $condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']").val()', $condition);
    141191                                }
    142192                        }
  • _plugins_/saisies/trunk/tests/saisies_afficher_si/saisies_afficher_si_js.php

    r117740 r117741  
    4141        function essais_saisies_evaluer_afficher_si(){
    4242                $essais = array (
    43                         'simple_egalite' =>
    44                         array (
    45                                 0 => true,
    46                                 1 => "@a@ == 'a'"
     43                        'input_egalite' => array(
     44                                0 => '$form().find(\'[name=input_1]\').val() == \'toto\'',
     45                                1 => '@input_1@ == \'toto\''
    4746                        ),
    48                         'simple_inegalite' =>
    49                         array (
    50                                 0 => false,
    51                                 1 => "@a@ == 'b'"
     47                        'input_egalite_double_quote' => array(
     48                                0 => '$form().find(\'[name=input_1]\').val() == \"toto\"',
     49                                1 => '@input_1@ == "toto"'
    5250                        ),
    53                         'double_egalite' =>
    54                         array (
    55                                 0 => true,
    56                                 1 => "@a@ == 'a' && @b@ == 'b'"
     51                        'input_egalite_nb' => array(
     52                                0 => '$form().find(\'[name=input_1]\').val() == 23',
     53                                1 => '@input_1@ == 23'
    5754                        ),
    58                         'double_egalite_fausse' =>
    59                         array (
    60                                 0 => false,
    61                                 1 => "@a@ == 'a' && @b@ == 'c'"
     55                        'input_inegalite' => array(
     56                                0 => '$form().find(\'[name=input_1]\').val() != \'toto\'',
     57                                1 => '@input_1@ != \'toto\''
    6258                        ),
    63                         'egalite_alternative' =>
    64                         array (
    65                                 0 => true,
    66                                 1 => "@a@ == 'a' || @b@ == 'c'"
     59                        'input_egalite_nie' => array(
     60                                0 => '!$form().find(\'[name=input_1]\').val() == \'toto\'',
     61                                1 => '!@input_1@ == \'toto\''
    6762                        ),
    68                         'egalite_alternative_fausse' =>
    69                         array (
    70                                 0 => false,
    71                                 1 => "@a@ == 'b' || @b@ == 'c'"
     63                        'input_inegalite_nie' => array(
     64                                0 => '!$form().find(\'[name=input_1]\').val() != \'toto\'',
     65                                1 => '!@input_1@ != \'toto\''
    7266                        ),
    73                         'presence_tableau_alternative' =>
    74                         array (
    75                                 0 => true,
    76                                 1 => "@tableau_1@ IN 'b' || @tableau_2@ == 'c'"
     67                        'checkbox_egalite' => array(
     68                                0 => '($(form).find(checkbox[name=checkbox_1[]][value=\'toto\']).is(\':checked\'))',
     69                                1 => '@checkbox_1@ == \'toto\''
    7770                        ),
    78                         'presence_tableau_cumulative' =>
    79                         array (
    80                                 0 => false,
    81                                 1 => "@tableau_1@ IN 'b' && @tableau_2@ == 'c'"
     71                        'checkbox_inegalite' => array(
     72                                0 => '!($(form).find(checkbox[name=checkbox_1[]][value=\'toto\']).is(\':checked\'))',
     73                                1 => '@checkbox_1@ != \'toto\''
    8274                        ),
    83                         'absence_tableau_cumulative' =>
    84                         array (
    85                                 0 => false,
    86                                 1 => "@tableau_1@ !IN 'b' && @tableau_2@ !IN 'c'"
     75                        'checkbox_IN' => array(
     76                                0 => '($(form).find(checkbox[name=checkbox_1[]][value=\'toto\']).is(\':checked\'))',
     77                                1 => '@checkbox_1@ IN \'toto\''
    8778                        ),
    88                         'absence_tableau_alternative' =>
    89                         array (
    90                                 0 => true,
    91                                 1 => "@tableau_1@ !IN 'b' || @tableau_2@ !IN 'c'"
     79                        'checkbox_NOT_IN' => array(
     80                                0 => '!($(form).find(checkbox[name=checkbox_1[]][value=\'toto\']).is(\':checked\'))',
     81                                1 => '@checkbox_1@ !IN \'toto\''
    9282                        ),
    93                         'champ_uniquement' => array(
    94                                 0 => true,
    95                                 1 => "@case_1@"
     83                        'checkbox_IN_nie' => array(
     84                                0 => '!($(form).find(checkbox[name=checkbox_1[]][value=\'toto\']).is(\':checked\'))',
     85                                1 => '@checkbox_1@ !IN \'toto\''
    9686                        ),
    97                         'champ_uniquement_faux' => array(
    98                                 0 => false,
    99                                 1 => "@case_2@"
     87                        'checkbox_NOT_IN_nie' => array(//cas sans doute rare, mais sait-on jamais
     88                                0 => '($(form).find(checkbox[name=checkbox_1[]][value=\'toto\']).is(\':checked\'))',
     89                                1 => '!@checkbox_1@ !IN \'toto\''
    10090                        ),
    101                         'champ_uniquement_negation' => array(
    102                                 0 => true,
    103                                 1 => "!@case_2@"
    104                         ),
    105                         'champ_uniquement_negation_faux' => array(
    106                                 0 => false,
    107                                 1 => "!@case_1@"
    108                         ),
    109                         'nombre_superieur_vrai' => array(
    110                                 0 => true,
    111                                 1 => "@nombre@ > 10"
    112                         ),
    113                         'nombre_superieur_faux' => array(
    114                                 0 => false,
    115                                 1 => "@nombre@ > 100"
    116                         ),
    117                         'nombre_superieur_egal_vrai' => array(
    118                                 0 => true,
    119                                 1 => "@nombre@ >= 20"
    120                         ),
    121                         'nombre_superieur_egal_faux' => array(
    122                                 0 => false,
    123                                 1 => "@nombre@ >= 100"
    124                         ),
    125                         'nombre_inferieur_vrai' => array(
    126                                 0 => true,
    127                                 1 => "@nombre@ < 100"
    128                         ),
    129                         'nombre_inferieur_faux' => array(
    130                                 0 => false,
    131                                 1 => "@nombre@ < 10"
    132                         ),
    133                         'nombre_inferieur_egal_vrai' => array(
    134                                 0 => true,
    135                                 1 => "@nombre@ <= 20"
    136                         ),
    137                         'nombre_inferieur_egal_faux' => array(
    138                                 0 => false,
    139                                 1 => "@nombre@ <= 10"
     91                        'checkbox_IN_MULTIPLE' => array(
     92                                0 => '($(form).find(checkbox[name=checkbox_1[]][value=\'toto\']).is(\':checked\') || $(form).find(checkbox[name=checkbox_1[]][value=\'tata\']).is(\':checked\'))',
     93                                1 => '@checkbox_1@ IN \'toto,tata\''
    14094                        ),
    14195                        'false' => array(
Note: See TracChangeset for help on using the changeset viewer.