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

Last change on this file was 117749, checked in by maieul@…, 2 months ago

oups

File size: 10.3 KB
Line 
1<?php
2
3/**
4 * Gestion de l'affichage des saisies.
5 *
6 * @return SPIP\Saisies\Afficher
7 **/
8
9// Sécurité
10if (!defined('_ECRIRE_INC_VERSION')) {
11        return;
12}
13
14/**
15 * Indique si une saisie peut être affichée.
16 *
17 * On s'appuie sur l'éventuelle clé "editable" du $champ.
18 * Si editable vaut :
19 *    - absent : le champ est éditable
20 *    - 1, le champ est éditable
21 *    - 0, le champ n'est pas éditable
22 *    - -1, le champ est éditable s'il y a du contenu dans le champ (l'environnement)
23 *         ou dans un de ses enfants (fieldsets)
24 *
25 * @param array $champ
26 *                                 Tableau de description de la saisie
27 * @param array $env
28 *                                 Environnement transmis à la saisie, certainement l'environnement du formulaire
29 * @param bool  $utiliser_editable
30 *                                 - false pour juste tester le cas -1
31 *
32 * @return bool
33 *              Retourne un booléen indiquant l'état éditable ou pas :
34 *              - true si la saisie est éditable (peut être affichée)
35 *              - false sinon
36 */
37function saisie_editable($champ, $env, $utiliser_editable = true) {
38        if ($utiliser_editable) {
39                // si le champ n'est pas éditable, on sort.
40                if (!isset($champ['editable'])) {
41                        return true;
42                }
43                $editable = $champ['editable'];
44
45                if ($editable > 0) {
46                        return true;
47                }
48                if ($editable == 0) {
49                        return false;
50                }
51        }
52
53        // cas -1
54        // name de la saisie
55        if (isset($champ['options']['nom'])) {
56                // si on a le name dans l'environnement, on le teste
57                $nom = $champ['options']['nom'];
58                if (isset($env[$nom])) {
59                        return $env[$nom] ? true : false;
60                }
61        }
62        // sinon, si on a des sous saisies
63        if (isset($champ['saisies']) and is_array($champ['saisies'])) {
64                foreach ($champ['saisies'] as $saisie) {
65                        if (saisie_editable($saisie, $env, false)) {
66                                return true;
67                        }
68                }
69        }
70
71        // aucun des paramètres demandés n'avait de contenu
72        return false;
73}
74
75/**
76 * Génère une saisie à partir d'un tableau la décrivant et de l'environnement.
77 *
78 * @param array $champ
79 *                     Description de la saisie.
80 *                     Le tableau doit être de la forme suivante :
81 *                     array(
82 *                     'saisie' => 'input',
83 *                     'options' => array(
84 *                     'nom' => 'le_name',
85 *                     'label' => 'Un titre plus joli',
86 *                     'obligatoire' => 'oui',
87 *                     'explication' => 'Remplissez ce champ en utilisant votre clavier.'
88 *                     )
89 *                     )
90 * @param array $env
91 *                     Environnement du formulaire
92 *                     Permet de savoir les valeurs actuelles des contenus des saisies,
93 *                     les erreurs eventuelles présentes...
94 *
95 * @return string
96 *                Code HTML des saisies de formulaire
97 */
98function saisies_generer_html($champ, $env = array()) {
99        // Si le parametre n'est pas bon, on genere du vide
100        if (!is_array($champ)) {
101                return '';
102        }
103
104        // Si la saisie n'est pas editable, on sort aussi.
105        if (!saisie_editable($champ, $env)) {
106                return '';
107        }
108
109        $contexte = array();
110
111        // On sélectionne le type de saisie
112        $contexte['type_saisie'] = $champ['saisie'];
113        // Identifiant unique de saisie, si present
114        if (isset($champ['identifiant'])) {
115                $contexte['id_saisie'] = $champ['identifiant'];
116        }
117
118        // S'il y a le détail des saisies du même formulaire, on le passe en contexte. Utiliser pour générer correctement les afficher_si
119        $contexte['_saisies'] = isset($env['saisies']) ? $env['saisies'] : array();
120
121        // Peut-être des transformations à faire sur les options textuelles
122        $options = isset($champ['options']) ? $champ['options'] : array();
123        foreach ($options as $option => $valeur) {
124                if ($option == 'datas') {
125                        // exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
126                        $options[$option] = saisies_chaine2tableau($valeur);
127                } else {
128                        $options[$option] = _T_ou_typo($valeur, 'multi');
129                }
130        }
131
132        // compatibilité li_class > conteneur_class
133        if (!empty($options['li_class'])) {
134                $options['conteneur_class'] = $options['li_class'];
135        }
136
137        // On ajoute les options propres à la saisie
138        $contexte = array_merge($contexte, $options);
139
140        // On ajoute aussi les infos de vérification, si cela peut se faire directement en HTML5
141        if (isset($champ['verifier'])) {
142                $contexte = array_merge($contexte, array('verifier'=>$champ['verifier']));
143        }
144
145        // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
146        if (isset($contexte['env']) or (isset($champ['saisies']) and is_array($champ['saisies']))) {
147                unset($contexte['env']);
148
149                // on sauve l'ancien environnement
150                // car les sous-saisies ne doivent pas être affectees
151                // par les modification sur l'environnement servant à generer la saisie mère
152                $contexte['_env'] = $env;
153
154                // À partir du moment où on passe tout l'environnement,
155                // il faut enlever certains éléments qui ne doivent absolument provenir que des options
156                unset($env['inserer_debut']);
157                unset($env['inserer_fin']);
158                $saisies_disponibles = saisies_lister_disponibles();
159                if (isset($saisies_disponibles[$contexte['type_saisie']])
160                        and isset($saisies_disponibles[$contexte['type_saisie']]['options'])
161                        and is_array($saisies_disponibles[$contexte['type_saisie']]['options'])) {
162                        $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
163                        foreach ($options_a_supprimer as $option_a_supprimer) {
164                                unset($env[$option_a_supprimer]);
165                        }
166                }
167
168                $contexte = array_merge($env, $contexte);
169        } else {
170                // Sinon on ne sélectionne que quelques éléments importants
171                // On récupère la liste des erreurs
172                $contexte['erreurs'] = $env['erreurs'];
173                // On récupère la langue de l'objet si existante
174                if (isset($env['langue'])) {
175                        $contexte['langue'] = $env['langue'];
176                }
177                // On ajoute toujours le bon self
178                $contexte['self'] = self();
179        }
180
181        // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
182        // Si le nom du champ est un tableau indexé, il faut parser !
183        if (
184                isset($contexte['nom'])
185                and preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)
186                and isset($env[$separe[1]])
187        ) {
188                $contexte['valeur'] = $env[$separe[1]];
189                preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
190                // On va chercher au fond du tableau
191                foreach ($index[1] as $cle) {
192                        $contexte['valeur'] = isset($contexte['valeur'][$cle]) ? $contexte['valeur'][$cle] : null;
193                }
194        } elseif (isset($contexte['nom']) and isset($env[$contexte['nom']])) {
195                // Sinon la valeur est juste celle du nom si elle existe
196                $contexte['valeur'] = $env[$contexte['nom']];
197        } else {
198                // Sinon rien
199                $contexte['valeur'] = null;
200        }
201
202        // Si ya des enfants on les remonte dans le contexte
203        if (isset($champ['saisies']) and is_array($champ['saisies'])) {
204                $contexte['saisies'] = $champ['saisies'];
205        }
206
207        // On génère la saisie
208        return recuperer_fond(
209                'saisies/_base',
210                $contexte
211        );
212}
213
214/**
215 * Génère une vue d'une saisie à partir d'un tableau la décrivant.
216 *
217 * @see saisies_generer_html()
218 *
219 * @param array $saisie
220 *                               Tableau de description d'une saisie
221 * @param array $env
222 *                               L'environnement, contenant normalement la réponse à la saisie
223 * @param array $env_obligatoire
224 *                               ???
225 *
226 * @return string
227 *                Code HTML de la vue de la saisie
228 */
229function saisies_generer_vue($saisie, $env = array(), $env_obligatoire = array()) {
230        // Si le paramètre n'est pas bon, on génère du vide
231        if (!is_array($saisie)) {
232                return '';
233        }
234
235        $contexte = array();
236
237        // On sélectionne le type de saisie
238        $contexte['type_saisie'] = $saisie['saisie'];
239
240        // Peut-être des transformations à faire sur les options textuelles
241        $options = $saisie['options'];
242        foreach ($options as $option => $valeur) {
243                if ($option == 'datas') {
244                        // exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
245                        $options[$option] = saisies_chaine2tableau($valeur);
246                } else {
247                        $options[$option] = _T_ou_typo($valeur, 'multi');
248                }
249        }
250
251        // On ajoute les options propres à la saisie
252        $contexte = array_merge($contexte, $options);
253
254        // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
255        if (isset($contexte['env']) or (isset($saisie['saisies']) and is_array($saisie['saisies']))) {
256                unset($contexte['env']);
257
258                // on sauve l'ancien environnement
259                // car les sous-saisies ne doivent pas être affectees
260                // par les modification sur l'environnement servant à generer la saisie mère
261                $contexte['_env'] = $env;
262
263                // À partir du moment où on passe tout l'environnement, il faut enlever
264                // certains éléments qui ne doivent absolument provenir que des options
265                $saisies_disponibles = saisies_lister_disponibles();
266
267                if (isset($saisies_disponibles[$contexte['type_saisie']]['options'])
268                        and is_array($saisies_disponibles[$contexte['type_saisie']]['options'])) {
269                        $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
270                        foreach ($options_a_supprimer as $option_a_supprimer) {
271                                unset($env[$option_a_supprimer]);
272                        }
273                }
274
275                $contexte = array_merge($env, $contexte);
276        }
277
278        // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
279
280        // On regarde en priorité s'il y a un tableau listant toutes les valeurs
281        if (!empty($env['valeurs']) and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])) {
282                $contexte['valeur'] = $env['valeurs'][$contexte['nom']];
283        } elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)) {
284                // Si le nom du champ est un tableau indexé, il faut parser !
285                $contexte['valeur'] = $env[$separe[1]];
286                preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
287                // On va chercher au fond du tableau
288                foreach ($index[1] as $cle) {
289                        $contexte['valeur'] = $contexte['valeur'][$cle];
290                }
291        } else {
292                // Sinon la valeur est juste celle du nom
293                // certains n'ont pas de nom (fieldset)
294                $contexte['valeur'] = isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : '';
295        }
296
297        // Si ya des enfants on les remonte dans le contexte
298        if (isset($saisie['saisies']) and is_array($saisie['saisies'])) {
299                $contexte['saisies'] = $saisie['saisies'];
300        }
301
302        if (is_array($env_obligatoire)) {
303                $contexte = array_merge($contexte, $env_obligatoire);
304        }
305
306        // On génère la saisie
307        return recuperer_fond(
308                'saisies-vues/_base',
309                $contexte
310        );
311}
312
Note: See TracBrowser for help on using the repository browser.