Changeset 113005 in spip-zone


Ignore:
Timestamp:
Dec 21, 2018, 12:02:03 AM (3 months ago)
Author:
root
Message:

Je suis encore tombé sur un bug dans l'évaluation côté php d'un
afficher_si, lié à un champ sérializé avec des checkbox cumulatifs.
Du coup, plutôt que d'essayer de debugger un code "pas terrible", et
pour tout dire illisible, je reprend tout ou presque à zero.
Ca permet notamment d'éviter d'avoir trop de chose en eval().

L'idée est de procéder ainsi

  1. reperer toutes les @champs@ (==|IN|!IN|!=) "quelquechose"
  2. Evaluer chacune de ces expressions, en tenant compte du fait que IN signifie en réalit in_array, et du fait qu'on peut avoir des champs dont la valeur est un array sérializé, ou un array tout court.
  3. Puis évaluer les relations booléens entre chacune de ces expressions.

Première étape : construire la fonction pour le 2 + les tests unitaires qui vont avec.

Location:
_plugins_/saisies/trunk
Files:
1 added
1 edited

Legend:

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

    r112970 r113005  
    525525                                $condition = preg_replace('#@(.+)@#U', '$env["valeurs"][\'$1\']', $condition);
    526526                        }
    527 
    528527                        /**
    529528                         * Tester si la condition utilise des champs qui sont des tableaux
     
    618617        return true;
    619618}
     619
     620/**
     621 * Teste une condition d'afficher_si
     622 * @param string|array champ le champ à tester. Cela peut être :
     623 *      - un string
     624 *      - un tableau
     625 *      - un tableau sérializé
     626 * @param string $operateur : l'opérateur:
     627 *      - IN
     628 *      - !IN
     629 *      - ==
     630 *      - !=
     631 *      @param string $valeur la valeur à tester pour un IN. Par exemple "23" ou encore "23", "25"
     632 * @return booleen false / true selon la condition
     633 **/
     634function saisies_tester_condition_afficher_si($champ, $operateur, $valeur) {
     635        // Dans tous les cas, enlever les guillemets qui sont au sein de valeur
     636        $valeur = str_replace("'", "", $valeur);
     637        $valeur = str_replace('"', "", $valeur);
     638
     639        //Si champ est de type string, tenter d'unserializer
     640        $tenter_unserialize = @unserialize($champ);
     641        if ($tenter_unserialize)  {
     642                $champ = $tenter_unserialize;
     643        }
     644
     645        //Et maintenant appeler les sous fonctions qui vont bien
     646        if (is_string($champ)) {
     647                return saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur);
     648        }  elseif (is_array($champ)) {
     649                return saisies_tester_condition_afficher_si_array($champ, $operateur, $valeur);
     650        } else {
     651                return false;
     652        }
     653}
     654
     655
     656
     657function saisies_tester_condition_afficher_si_string($champ, $operateur, $valeur) {
     658        if ($operateur == "==") {
     659                return $champ == $valeur;
     660        } elseif ($operateur == "!=") {
     661                return $champ != $valeur;
     662        } else {//Si mauvaise operateur -> on annule
     663                return false;
     664        }
     665}
     666
     667function saisies_tester_condition_afficher_si_array($champ, $operateur, $valeur) {
     668        // Convertir les valeurs en vrai tableau
     669        $valeur = explode(",", $valeur);
     670        $intersection = array_intersect($champ, $valeur);
     671        if ($operateur == "==" or $operateur == "IN") {
     672                return count($intersection) > 0;
     673        } else {
     674                return count($intersection) == 0;
     675        }
     676        return false;
     677}
Note: See TracChangeset for help on using the changeset viewer.