Changeset 118698 in spip-zone


Ignore:
Timestamp:
Nov 18, 2019, 7:41:55 PM (12 months ago)
Author:
maieul@…
Message:

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

Location:
_plugins_/saisies/trunk
Files:
8 edited

Legend:

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

    r118697 r118698  
    1919          '(?<negation>!?)' // négation éventuelle
    2020                . '(?:@(?<champ>.+?)@)' // @champ_@
     21                . '(?<total>:TOTAL)?' // TOTAL éventuel (pour les champs de type case à cocher)
    2122                . '(' // partie operateur + valeur (optionnelle) : debut
    2223                . '(?:\s*?)' // espaces éventuels après
     
    6061 *      - un tableau
    6162 *      - un tableau sérializé
     63 * @param string $total TOTAL si on demande de faire le décompte dans un tableau
    6264 * @param string $operateur : l'opérateur:
    6365 * @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23", "25"
     
    6567 * @return bool false / true selon la condition
    6668**/
    67 function saisies_tester_condition_afficher_si($champ, $operateur=null, $valeur=null, $negation = '') {
     69function saisies_tester_condition_afficher_si($champ, $total, $operateur=null, $valeur=null, $negation = '') {
    6870        // Si operateur null => on test juste qu'un champ est cochée / validé
    6971        if ($operateur === null and $valeur === null) {
     
    9092                $retour = saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur);
    9193        } elseif (is_array($champ)) {
    92                 $retour = saisies_tester_condition_afficher_si_array($champ, $operateur, $valeur);
     94                $retour = saisies_tester_condition_afficher_si_array($champ, $total, $operateur, $valeur);
    9395        } else {
    9496                $retour = false;
     
    133135 * @return bool false / true selon la condition
    134136**/
    135 function saisies_tester_condition_afficher_si_array($champ, $operateur, $valeur) {
    136         $valeur = explode(',', $valeur);
    137         $intersection = array_intersect($champ, $valeur);
    138         if ($operateur == "==" or $operateur == "IN") {
    139                 return count($intersection) > 0;
    140         } else {
    141                 return count($intersection) == 0;
    142         }
    143         return false;
     137function saisies_tester_condition_afficher_si_array($champ, $total, $operateur, $valeur) {
     138        if ($total) {//Cas 1 : on demande à compter le nombre total de champ
     139                return saisies_tester_condition_afficher_si_string(count($champ), $operateur, $valeur);
     140        } else {//Cas deux : on test une valeur
     141                $valeur = explode(',', $valeur);
     142                $intersection = array_intersect($champ, $valeur);
     143                if ($operateur == "==" or $operateur == "IN") {
     144                        return count($intersection) > 0;
     145                } else {
     146                        return count($intersection) == 0;
     147                }
     148                return false;
     149        }
    144150}
    145151
  • _plugins_/saisies/trunk/inc/saisies_afficher_si_js.php

    r118020 r118698  
    3636                        $negation = isset($test['negation']) ? $test['negation'] : '' ;
    3737                        $champ = isset($test['champ']) ? $test['champ'] : '' ;
     38                        $total = isset($test['total']) ? $test['total'] : '';
    3839                        $operateur = isset($test['operateur']) ? $test['operateur'] : '' ;
    3940                        $guillemet = isset($test['guillemet']) ? $test['guillemet'] : '' ;
     
    4748                        } elseif (stripos($champ, 'config:') !== false) {
    4849                                $config = saisies_afficher_si_get_valeur_config($champ);
    49                                 $test_modifie = eval('return '.saisies_tester_condition_afficher_si($config, $operateur, $valeur, $negation).';') ? 'true' : 'false';
     50                                $test_modifie = eval('return '.saisies_tester_condition_afficher_si($config, $total, $operateur, $valeur, $negation).';') ? 'true' : 'false';
    5051                                $condition = str_replace($expression, $test_modifie, $condition);
    5152                        } elseif ($booleen)  {
    5253                                $condition = $condition;
    5354                        } else { // et maintenant, on rentre dans le vif du sujet : les champs. On délégue cela à une autre fonction
    54                                 $condition = str_replace($expression, saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form), $condition);
     55                                $condition = str_replace($expression, saisies_afficher_si_js_champ($champ, $total, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form), $condition);
    5556                        }
    5657                }
     
    6768 * Génère à partir de l'analyse d'une condition afficher_si le test js, pour les champs
    6869 * @param string $champ
     70 * @param string $total
    6971 * @param string $operateur
    7072 * @param string $valeur
     
    7678 * @return string condition_js
    7779**/
    78 function saisies_afficher_si_js_champ($champ, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form) {
     80function saisies_afficher_si_js_champ($champ, $total, $operateur, $valeur, $valeur_numerique, $guillemet, $negation, $saisies_form) {
    7981        if (!isset($saisies_form[$champ])) {//La saisie conditionnante n'existe pas pour ce formulaire > on laisse tomber
    8082                spip_log("Afficher_si incorrect. Champ $champ inexistant", "saisies"._LOG_CRITIQUE);
     
    8284        }
    8385        $saisie = $saisies_form[$champ]['saisie'];
    84         if ($saisie == 'checkbox') {
    85                 return saisies_afficher_si_js_checkbox($champ, $operateur, $valeur, $negation);
    86         }
    8786
    8887        // Cas d'une valeur numérique : pour le test js, cela ne change rien, on la passe comme valeur
     
    9089                $valeur = $valeur_numerique;
    9190        }
    92         // Guillemets : si double, les échapper
    9391
     92        // cas checkbox
     93        if ($saisie == 'checkbox') {
     94                return saisies_afficher_si_js_checkbox($champ, $total, $operateur, $valeur, $negation);
     95        }
    9496        // cas case
    9597        if ($saisie == 'case') {// case
    96                 return saisies_afficher_si_js_case($champ, $operateur, $valeur, $guillemet, $negation);
     98                return saisies_afficher_si_js_case($champ, $total, $operateur, $valeur, $guillemet, $negation);
    9799        }
    98100        // cas radio
    99101        if ($saisie == 'radio' or $saisie == 'oui_non' or $saisie == 'true_false') {// radio et assimilés
    100                 return saisies_afficher_si_js_radio($champ, $operateur, $valeur, $guillemet, $negation);
     102                return saisies_afficher_si_js_radio($champ, $total, $operateur, $valeur, $guillemet, $negation);
    101103        }
    102104        // sinon cas par défaut
     
    108110 * Génère les tests js pour les cas de case
    109111 * @param string $champ
     112 * @param string $total
    110113 * @param string $operateur
    111114 * @param string $valeur
     
    113116 * @param string $negation
    114117**/
    115 function saisies_afficher_si_js_case($champ, $operateur, $valeur, $guillemet, $negation) {
     118function saisies_afficher_si_js_case($champ, $total, $operateur, $valeur, $guillemet, $negation) {
    116119        if ($valeur  and $operateur) {
    117120                return "$negation($(form).find(\".checkbox[name='$champ']\").is(':checked') ? $(form).find(\".checkbox[name='$champ']\").val() : '') $operateur $guillemet$valeur$guillemet";
     
    124127 * Génère les tests js pour les cas de radio
    125128 * @param string $champ
     129 * @param string $total
    126130 * @param string $operateur
    127131 * @param string $valeur
     
    129133 * @param string $negation
    130134**/
    131 function saisies_afficher_si_js_radio($champ, $operateur, $valeur, $guillemet, $negation) {
     135function saisies_afficher_si_js_radio($champ, $total, $operateur, $valeur, $guillemet, $negation) {
    132136        return "$negation$(form).find(\"[name='$champ']:checked\").val() $operateur $guillemet$valeur$guillemet";
    133137}
     
    136140 * Génère les tests js pour les cas de checkbox
    137141 * @param string $champ
     142 * @param string $total
    138143 * @param string $operateur
    139144 * @param string $valeur
    140145 * @param string $negation
    141146**/
    142 function saisies_afficher_si_js_checkbox($champ, $operateur, $valeur, $negation) {
    143         // Convertir les conditions en test IN (compatibilité historique)
    144         if ($operateur == '==') {
    145                 $operateur = 'IN';
    146         } elseif ($operateur == '!=') {
    147                 $operateur = '!IN';
     147function saisies_afficher_si_js_checkbox($champ, $total, $operateur, $valeur, $negation) {
     148        if ($total) {// Cas 1 : on cherche juste à savoir le nombre total de case coché
     149                $result = "$negation$(form).find(\"[name^='$champ']:checked\").length $operateur $valeur";
     150                return $result;
     151        } else {// Cas 2 : on cherche à savoir s'il y a une case avec une certaine valeur
     152                // Convertir les conditions en test IN (compatibilité historique)
     153                if ($operateur == '==') {
     154                        $operateur = 'IN';
     155                } elseif ($operateur == '!=') {
     156                        $operateur = '!IN';
     157                }
     158                // La négation de l'opérateur remonte globalement
     159                if ($operateur == '!IN' and $negation) {
     160                        $negation = '';
     161                } elseif ($operateur == '!IN') {
     162                        $negation = '!';
     163                }
     164                // Spliter la valeur pour trouver toutes les cases qui doivent être cochées (ou pas)
     165                $valeurs = explode(',', $valeur);
     166                $valeurs = array_map('saisies_afficher_si_js_IN_individuel', $valeurs, array_fill(0,count($valeurs),$champ));
     167                $valeurs = implode(' || ', $valeurs);
     168                return "$negation($valeurs)";
    148169        }
    149         // La négation de l'opérateur remonte globalement
    150         if ($operateur == '!IN' and $negation) {
    151                 $negation = '';
    152         } elseif ($operateur == '!IN') {
    153                 $negation = '!';
    154         }
    155         // Spliter la valeur pour trouver toutes les cases qui doivent être cochées (ou pas)
    156         $valeurs = explode(',', $valeur);
    157         $valeurs = array_map('saisies_afficher_si_js_IN_individuel', $valeurs, array_fill(0,count($valeurs),$champ));
    158         $valeurs = implode(' || ', $valeurs);
    159         return "$negation($valeurs)";
    160170}
    161171
  • _plugins_/saisies/trunk/inc/saisies_afficher_si_php.php

    r118456 r118698  
    145145
    146146                                $champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
     147                                $total = isset($test['total']) ? $test['total'] : '';
    147148                                $operateur = isset($test['operateur']) ? $test['operateur'] : null;
    148149                                $negation = isset($test['negation']) ? $test['negation'] : '';
     
    155156                                }
    156157
    157                                 $test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
     158                                $test_modifie = saisies_tester_condition_afficher_si($champ, $total, $operateur, $valeur, $negation) ? 'true' : 'false';
    158159                                $condition = str_replace($expression, $test_modifie, $condition);
    159160                        }
  • _plugins_/saisies/trunk/javascript/afficher_si.js.html

    r118649 r118698  
    99                $(this).find('texteara, input, select').change(function(){
    1010                                form = $(this).parents('form');
    11                                 name = $(this).attr('name');
     11                                name = $(this).attr('name').replace(/\\[.*\\]/,'');
    1212                                form.find('[data-afficher_si*=\''+name+'\']').each(function(){
    1313                                        verifier_afficher_si(form, $(this));
  • _plugins_/saisies/trunk/tests/saisies_afficher_si/saisies_afficher_si_js.php

    r118020 r118698  
    156156                                2 => $saisies_form
    157157                        ),
     158                        'checkbox_TOTAL' => array(
     159                                0 => '$(form).find(&quot;[name^=\'checkbox_1\']:checked&quot;).length > 1',
     160                                1 => '@checkbox_1@:TOTAL > 1',
     161                                2 => $saisies_form
     162                        ),
    158163                        'checkbox_NOT_IN' => array(
    159164                                0 => '!($(form).find(\'[name=&quot;checkbox_1[]&quot;][value=&quot;toto&quot;]\').is(\':checked\'))',
  • _plugins_/saisies/trunk/tests/saisies_afficher_si/saisies_afficher_si_verifier_syntaxe.php

    r117767 r118698  
    103103                                1 => "true"
    104104                        ),
     105                        'total' =>
     106                        array(
     107                                0 => true,
     108                                1 => '@checkbox_1@:TOTAL > 1'
     109                        )
    105110                );
    106111                foreach ($essais as $nom=>$param) {
  • _plugins_/saisies/trunk/tests/saisies_afficher_si/saisies_evaluer_afficher_si.php

    r117763 r118698  
    221221                                0 => true,
    222222                                1 => '@cascade[a]@ == \'a\''
     223                        ),
     224                        'total_tableau_sup' => array(
     225                                0 => true,
     226                                1 => '@tableau_1@:TOTAL > 2'
     227                        ),
     228                        'total_tableau_inf' => array(
     229                                0 => false,
     230                                1 => '@tableau_1@:TOTAL < 2'
    223231                        )
    224232                );
  • _plugins_/saisies/trunk/tests/saisies_afficher_si/saisies_tester_condition_afficher_si.php

    r117729 r118698  
    3939                                0 => true,
    4040                                1 => "case_1",
     41                                2 => '',
    4142                        ),
    4243                        "chaines_egales_test_egalite" => array (
    4344                                0 => true,
    4445                                1 => 'a',
    45                                 2 => '==',
    46                                 3 => 'a',
     46                                2 => '',
     47                                3 => '==',
     48                                4 => 'a',
    4749                        ),
    4850                        "chaines_inegales_test_egalite" => array (
    4951                                0 => false,
    5052                                1 => 'a',
    51                                 2 => '!=',
    52                                 3 => 'a',
     53                                2 => '',
     54                                3 => '!=',
     55                                4 => 'a',
    5356                        ),
    5457                        "chaines_egales_test_inegalite" => array (
    5558                                0 => false,
    5659                                1 => 'a',
    57                                 2 => '!=',
    58                                 3 => 'a',
     60                                2 => '',
     61                                3 => '!=',
     62                                4 => 'a',
    5963                        ),
    6064                        "chaines_inegales_test_egalite" => array (
    6165                                0 => false,
    6266                                1 => 'a',
    63                                 2 => '!=',
    64                                 3 => 'a',
     67                                2 => '',
     68                                3 => '!=',
     69                                4 => 'a',
    6570                        ),
    6671                        "array_presence_test_double_egal" => array (
    6772                                0 => true,
    6873                                1 => array("2","3"),
    69                                 2 => '==',
    70                                 3 => '2',
     74                                2 => '',
     75                                3 => '==',
     76                                4 => '2',
    7177                        ),
    7278                        "array_presence_test_double_egal_serialize" => array (
    7379                                0 => true,
    7480                                1 => serialize(array("2","3")),
    75                                 2 => '==',
    76                                 3 => '2',
     81                                2 => '',
     82                                3 => '==',
     83                                4 => '2',
    7784                        ),
    7885                        "array_presence_test_IN" => array (
    7986                                0 => true,
    8087                                1 => array("2","3"),
    81                                 2 => 'IN',
    82                                 3 => '2',
     88                                2 => '',
     89                                3 => 'IN',
     90                                4 => '2',
    8391                        ),
    8492                        "array_presence_test_IN_serialize" => array (
    8593                                0 => true,
    8694                                1 => serialize(array("2","3")),
    87                                 2 => 'IN',
    88                                 3 => '2',
     95                                2 => '',
     96                                3 => 'IN',
     97                                4 => '2',
    8998                        ),
    9099                        "array_presence_test_double_egal_faux" => array (
    91100                                0 => false,
    92101                                1 => array("2","3"),
    93                                 2 => '==',
    94                                 3 => '4',
     102                                2 => '',
     103                                3 => '==',
     104                                4 => '4',
    95105                        ),
    96106                        "array_presence_test_double_egal_faux_serialize" => array (
    97107                                0 => false,
    98108                                1 => serialize(array("2","3")),
    99                                 2 => '==',
    100                                 3 => '4',
     109                                2 => '',
     110                                3 => '==',
     111                                4 => '4',
    101112                        ),
    102113                        "array_presence_test_IN_faux" => array (
    103114                                0 => false,
    104115                                1 => array("2","3"),
    105                                 2 => 'IN',
    106                                 3 => '4',
     116                                2 => '',
     117                                3 => 'IN',
     118                                4 => '4',
    107119                        ),
    108120                        "array_presence_test_IN_faux_serialize" => array (
    109121                                0 => false,
    110122                                1 => serialize(array("2","3")),
    111                                 2 => 'IN',
    112                                 3 => '4',
     123                                2 => '',
     124                                3 => 'IN',
     125                                4 => '4',
    113126                        ),
    114127                        "array_absence_test_negation_faux" => array (
    115128                                0 => false,
    116129                                1 => array("2","3"),
    117                                 2 => '!=',
    118                                 3 => '2',
     130                                2 => '',
     131                                3 => '!=',
     132                                4 => '2',
    119133                        ),
    120134                        "array_absence_test_negation_faux_serialize" => array (
    121135                                0 => false,
    122136                                1 => serialize(array("2","3")),
    123                                 2 => '!=',
    124                                 3 => '2',
     137                                2 => '',
     138                                3 => '!=',
     139                                4 => '2',
    125140                        ),
    126141                        "array_absence_test_NOT_IN_faux" => array (
    127142                                0 => false,
    128143                                1 => array("2","3"),
    129                                 2 => '!IN',
    130                                 3 => '2',
     144                                2 => '',
     145                                3 => '!IN',
     146                                4 => '2',
    131147                        ),
    132148                        "array_absence_test_NOT_IN_serialize" => array (
    133149                                0 => false,
    134150                                1 => serialize(array("2","3")),
    135                                 2 => '!IN',
    136                                 3 => '2',
     151                                2 => '',
     152                                3 => '!IN',
     153                                4 => '2',
    137154                        ),
    138155                        "array_absence_test_neagation" => array (
    139156                                0 => true,
    140157                                1 => array("2","3"),
    141                                 2 => '!=',
    142                                 3 => '4',
     158                                2 => '',
     159                                3 => '!=',
     160                                4 => '4',
    143161                        ),
    144162                        "array_absence_test_negation_serialize" => array (
    145163                                0 => true,
    146164                                1 => serialize(array("2","3")),
    147                                 2 => '!=',
    148                                 3 => '4',
     165                                2 => '',
     166                                3 => '!=',
     167                                4 => '4',
    149168                        ),
    150169                        "array_absence_test_NOT_IN" => array (
    151170                                0 => true,
    152171                                1 => array("2","3"),
    153                                 2 => '!IN',
    154                                 3 => '4',
     172                                2 => '',
     173                                3 => '!IN',
     174                                4 => '4',
    155175                        ),
    156176                        "array_presence_test_NOT_IN_serialize" => array (
    157177                                0 => true,
    158178                                1 => serialize(array("2","3")),
    159                                 2 => '!IN',
    160                                 3 => '4',
     179                                2 => '',
     180                                3 => '!IN',
     181                                4 => '4',
    161182                        ),
    162183                        "array_presence_IN_multiple" => array(
    163184                                0 => true,
    164185                                1 => array("2"),
    165                                 2 => "IN",
    166                                 3 => "2,3"
     186                                2 => '',
     187                                3 => "IN",
     188                                4 => "2,3"
    167189                        ),
    168190                        "array_absence_IN_multiple" => array(
    169191                                0 => false,
    170192                                1 => array("4", "5"),
    171                                 2 => "IN",
    172                                 3 => "2,3"
     193                                2 => '',
     194                                3 => "IN",
     195                                4 => "2,3"
    173196                        ),
    174197                        "array_absence_NOT_IN_multiple" => array(
    175198                                0 => true,
    176199                                1 => array("4", "5"),
    177                                 2 => "!IN",
    178                                 3 => "2,3"
     200                                2 => '',
     201                                3 => "!IN",
     202                                4 => "2,3"
    179203                        ),
    180204                        "array_presence_NOT_IN_multiple" => array(
    181205                                0 => false,
    182206                                1 => array("2", "1"),
    183                                 2 => "!IN",
    184                                 3 => "2,3"
     207                                2 => '',
     208                                3 => "!IN",
     209                                4 => "2,3"
    185210                        )
    186211                );
Note: See TracChangeset for help on using the changeset viewer.