source: spip-zone/_plugins_/saisies/trunk/inc/saisies_afficher_si_php.php @ 118456

Last change on this file since 118456 was 118456, checked in by maieul@…, 5 months ago

un static qui ne retournait pas le bon résultat + ne prenait pas en compte une récursivité > un static qui n'en vaut pas la peine

File size: 5.9 KB
Line 
1<?php
2
3/**
4 * Gestion de l'affichage conditionnelle des saisies.
5 * Partie spécifique php
6 *
7 * @package SPIP\Saisies\Afficher_si_php
8**/
9
10// Sécurité
11if (!defined('_ECRIRE_INC_VERSION')) {
12        return;
13}
14
15include_spip('inc/saisies_afficher_si_commun');
16
17/**
18 * Lorsque l'on affiche les saisies (#VOIR_SAISIES), les saisies ayant une option afficher_si
19 * et dont les conditions ne sont pas remplies doivent être retirées du tableau de saisies.
20 *
21 * Cette fonction sert aussi lors de la vérification des saisies avec saisies_verifier().
22 * À ce moment là, les saisies non affichées sont retirées de _request
23 * (on passe leur valeur à NULL).
24 *
25 * @param array      $saisies
26 *                            Tableau de descriptions de saisies
27 * @param array|null $env
28 *                            Tableau d'environnement transmis dans inclure/voir_saisies.html,
29 *                            NULL si on doit rechercher dans _request (pour saisies_verifier()).
30 *
31 * @return array
32 *               Tableau de descriptions de saisies
33 */
34function saisies_verifier_afficher_si($saisies, $env = null) {
35        // eviter une erreur par maladresse d'appel :)
36        if (!is_array($saisies)) {
37                return array();
38        }
39
40        foreach ($saisies as $cle => $saisie) {
41                if (isset($saisie['options']['afficher_si'])) {
42                        $condition = $saisie['options']['afficher_si'];
43                        // Est-ce uniquement au remplissage?
44                        if (isset($saisie['options']['afficher_si_remplissage_uniquement'])
45                                and $saisie['options']['afficher_si_remplissage_uniquement']=='on'){
46                                $remplissage_uniquement = true;
47                        } else {
48                                $remplissage_uniquement = false;
49                        }
50
51                        // On transforme en une condition PHP valide
52                        $ok = saisies_evaluer_afficher_si($condition, $env);
53                        if (!$ok) {
54                                if ($remplissage_uniquement == false or is_null($env)) {
55                                        unset($saisies[$cle]);
56                                }
57                                if (is_null($env)) {
58                                        if ($saisie['saisie'] == 'explication') {
59                                                unset($saisies[$cle]);
60                                        } else {
61                                                saisies_set_request_null_recursivement($saisie);
62                                        }
63                                }
64                        }
65                }
66                if (isset($saisies[$cle]['saisies'])) {
67                        // S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies
68                        $saisies[$cle]['saisies'] = saisies_verifier_afficher_si($saisies[$cle]['saisies'], $env);
69                }
70        }
71        return $saisies;
72}
73
74
75
76/**
77 * Pose un set_request null sur une saisie et toute ses sous-saisies.
78 * Utiliser notamment pour annuler toutes les sous saisies d'un fieldeset
79 * si le fieldset est masquée à cause d'un afficher_si.
80 * @param array $saisie
81**/
82function saisies_set_request_null_recursivement($saisie) {
83        set_request($saisie['options']['nom'], null);
84        if (isset($saisie['saisies'])) {
85                foreach ($saisie['saisies'] as $sous_saisie) {
86                        saisies_set_request_null_recursivement($sous_saisie);
87                }
88        }
89}
90
91/**
92 * Récupère la valeur d'un champ à tester avec afficher_si
93 * Si le champ est de type @config:xx@, alors prend la valeur de la config
94 * sinon en _request() ou en $env["valeurs"]
95 * @param string $champ: le champ
96 * @param null|array $env
97 * @return  la valeur du champ ou de la config
98 **/
99function saisies_afficher_si_get_valeur_champ($champ, $env) {
100        $plugin = saisies_afficher_si_evaluer_plugin($champ);
101        $config = saisies_afficher_si_get_valeur_config($champ);
102        if ($plugin !== '') {
103                $champ = $plugin;
104        } elseif ($config) {
105                $champ = $config;
106        } elseif (is_null($env)) {
107                // Si le nom du champ est un tableau indexé, il faut parser !
108                if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
109                        $champ= _request($separe[1]);
110                        preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
111                        // On va chercher au fond du tableau
112                        foreach ($index[1] as $cle) {
113                                $champ = $champ[$cle];
114                        }
115                } else {
116                        $champ = _request($champ);
117                }
118        } else {
119                $champ = $env["valeurs"][$champ];
120        }
121        return $champ;
122}
123
124
125/**
126 * Prend un test conditionnel,
127 * le sépare en une série de sous-tests de type champ - operateur - valeur
128 * remplace chacun de ces sous-tests par son résultat
129 * renvoie la chaine transformé
130 * @param string $condition
131 * @param array|null $env
132 *   Tableau d'environnement transmis dans inclure/voir_saisies.html,
133 *   NULL si on doit rechercher dans _request (pour saisies_verifier()).
134 * @return string $condition
135**/
136function saisies_transformer_condition_afficher_si($condition, $env = null) {
137        if ($tests = saisies_parser_condition_afficher_si($condition)) {
138                if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
139                        spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
140                        return '';
141                }
142                foreach ($tests as $test) {
143                        $expression = $test[0];
144                        if (!isset($test['booleen'])) {
145
146                                $champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
147                                $operateur = isset($test['operateur']) ? $test['operateur'] : null;
148                                $negation = isset($test['negation']) ? $test['negation'] : '';
149                                if (isset($test['valeur_numerique'])) {
150                                        $valeur = intval($test['valeur_numerique']);
151                                } elseif (isset($test['valeur'])) {
152                                        $valeur = $test['valeur'];
153                                } else {
154                                        $valeur = null;
155                                }
156
157                                $test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
158                                $condition = str_replace($expression, $test_modifie, $condition);
159                        }
160                }
161        } else {
162                if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
163                        spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
164                        return '';
165                }
166        }
167        return $condition;
168}
169
170
171/**
172 * Evalue un afficher_si
173 * @param string $condition (déjà checkée en terme de sécurité)
174 * @param array|null $env
175 *   Tableau d'environnement transmis dans inclure/voir_saisies.html,
176 *   NULL si on doit rechercher dans _request (pour saisies_verifier()).
177 * @return bool le résultat du test
178**/
179function saisies_evaluer_afficher_si($condition, $env = null) {
180        $condition = saisies_transformer_condition_afficher_si($condition, $env);
181        if ($condition) {
182                eval('$ok = '.$condition.';');
183        } else {
184                $ok = true;
185        }
186        return $ok;
187}
Note: See TracBrowser for help on using the repository browser.