Mise en route du suivi.
[aidenligne_francais_universite.git] / ecrire / inc / extra.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13
14
15 ////////////////////////////////////////////////////////////////////////////////////
16 // Pour utiliser les champs "extra", il faut installer dans le fichier
17 // ecrire/mes_options un tableau definissant les champs pour chaque
18 // type d'objet que l'on veut \8etendre (article, rubrique, breve, auteur,
19 // site ou mot). Pour acceder aux valeurs des champs extra dans les
20 // squelettes du site public, utiliser la notation :
21 // [(#EXTRA|extra{nom_du_champ})]
22 // Exemples :
23
24 /*
25
26 //
27 // Definition de tous les extras possibles
28 //
29
30 $GLOBALS['champs_extra'] = Array (
31 'auteurs' => Array (
32 "alim" => "radio|brut|Pr&eacute;f&eacute;rences alimentaires|Veggie,Viande",
33 "habitation" => "liste|brut|Lieu|Kuala Lumpur,Cape Town,Uppsala",
34 "ml" => "case|propre|Je souhaite m'abonner &agrave; la mailinglist",
35 "age" => "ligne|propre|&Acirc;ge du capitaine",
36 "biblio" => "bloc|propre|Bibliographie"
37 ),
38
39 'articles' => Array (
40 "isbn" => "ligne|typo|ISBN",
41 "options" => "multiple|brut|Options de cet article|1,2,3,plus"
42
43
44 )
45 );
46
47 // Note : pour les listes et les radios on peut preciser les valeurs des labels
48 // Exemples
49 // "habitation" => "liste|brut|Lieu|San Diego,Suresnes|diego,suresnes",
50
51
52 */
53
54
55 /*
56
57 // On peut optionnellement vouloir restreindre la portee des extras :
58 // - pour les articles/rubriques/breves en fonction du secteur ;
59 // - pour les auteurs en fonction du statut
60 // - pour les mots-cles en fonction du groupe de mots
61 // Exemples :
62
63 $GLOBALS['champs_extra_proposes'] = Array (
64 'auteurs' => Array (
65 // tous : par defaut
66 'tous' => 'age|alim|ml',
67 // les admins (statut='0minirezo') ont plus de champs que les auteurs
68 '0minirezo' => 'age|alim|ml|biblio|habitation'
69 ),
70
71 'articles' => Array (
72 // tous : par defaut aucun champs extra sur les articles
73 'tous' => '',
74 // seul le champs extra "isbn" est proposé dans le secteur 1)
75 '1' => 'isbn',
76 // Dans le secteur 2 le champs "options" est proposé)
77 '2' => 'options'
78 )
79 );
80
81
82 */
83
84 ////////////////////////////////////////////////////////////////////////////////////
85
86 //
87 if (!defined("_ECRIRE_INC_VERSION")) return;
88
89 // a partir de la liste des champs, generer la liste des input
90 // http://doc.spip.org/@extra_saisie
91 function extra_saisie($extra, $type, $ensemble='') {
92 if ($affiche = extra_form($extra, $type, $ensemble)) {
93 return debut_cadre_enfonce('',true)
94 . $affiche
95 . fin_cadre_enfonce(true);
96 }
97 }
98
99 // http://doc.spip.org/@extra_form
100 function extra_form($extra, $type, $ensemble='') {
101 $extra = unserialize($extra);
102
103 // quels sont les extras de ce type d'objet
104 if (!$champs = $GLOBALS['champs_extra'][$type])
105 $champs = Array();
106
107 // prendre en compte, eventuellement, les champs presents dans la base
108 // mais oublies dans mes_options.
109 if (is_array($extra))
110 while (list($key,) = each($extra))
111 if (!$champs[$key])
112 $champs[$key] = "masque||($key?)";
113
114 // quels sont les extras proposes...
115 // ... si l'ensemble est connu
116 if ($ensemble && isset($GLOBALS['champs_extra_proposes'][$type][$ensemble]))
117 $champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type][$ensemble]);
118 // ... sinon, les champs proposes par defaut
119 else if (isset($GLOBALS['champs_extra_proposes'][$type]['tous'])) {
120 $champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type]['tous']);
121 }
122
123 // sinon tous les champs extra du type
124 else {
125 $champs_proposes = Array();
126 reset($champs);
127 while (list($ch, ) = each($champs)) $champs_proposes[] = $ch;
128 }
129
130 // bug explode
131 if($champs_proposes == explode('|', '')) $champs_proposes = Array();
132
133 // maintenant, on affiche les formulaires pour les champs renseignes dans $extra
134 // et pour les champs proposes
135 reset($champs_proposes);
136 while (list(, $champ) = each($champs_proposes)) {
137 $desc = $champs[$champ];
138 list($form, $filtre, $prettyname, $choix, $valeurs) = explode("|", $desc);
139
140 if (!$prettyname) $prettyname = ucfirst($champ);
141 $affiche .= "<b>$prettyname&nbsp;:</b><br />";
142
143 switch($form) {
144
145 // complique car la valeur n'esst pas envoyee ar le nav si unchecked
146 case "case":
147 case "checkbox":
148 $affiche = ereg_replace("<br />$", "&nbsp;", $affiche);
149 $affiche .= "<input type='hidden' name='suppl_$champ' value='1' /><input type='checkbox' name='suppl_{$champ}_check'";
150 if ($extra[$champ] == 'true')
151 $affiche .= " checked";
152 $affiche .= " />";
153 break;
154
155 case "list":
156 case "liste":
157 case "select":
158 $choix = explode(",",$choix);
159 if (!is_array($choix)) {
160 $affiche .= "Pas de choix d&eacute;finis.\n";
161 break;
162 }
163
164 // prendre en compte les valeurs des champs
165 // si elles sont renseignees
166 $valeurs = explode(",",$valeurs);
167 if($valeurs == explode(",",""))
168 $valeurs = $choix ;
169
170 $affiche .= "<select name='suppl_$champ' ";
171 $affiche .= "class='forml'>\n";
172 $i = 0 ;
173 while (list(, $choix_) = each($choix)) {
174 $val = $valeurs[$i] ;
175 $affiche .= "<option value=\"$val\"";
176 if ($val == entites_html($extra[$champ]))
177 $affiche .= " selected";
178 $affiche .= ">$choix_</option>\n";
179 $i++;
180 }
181 $affiche .= "</select>";
182 break;
183
184 case "radio":
185 $choix = explode(",",$choix);
186 if (!is_array($choix)) {
187 $affiche .= "Pas de choix d&eacute;finis.\n";
188 break;
189 }
190 $valeurs = explode(",",$valeurs);
191 if($valeurs == explode(",",""))
192 $valeurs = $choix ;
193
194 $i=0;
195 while (list(, $choix_) = each($choix)) {
196 $affiche .= "<input type='radio' name='suppl_$champ' ";
197 $val = $valeurs[$i] ;
198 if (entites_html($extra[$champ])== $val)
199 $affiche .= " checked";
200
201 // premiere valeur par defaut
202 if (!$extra[$champ] AND $i == 0)
203 $affiche .= " checked";
204
205 $affiche .= " value='$val'>$choix_</input>\n";
206 $i++;
207 }
208 break;
209
210 // A refaire car on a pas besoin de renvoyer comme pour checkbox
211 // les cases non cochees
212 case "multiple":
213 $choix = explode(",",$choix);
214 if (!is_array($choix)) {
215 $affiche .= "Pas de choix d&eacute;finis.\n";
216 break;
217 }
218 $affiche .= "<input type='hidden' name='suppl_{$champ}' value='1' />";
219 for ($i=0; $i < count($choix); $i++) {
220 $affiche .= "<input type='checkbox' name='suppl_$champ$i'";
221 if (entites_html($extra[$champ][$i])=="on")
222 $affiche .= " checked";
223 $affiche .= ">\n";
224 $affiche .= $choix[$i];
225 $affiche .= "</input>\n";
226 }
227 break;
228
229 case "bloc":
230 case "block":
231 $affiche .= "<textarea name='suppl_$champ' class='forml' rows='5' cols='40'>".entites_html($extra[$champ])."</textarea>\n";
232 break;
233
234 case "masque":
235 $affiche .= "<span style='color: #555555'>".interdire_scripts($extra[$champ])."</span>\n";
236 break;
237
238 case "ligne":
239 case "line":
240 default:
241 $affiche .= "<input type='text' name='suppl_$champ' class='forml'\n";
242 $affiche .= " value=\"".entites_html($extra[$champ])."\" size='40'>\n";
243 break;
244 }
245
246 $affiche .= "<br />\n";
247 }
248
249 return $affiche;
250 }
251
252 // recupere les valeurs postees pour reconstituer l'extra
253 // http://doc.spip.org/@extra_recup_saisie
254 function extra_recup_saisie($type, $c=false) {
255 $champs = $GLOBALS['champs_extra'][$type];
256 if (is_array($champs)) {
257 $extra = Array();
258 foreach($champs as $champ => $config)
259 if (($val = _request("suppl_$champ",$c)) !== NULL) {
260 list($style, $filtre, , $choix,) = explode("|", $config);
261 list(, $filtre) = explode(",", $filtre);
262 switch ($style) {
263 case "multiple":
264 $choix = explode(",", $choix);
265 $multiple = array();
266 for ($i=0; $i < count($choix); $i++) {
267 $val2 = _request("suppl_$champ$i",$c);
268 if ($filtre && function_exists($filtre))
269 $multiple[$i] = $filtre($val2);
270 else
271 $multiple[$i] = $val2;
272 }
273 $extra[$champ] = $multiple;
274 break;
275
276 case 'case':
277 case 'checkbox':
278 if (_request("suppl_{$champ}_check") == 'on')
279 $val = 'true';
280 else
281 $val = 'false';
282 // pas de break; on continue
283
284 default:
285 if ($filtre && function_exists($filtre))
286 $extra[$champ] = $filtre($val);
287 else
288 $extra[$champ] = $val;
289 break;
290 }
291 }
292 return serialize($extra);
293 } else
294 return false;
295 }
296
297 // Retourne la liste des filtres a appliquer pour un champ extra particulier
298 // http://doc.spip.org/@extra_filtres
299 function extra_filtres($type, $nom_champ) {
300 $champ = $GLOBALS['champs_extra'][$type][$nom_champ];
301 if (!$champ) return array();
302 list(, $filtre, ) = explode("|", $champ);
303 list($filtre, ) = explode(",", $filtre);
304 if ($filtre && $filtre != 'brut' && function_exists($filtre))
305 return array($filtre);
306 return array();
307 }
308
309 // Retourne la liste des filtres a appliquer a la recuperation
310 // d'un champ extra particulier
311 // http://doc.spip.org/@extra_filtres_recup
312 function extra_filtres_recup($type, $nom_champ) {
313 $champ = $GLOBALS['champs_extra'][$type][$nom_champ];
314 if (!$champ) return array();
315 list(, $filtre, ) = explode("|", $champ);
316 list(,$filtre) = explode(",", $filtre);
317 if ($filtre && $filtre != 'brut' && function_exists($filtre))
318 return array($filtre);
319 return array();
320 }
321
322 // http://doc.spip.org/@extra_champ_valide
323 function extra_champ_valide($type, $nom_champ) {
324 return isset($GLOBALS['champs_extra'][$type][$nom_champ]);
325 }
326
327 // a partir de la liste des champs, generer l'affichage
328 // http://doc.spip.org/@extra_affichage
329 function extra_affichage($extra, $type) {
330 $extra = unserialize ($extra);
331 if (!is_array($extra)) return;
332 $champs = $GLOBALS['champs_extra'][$type];
333
334 while (list($nom,$contenu) = each($extra)) {
335 list ($style, $filtre, $prettyname, $choix, $valeurs) =
336 explode("|", $champs[$nom]);
337 list($filtre, ) = explode(",", $filtre);
338 switch ($style) {
339 case "checkbox":
340 case "case":
341 if ($contenu=="true") $contenu = _T('item_oui');
342 elseif ($contenu=="false") $contenu = _T('item_non');
343 break;
344
345 case "multiple":
346 $contenu_ = "";
347 $choix = explode (",", $choix);
348 if (is_array($contenu) AND is_array($choix)
349 AND count($choix)==count($contenu))
350 for ($i=0; $i < count($contenu); $i++)
351 if ($contenu[$i] == "on")
352 $contenu_ .= "$choix[$i], ";
353 else if ($contenu[$i] <> '')
354 $contenu_ = "Choix incoh&eacute;rents, "
355 ."v&eacute;rifiez la configuration... ";
356 $contenu = ereg_replace(", $", "", $contenu_);
357 break;
358 }
359 if ($filtre != 'brut' AND function_exists($filtre))
360 $contenu = $filtre($contenu);
361 if (!$prettyname)
362 $prettyname = ucfirst($nom);
363 if ($contenu)
364 $affiche .= "<div><b>$prettyname&nbsp;:</b> "
365 .interdire_scripts($contenu)."<br /></div>\n";
366 }
367
368 if ($affiche)
369 return debut_cadre_enfonce('',true)
370 . $affiche
371 . fin_cadre_enfonce(true);
372 }
373
374 // s'il y a mise a jour des extras, mixer les champs modifies
375 // avec les champs existants (car la mise a jour peut etre partielle)
376 // http://doc.spip.org/@extra_update
377 function extra_update($type, $id, $c = false) {
378 $extra = @unserialize(extra_recup_saisie($type, $c));
379
380 // pas de mise a jour, ou erreur
381 if (!is_array($extra) OR !count($extra))
382 return false;
383
384 // passer de 'articles' a 'article' :-(
385 $t = preg_replace(',s$,', '', $type);
386
387 $orig = spip_query("SELECT extra FROM spip_".table_objet($t)." WHERE ".id_table_objet($t)."=".intval($id));
388 $orig = spip_fetch_array($orig);
389
390 if (isset($orig['extra'])
391 AND is_array($orig = @unserialize($orig['extra']))) {
392 $extra = array_merge($orig, $extra);
393 }
394
395 return serialize($extra);
396 }
397
398 ?>