[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / saisies / inc / saisies_afficher.php
1 <?php
2
3 // Sécurité
4 if (!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 */
22 function 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 */
73 function 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 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 }
130
131 // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
132 // Si le nom du champ est un tableau indexé, il faut parser !
133 if (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){
134 $contexte['valeur'] = $env[$separe[1]];
135 preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
136 // On va chercher au fond du tableau
137 foreach($index[1] as $cle){
138 $contexte['valeur'] = $contexte['valeur'][$cle];
139 }
140 }
141 // Sinon la valeur est juste celle du nom
142 else
143 $contexte['valeur'] = $env[$contexte['nom']];
144
145 // Si ya des enfants on les remonte dans le contexte
146 if (is_array($champ['saisies']))
147 $contexte['saisies'] = $champ['saisies'];
148
149 // On génère la saisie
150 return recuperer_fond(
151 'saisies/_base',
152 $contexte
153 );
154 }
155
156 /*
157 * Génère une vue d'une saisie à partir d'un tableau la décrivant
158 *
159 * @see saisies_generer_html()
160 * @param array $saisie Un tableau décrivant une saisie
161 * @param array $env L'environnement, contenant normalement la réponse à la saisie
162 * @param array $env_obligatoire
163 * @return string Retour le HTML des vues
164 */
165 function saisies_generer_vue($saisie, $env=array(), $env_obligatoire=array()){
166 // Si le paramètre n'est pas bon, on génère du vide
167 if (!is_array($saisie))
168 return '';
169
170 $contexte = array();
171
172 // On sélectionne le type de saisie
173 $contexte['type_saisie'] = $saisie['saisie'];
174
175 // Peut-être des transformations à faire sur les options textuelles
176 $options = $saisie['options'];
177 foreach ($options as $option => $valeur){
178 $options[$option] = _T_ou_typo($valeur, 'multi');
179 }
180
181 // On ajoute les options propres à la saisie
182 $contexte = array_merge($contexte, $options);
183
184 // Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
185 if(isset($contexte['env']) or is_array($saisie['saisies'])){
186 unset($contexte['env']);
187
188 // on sauve l'ancien environnement
189 // car les sous-saisies ne doivent pas être affectees
190 // par les modification sur l'environnement servant à generer la saisie mère
191 $contexte['_env'] = $env;
192
193 // À partir du moment où on passe tout l'environnement, il faut enlever
194 // certains éléments qui ne doivent absolument provenir que des options
195 $saisies_disponibles = saisies_lister_disponibles();
196 if (is_array($saisies_disponibles[$contexte['type_saisie']]['options'])){
197 $options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
198 foreach ($options_a_supprimer as $option_a_supprimer){
199 unset($env[$option_a_supprimer]);
200 }
201 }
202
203 $contexte = array_merge($env, $contexte);
204 }
205
206 // Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
207
208 // On regarde en priorité s'il y a un tableau listant toutes les valeurs
209 if ($env['valeurs'] and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])){
210 $contexte['valeur'] = $env['valeurs'][$contexte['nom']];
211 }
212 // Si le nom du champ est un tableau indexé, il faut parser !
213 elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){
214 $contexte['valeur'] = $env[$separe[1]];
215 preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
216 // On va chercher au fond du tableau
217 foreach($index[1] as $cle){
218 $contexte['valeur'] = $contexte['valeur'][$cle];
219 }
220 }
221 // Sinon la valeur est juste celle du nom
222 else
223 $contexte['valeur'] = $env[$contexte['nom']];
224
225 // Si ya des enfants on les remonte dans le contexte
226 if (is_array($saisie['saisies']))
227 $contexte['saisies'] = $saisie['saisies'];
228
229 if (is_array($env_obligatoire)) {
230 $contexte = array_merge($contexte, $env_obligatoire);
231 }
232 // On génère la saisie
233 return recuperer_fond(
234 'saisies-vues/_base',
235 $contexte
236 );
237 }
238
239 /*
240 * Génère, à partir d'un tableau de saisie le code javascript ajouté à la fin de #GENERER_SAISIES
241 * pour produire un affichage conditionnel des saisies avec une option afficher_si.
242 *
243 * @param array $saisies Un tableau de saisies
244 * @param string $id_form Un identifiant unique pour le formulaire
245 * @return text
246 */
247 function saisies_generer_js_afficher_si($saisies,$id_form){
248 $i = 0;
249 $saisies = saisies_lister_par_nom($saisies,true);
250 $code = '';
251 $code .= '$(document).ready(function(){';
252 $code .= 'verifier_saisies_'.$id_form.' = function(form){';
253 foreach ($saisies as $saisie) {
254 if (isset($saisie['options']['afficher_si'])) {
255 $i++;
256 switch ($saisie['saisie']) {
257 case 'fieldset':
258 $class_li = 'fieldset_'.$saisie['options']['nom'];
259 break;
260 case 'explication':
261 $class_li = 'explication_'.$saisie['options']['nom'];
262 break;
263 default:
264 $class_li = 'editer_'.$saisie['options']['nom'];
265 }
266 $condition = $saisie['options']['afficher_si'];
267 // On gère le cas @plugin:non_plugin@
268 preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
269 foreach ($matches[1] as $plug) {
270 if (defined('_DIR_PLUGIN_'.strtoupper($plug)))
271 $condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
272 else
273 $condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
274 }
275 // On gère le cas @config:plugin:meta@ suivi d'un test
276 preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);
277 foreach ($matches[1] as $plugin) {
278 $config = lire_config($plugin);
279 $condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);
280 }
281 // On transforme en une condition valide
282 preg_match_all('#@(.+)@#U', $condition, $matches);
283 foreach ($matches[1] as $nom) {
284 switch($saisies[$nom]['saisie']) {
285 case 'radio':
286 case 'oui_non':
287 $condition = preg_replace('#@'.$nom.'@#U', '$(form).find("[name=\''.$nom.'\']:checked").val()', $condition);
288 break;
289 default:
290 $condition = preg_replace('#@'.$nom.'@#U', '$(form).find("[name=\''.$nom.'\']").val()', $condition);
291 }
292 }
293 $code .= 'if ('.$condition.') {$(form).find("li.'.$class_li.'").show(400);} ';
294 $code .= 'else {$(form).find(".'.$class_li.'").hide(400);} ';
295 }
296 }
297 $code .= '};';
298 $code .= '$("li#afficher_si_'.$id_form.'").parents("form").each(function(){verifier_saisies_'.$id_form.'(this);});';
299 $code .= '$("li#afficher_si_'.$id_form.'").parents("form").change(function(){verifier_saisies_'.$id_form.'(this);});';
300 $code .= '});';
301 return $i>0 ? $code : '';
302 }
303
304 /*
305 * Lorsque l'on affiche les saisies (#VOIR_SAISIES), les saisies ayant une option afficher_si
306 * et dont les conditions ne sont pas remplies doivent être retirées du tableau de saisies
307 *
308 * @param array $saisies Un tableau de saisies
309 * @param array $env Les variables d'environnement
310 * @return array Un tableau de saisies
311 */
312
313 function saisies_verifier_afficher_si($saisies, $env) {
314 // eviter une erreur par maladresse d'appel :)
315 if (!is_array($saisies)) {
316 return array();
317 }
318 foreach ($saisies as $cle => $saisie) {
319 if (isset($saisie['options']['afficher_si'])) {
320 $condition = $saisie['options']['afficher_si'];
321 // On gère le cas @plugin:non_plugin@
322 preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
323 foreach ($matches[1] as $plug) {
324 if (defined('_DIR_PLUGIN_'.strtoupper($plug)))
325 $condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
326 else
327 $condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
328 }
329 // On transforme en une condition valide
330 $condition = preg_replace('#@(.+)@#U', '$env["valeurs"][\'$1\']', $condition);
331 eval('$ok = '.$condition.';');
332 if (!$ok)
333 unset($saisies[$cle]);
334 }
335 }
336 return $saisies;
337 }
338
339 ?>