source: spip-zone/_plugins_/saisies/inc/saisies_afficher.php @ 62644

Last change on this file since 62644 was 62644, checked in by marcimat@…, 7 years ago

Correction de notices PHP

File size: 13.5 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) return;
5
6/*
7 * Indique si une saisie peut être affichée.
8 * On s'appuie sur l'éventuelle clé "editable" du $champ.
9 * Si editable vaut :
10 *  absent : le champ est éditable
11 *  1, le champ est éditable
12 *  0, le champ n'est pas éditable
13 * -1, le champ est éditable s'il y a du contenu dans le champ (l'environnement)
14 *     ou dans un de ses enfants (fieldsets)
15 *
16 * @param $champ tableau de description de la saisie
17 * @param $env environnement transmis à la saisie, certainement l'environnement du formulaire
18 * @param $utiliser_editable false pour juste tester le cas -1
19 *
20 * @return bool Retourne un booléen indiquant l'état éditable ou pas
21 */
22function saisie_editable($champ, $env, $utiliser_editable=true) {
23        if ($utiliser_editable) {
24                // si le champ n'est pas éditable, on sort.
25                if (!isset($champ['editable'])) {
26                        return true;
27                }
28                $editable = $champ['editable'];
29
30                if ($editable > 0) {
31                        return true;
32                }
33                if ($editable == 0) {
34                        return false;
35                }
36        }
37
38        // cas -1
39        // name de la saisie
40        if (isset($champ['options']['nom'])) {
41                // si on a le name dans l'environnement, on le teste
42                $nom = $champ['options']['nom'];
43                if (isset($env[$nom])) {
44                        return $env[$nom] ? true : false ;
45                }
46        }
47        // sinon, si on a des sous saisies
48        if (isset($champ['saisies']) and is_array($champ['saisies'])) {
49                foreach($champ['saisies'] as $saisie) {
50                        if (saisie_editable($saisie, $env, false)) {
51                                return true;
52                        }
53                }
54        }
55       
56        // aucun des paramètres demandés n'avait de contenu
57        return false;
58}
59
60/*
61 * Génère une saisie à partir d'un tableau la décrivant et de l'environnement
62 * Le tableau doit être de la forme suivante :
63 * array(
64 *              'saisie' => 'input',
65 *              'options' => array(
66 *                      'nom' => 'le_name',
67 *                      'label' => 'Un titre plus joli',
68 *                      'obligatoire' => 'oui',
69 *                      'explication' => 'Remplissez ce champ en utilisant votre clavier.'
70 *              )
71 * )
72 */
73function saisies_generer_html($champ, $env=array()){
74        // Si le parametre n'est pas bon, on genere du vide
75        if (!is_array($champ))
76                return '';
77
78        // Si la saisie n'est pas editable, on sort aussi.
79        if (!saisie_editable($champ, $env)) {
80                return '';
81        }
82       
83        $contexte = array();
84       
85        // On sélectionne le type de saisie
86        $contexte['type_saisie'] = $champ['saisie'];
87        // Identifiant unique de saisie, si present
88        if (isset($champ['identifiant'])) {
89                $contexte['id_saisie'] = $champ['identifiant'];
90        }
91       
92        // Peut-être des transformations à faire sur les options textuelles
93        $options = $champ['options'];
94
95       
96        foreach ($options as $option => $valeur){
97                $options[$option] = _T_ou_typo($valeur, 'multi');
98        }
99       
100        // On ajoute les options propres à la saisie
101        $contexte = array_merge($contexte, $options);
102
103        // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
104        if (isset($contexte['env']) or (isset($champ['saisies']) AND is_array($champ['saisies']))) {
105                unset($contexte['env']);
106
107                // on sauve l'ancien environnement
108                // car les sous-saisies ne doivent pas être affectees
109                // par les modification sur l'environnement servant à generer la saisie mère
110                $contexte['_env'] = $env;
111               
112                // À partir du moment où on passe tout l'environnement, il faut enlever certains éléments qui ne doivent absolument provenir que des options
113                unset($env['inserer_debut']);
114                unset($env['inserer_fin']);
115                $saisies_disponibles = saisies_lister_disponibles();
116                if (is_array($saisies_disponibles[$contexte['type_saisie']]['options'])){
117                        $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
118                        foreach ($options_a_supprimer as $option_a_supprimer){
119                                unset($env[$option_a_supprimer]);
120                        }
121                }
122               
123                $contexte = array_merge($env, $contexte);
124        }
125        // Sinon on ne sélectionne que quelques éléments importants
126        else{
127                // On récupère la liste des erreurs
128                $contexte['erreurs'] = $env['erreurs'];
129                // On ajoute toujours le bon self
130                $contexte['self'] = self();
131        }
132
133        // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
134        // Si le nom du champ est un tableau indexé, il faut parser !
135        if (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){
136                $contexte['valeur'] = $env[$separe[1]];
137                preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
138                // On va chercher au fond du tableau
139                foreach($index[1] as $cle){
140                        $contexte['valeur'] = isset($contexte['valeur'][$cle]) ? $contexte['valeur'][$cle] : null;
141                }
142        }
143        // Sinon la valeur est juste celle du nom
144        else {
145                $contexte['valeur'] = (isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : null);
146        }
147
148        // Si ya des enfants on les remonte dans le contexte
149        if (isset($champ['saisies']) and is_array($champ['saisies']))
150                $contexte['saisies'] = $champ['saisies'];
151       
152        // On génère la saisie
153        return recuperer_fond(
154                'saisies/_base',
155                $contexte
156        );
157}
158
159/*
160 * Génère une vue d'une saisie à partir d'un tableau la décrivant
161 *
162 * @see saisies_generer_html()
163 * @param array $saisie Un tableau décrivant une saisie
164 * @param array $env L'environnement, contenant normalement la réponse à la saisie
165 * @param array $env_obligatoire
166 * @return string Retour le HTML des vues
167 */
168function saisies_generer_vue($saisie, $env=array(), $env_obligatoire=array()){
169        // Si le paramètre n'est pas bon, on génère du vide
170        if (!is_array($saisie))
171                return '';
172
173        $contexte = array();
174               
175        // On sélectionne le type de saisie
176        $contexte['type_saisie'] = $saisie['saisie'];
177       
178        // Peut-être des transformations à faire sur les options textuelles
179        $options = $saisie['options'];
180        foreach ($options as $option => $valeur){
181                $options[$option] = _T_ou_typo($valeur, 'multi');
182        }
183       
184        // On ajoute les options propres à la saisie
185        $contexte = array_merge($contexte, $options);
186
187        // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
188        if(isset($contexte['env']) or (isset($saisie['saisies']) AND is_array($saisie['saisies']))){
189                unset($contexte['env']);
190
191                // on sauve l'ancien environnement
192                // car les sous-saisies ne doivent pas être affectees
193                // par les modification sur l'environnement servant à generer la saisie mère
194                $contexte['_env'] = $env;
195                               
196                // À partir du moment où on passe tout l'environnement, il faut enlever
197                // certains éléments qui ne doivent absolument provenir que des options
198                $saisies_disponibles = saisies_lister_disponibles();
199                if (is_array($saisies_disponibles[$contexte['type_saisie']]['options'])){
200                        $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
201                        foreach ($options_a_supprimer as $option_a_supprimer){
202                                unset($env[$option_a_supprimer]);
203                        }
204                }
205               
206                $contexte = array_merge($env, $contexte);
207        }
208
209        // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
210       
211        // On regarde en priorité s'il y a un tableau listant toutes les valeurs
212        if ($env['valeurs'] and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])){
213                $contexte['valeur'] = $env['valeurs'][$contexte['nom']];
214        }
215        // Si le nom du champ est un tableau indexé, il faut parser !
216        elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){
217                $contexte['valeur'] = $env[$separe[1]];
218                preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
219                // On va chercher au fond du tableau
220                foreach($index[1] as $cle){
221                        $contexte['valeur'] = $contexte['valeur'][$cle];
222                }
223        }
224        // Sinon la valeur est juste celle du nom
225        else
226                $contexte['valeur'] = $env[$contexte['nom']];
227
228        // Si ya des enfants on les remonte dans le contexte
229        if (isset($saisie['saisies']) AND is_array($saisie['saisies']))
230                $contexte['saisies'] = $saisie['saisies'];
231
232        if (is_array($env_obligatoire)) {
233                $contexte = array_merge($contexte, $env_obligatoire);
234        }
235        // On génère la saisie
236        return recuperer_fond(
237                'saisies-vues/_base',
238                $contexte
239        );
240}
241
242/*
243 * Génère, à partir d'un tableau de saisie le code javascript ajouté à la fin de #GENERER_SAISIES
244 * pour produire un affichage conditionnel des saisies avec une option afficher_si.
245 *
246 * @param array $saisies Un tableau de saisies
247 * @param string $id_form Un identifiant unique pour le formulaire
248 * @return text
249 */
250function saisies_generer_js_afficher_si($saisies,$id_form){
251        $i = 0;
252        $saisies = saisies_lister_par_nom($saisies,true);
253        $code = '';
254        $code .= '(function($){';
255        $code .= '$(document).ready(function(){';
256                $code .= 'verifier_saisies_'.$id_form.' = function(form){';
257                                foreach ($saisies as $saisie) {
258                                        // on utilise comme selecteur l'identifiant de saisie en priorite s'il est connu
259                                        // parce que li_class = 'tableau[nom][option]' ne fonctionne evidement pas
260                                        // lorsque le name est un tableau
261                                        if (isset($saisie['options']['afficher_si'])) {
262                                                $i++;
263                                                // retrouver la classe css probable
264                                                switch ($saisie['saisie']) {
265                                                        case 'fieldset':
266                                                                $class_li = 'fieldset_'.$saisie['options']['nom'];
267                                                                break;
268                                                        case 'explication':
269                                                                $class_li = 'explication_'.$saisie['options']['nom'];
270                                                                break;
271                                                        default:
272                                                                $class_li = 'editer_'.$saisie['options']['nom'];
273                                                }
274                                                $condition = $saisie['options']['afficher_si'];
275                                                // retrouver l'identifiant
276                                                $identifiant = '';
277                                                if ($saisie['identifiant']) {
278                                                        $identifiant = $saisie['identifiant'];
279                                                }
280                                                // On gère le cas @plugin:non_plugin@
281                                                preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
282                                                foreach ($matches[1] as $plug) {
283                                                        if (defined('_DIR_PLUGIN_'.strtoupper($plug)))
284                                                                $condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
285                                                        else
286                                                                $condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
287                                                }
288                                                // On gère le cas @config:plugin:meta@ suivi d'un test
289                                                preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);
290                                                foreach ($matches[1] as $plugin) {
291                                                        $config = lire_config($plugin);
292                                                        $condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);
293                                                }
294                                                // On transforme en une condition valide
295                                                preg_match_all('#@(.+)@#U', $condition, $matches);
296                                                foreach ($matches[1] as $nom) {
297                                                        switch($saisies[$nom]['saisie']) {
298                                                                case 'radio':
299                                                                case 'oui_non':
300                                                                        $condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']:checked").val()', $condition);
301                                                                        break;
302                                                                default:
303                                                                        $condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']").val()', $condition);
304                                                        }
305                                                }
306                                                if ($identifiant) {
307                                                        $sel = "li[data-id='$identifiant']";
308                                                } else {
309                                                        $sel = "li.$class_li";
310                                                }
311                                                $code .= 'if ('.$condition.') {$(form).find("'.$sel.'").show(400);} ';
312                                                $code .= 'else {$(form).find("'.$sel.'").hide(400);} ';
313                                        }
314                                }
315                $code .= '};';
316                $code .= '$("li#afficher_si_'.$id_form.'").parents("form").each(function(){verifier_saisies_'.$id_form.'(this);});';
317                $code .= '$("li#afficher_si_'.$id_form.'").parents("form").change(function(){verifier_saisies_'.$id_form.'(this);});';
318        $code .= '});';
319        $code .= '})(jQuery);';
320        return $i>0 ? $code : '';
321}
322
323/*
324 * Lorsque l'on affiche les saisies (#VOIR_SAISIES), les saisies ayant une option afficher_si
325 * et dont les conditions ne sont pas remplies doivent être retirées du tableau de saisies.
326 * Cette fonction sert aussi lors de la vérification des saisies avec saisies_verifier().
327 * A ce moment la, les saisies non affichees sont retirees de _request (on passe leur valeur a NULL).
328 *
329 * @param array $saisies Un tableau de saisies
330 * @param array $env le tableau d'environnement transmis dans inclure/voi_saisies.html, NULL si on doit rechercher dans _request (pour saisies_verifier()).
331 * @return array Un tableau de saisies
332 */
333
334function saisies_verifier_afficher_si($saisies, $env=NULL) {
335        // eviter une erreur par maladresse d'appel :)
336        if (!is_array($saisies)) {
337                return array();
338        }
339        foreach ($saisies as $cle => $saisie) {
340                if (isset($saisie['options']['afficher_si'])) {
341                        $condition = $saisie['options']['afficher_si'];
342                        // On gère le cas @plugin:non_plugin@
343                        preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
344                        foreach ($matches[1] as $plug) {
345                                if (defined('_DIR_PLUGIN_'.strtoupper($plug)))
346                                        $condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
347                                else
348                                        $condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
349                        }
350                        // On gère le cas @config:plugin:meta@ suivi d'un test
351                        preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);
352                        foreach ($matches[1] as $plugin) {
353                                $config = lire_config($plugin);
354                                $condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);
355                        }
356                        // On transforme en une condition valide
357                        if (is_null($env))
358                                $condition = preg_replace('#@(.+)@#U', '_request(\'$1\')', $condition);
359                        else
360                                $condition = preg_replace('#@(.+)@#U', '$env["valeurs"][\'$1\']', $condition);
361                        eval('$ok = '.$condition.';');
362                        if (!$ok) {
363                                unset($saisies[$cle]);
364                                if (is_null($env)) set_request($saisie['options']['nom'],NULL);
365                        }
366                }
367                if (isset($saisies[$cle]['saisies'])) // S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies
368                        $saisies[$cle]['saisies'] = saisies_verifier_afficher_si($saisies[$cle]['saisies'], $env);
369        }
370        return $saisies;
371}
372
373?>
Note: See TracBrowser for help on using the repository browser.