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

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

un code qui s'était retrouvé doublonné avec la fusion de branche

File size: 6.1 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        // Economiser un peu de calcul, notamment pour formidable
40        static $precedent_saisies = array();
41        static $precedent_env = array();
42        if ($precedent_saisies == $saisies and $precedent_env == $env) {
43                return $saisies;
44        }
45        $precedent_saisies = $saisies;
46        $precedent_env = $env;
47        foreach ($saisies as $cle => $saisie) {
48                if (isset($saisie['options']['afficher_si'])) {
49                        $condition = $saisie['options']['afficher_si'];
50                        // Est-ce uniquement au remplissage?
51                        if (isset($saisie['options']['afficher_si_remplissage_uniquement'])
52                                and $saisie['options']['afficher_si_remplissage_uniquement']=='on'){
53                                $remplissage_uniquement = true;
54                        } else {
55                                $remplissage_uniquement = false;
56                        }
57
58                        // On transforme en une condition PHP valide
59                        $ok = saisies_evaluer_afficher_si($condition, $env);
60                        if (!$ok) {
61                                if ($remplissage_uniquement == false or is_null($env)) {
62                                        unset($saisies[$cle]);
63                                }
64                                if (is_null($env)) {
65                                        if ($saisie['saisie'] == 'explication') {
66                                                unset($saisies[$cle]);
67                                        } else {
68                                                saisies_set_request_null_recursivement($saisie);
69                                        }
70                                }
71                        }
72                }
73                if (isset($saisies[$cle]['saisies'])) {
74                        // S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies
75                        $saisies[$cle]['saisies'] = saisies_verifier_afficher_si($saisies[$cle]['saisies'], $env);
76                }
77        }
78        return $saisies;
79}
80
81
82
83/**
84 * Pose un set_request null sur une saisie et toute ses sous-saisies.
85 * Utiliser notamment pour annuler toutes les sous saisies d'un fieldeset
86 * si le fieldset est masquée à cause d'un afficher_si.
87 * @param array $saisie
88**/
89function saisies_set_request_null_recursivement($saisie) {
90        set_request($saisie['options']['nom'], null);
91        if (isset($saisie['saisies'])) {
92                foreach ($saisie['saisies'] as $sous_saisie) {
93                        saisies_set_request_null_recursivement($sous_saisie);
94                }
95        }
96}
97
98/**
99 * Récupère la valeur d'un champ à tester avec afficher_si
100 * Si le champ est de type @config:xx@, alors prend la valeur de la config
101 * sinon en _request() ou en $env["valeurs"]
102 * @param string $champ: le champ
103 * @param null|array $env
104 * @return  la valeur du champ ou de la config
105 **/
106function saisies_afficher_si_get_valeur_champ($champ, $env) {
107        $plugin = saisies_afficher_si_evaluer_plugin($champ);
108        $config = saisies_afficher_si_get_valeur_config($champ);
109        if ($plugin !== '') {
110                $champ = $plugin;
111        } elseif ($config) {
112                $champ = $config;
113        } elseif (is_null($env)) {
114                // Si le nom du champ est un tableau indexé, il faut parser !
115                if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
116                        $champ= _request($separe[1]);
117                        preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
118                        // On va chercher au fond du tableau
119                        foreach ($index[1] as $cle) {
120                                $champ = $champ[$cle];
121                        }
122                } else {
123                        $champ = _request($champ);
124                }
125        } else {
126                $champ = $env["valeurs"][$champ];
127        }
128        return $champ;
129}
130
131
132/**
133 * Prend un test conditionnel,
134 * le sépare en une série de sous-tests de type champ - operateur - valeur
135 * remplace chacun de ces sous-tests par son résultat
136 * renvoie la chaine transformé
137 * @param string $condition
138 * @param array|null $env
139 *   Tableau d'environnement transmis dans inclure/voir_saisies.html,
140 *   NULL si on doit rechercher dans _request (pour saisies_verifier()).
141 * @return string $condition
142**/
143function saisies_transformer_condition_afficher_si($condition, $env = null) {
144        if ($tests = saisies_parser_condition_afficher_si($condition)) {
145                if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
146                        spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
147                        return '';
148                }
149                foreach ($tests as $test) {
150                        $expression = $test[0];
151                        if (!isset($test['booleen'])) {
152
153                                $champ = saisies_afficher_si_get_valeur_champ($test['champ'], $env);
154                                $operateur = isset($test['operateur']) ? $test['operateur'] : null;
155                                $negation = isset($test['negation']) ? $test['negation'] : '';
156                                if (isset($test['valeur_numerique'])) {
157                                        $valeur = intval($test['valeur_numerique']);
158                                } elseif (isset($test['valeur'])) {
159                                        $valeur = $test['valeur'];
160                                } else {
161                                        $valeur = null;
162                                }
163
164                                $test_modifie = saisies_tester_condition_afficher_si($champ, $operateur, $valeur, $negation) ? 'true' : 'false';
165                                $condition = str_replace($expression, $test_modifie, $condition);
166                        }
167                }
168        } else {
169                if (!saisies_afficher_si_verifier_syntaxe($condition, $tests)) {
170                        spip_log("Afficher_si incorrect. $condition syntaxe_incorrecte", "saisies"._LOG_CRITIQUE);
171                        return '';
172                }
173        }
174        return $condition;
175}
176
177
178/**
179 * Evalue un afficher_si
180 * @param string $condition (déjà checkée en terme de sécurité)
181 * @param array|null $env
182 *   Tableau d'environnement transmis dans inclure/voir_saisies.html,
183 *   NULL si on doit rechercher dans _request (pour saisies_verifier()).
184 * @return bool le résultat du test
185**/
186function saisies_evaluer_afficher_si($condition, $env = null) {
187        $condition = saisies_transformer_condition_afficher_si($condition, $env);
188        if ($condition) {
189                eval('$ok = '.$condition.';');
190        } else {
191                $ok = true;
192        }
193        return $ok;
194}
Note: See TracBrowser for help on using the repository browser.