4 |
david |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
/***************************************************************************\
|
|
|
4 |
* SPIP, Systeme de publication pour l'internet *
|
|
|
5 |
* *
|
|
|
6 |
* Copyright (c) 2001-2005 *
|
|
|
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.php3 un tableau definissant les champs en question,
|
|
|
18 |
// pour chaque type d'objet (article, rubrique, breve, auteur ou mot) que
|
|
|
19 |
// l'on veut ainsi etendre ; utiliser dans l'espace public avec
|
|
|
20 |
// [(#EXTRA|nom_du_champ)]
|
|
|
21 |
// Exemples :
|
|
|
22 |
|
|
|
23 |
/*
|
|
|
24 |
|
|
|
25 |
//
|
|
|
26 |
// Definition de tous les extras possibles
|
|
|
27 |
//
|
|
|
28 |
|
|
|
29 |
$GLOBALS['champs_extra'] = Array (
|
|
|
30 |
'auteurs' => Array (
|
|
|
31 |
"alim" => "radio|brut|Préférences alimentaires|Veggie,Viande",
|
|
|
32 |
"habitation" => "liste|brut|Lieu|Kuala Lumpur,Cape Town,Uppsala",
|
|
|
33 |
"ml" => "case|propre|Je souhaite m'abonner à la mailinglist",
|
|
|
34 |
"age" => "ligne|propre|Âge du capitaine",
|
|
|
35 |
"biblio" => "bloc|propre|Bibliographie"
|
|
|
36 |
),
|
|
|
37 |
|
|
|
38 |
'articles' => Array (
|
|
|
39 |
"isbn" => "ligne|typo|ISBN",
|
|
|
40 |
"options" => "multiple|brut|Options de cet article|1,2,3,plus"
|
|
|
41 |
|
|
|
42 |
|
|
|
43 |
)
|
|
|
44 |
);
|
|
|
45 |
|
|
|
46 |
// Note : pour les listes et les radios on peut preciser les valeurs des labels
|
|
|
47 |
// Exemples
|
|
|
48 |
// "habitation" => "liste|brut|Lieu|San Diego,Suresnes|diego,suresnes",
|
|
|
49 |
|
|
|
50 |
|
|
|
51 |
*/
|
|
|
52 |
|
|
|
53 |
|
|
|
54 |
/*
|
|
|
55 |
|
|
|
56 |
// On peut optionnellement vouloir restreindre la portee des extras :
|
|
|
57 |
// - pour les articles/rubriques/breves en fonction du secteur ;
|
|
|
58 |
// - pour les auteurs en fonction du statut
|
|
|
59 |
// - pour les mots-cles en fonction du groupe de mots
|
|
|
60 |
// Exemples :
|
|
|
61 |
|
|
|
62 |
$GLOBALS['champs_extra_proposes'] = Array (
|
|
|
63 |
'auteurs' => Array (
|
|
|
64 |
// tous : par defaut
|
|
|
65 |
'tous' => 'age|alim|ml',
|
|
|
66 |
// les admins (statut='0minirezo') ont plus de champs que les auteurs
|
|
|
67 |
'0minirezo' => 'age|alim|ml|biblio|habitation'
|
|
|
68 |
),
|
|
|
69 |
|
|
|
70 |
'articles' => Array (
|
|
|
71 |
// tous : par defaut aucun champs extra sur les articles
|
|
|
72 |
'tous' => '',
|
|
|
73 |
// seul le champs extra "isbn" est proposé dans le secteur 1)
|
|
|
74 |
'1' => 'isbn',
|
|
|
75 |
// Dans le secteur 2 le champs "options" est proposé)
|
|
|
76 |
'2' => 'options'
|
|
|
77 |
)
|
|
|
78 |
);
|
|
|
79 |
|
|
|
80 |
|
|
|
81 |
*/
|
|
|
82 |
|
|
|
83 |
////////////////////////////////////////////////////////////////////////////////////
|
|
|
84 |
|
|
|
85 |
//
|
|
|
86 |
// Ce fichier ne sera execute qu'une fois
|
|
|
87 |
if (defined("_ECRIRE_INC_EXTRA")) return;
|
|
|
88 |
define("_ECRIRE_INC_EXTRA", "1");
|
|
|
89 |
|
|
|
90 |
// a partir de la liste des champs, generer la liste des input
|
|
|
91 |
function extra_saisie($extra, $type, $ensemble='') {
|
|
|
92 |
$extra = unserialize($extra);
|
|
|
93 |
|
|
|
94 |
// quels sont les extras de ce type d'objet
|
|
|
95 |
if (!$champs = $GLOBALS['champs_extra'][$type])
|
|
|
96 |
$champs = Array();
|
|
|
97 |
|
|
|
98 |
// prendre en compte, eventuellement, les champs presents dans la base
|
|
|
99 |
// mais oublies dans mes_options.
|
|
|
100 |
if (is_array($extra))
|
|
|
101 |
while (list($key,) = each($extra))
|
|
|
102 |
if (!$champs[$key])
|
|
|
103 |
$champs[$key] = "masque||($key?)";
|
|
|
104 |
|
|
|
105 |
// quels sont les extras proposes...
|
|
|
106 |
// ... si l'ensemble est connu
|
|
|
107 |
if ($ensemble && isset($GLOBALS['champs_extra_proposes'][$type][$ensemble]))
|
|
|
108 |
$champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type][$ensemble]);
|
|
|
109 |
// ... sinon, les champs proposes par defaut
|
|
|
110 |
else if (isset($GLOBALS['champs_extra_proposes'][$type]['tous'])) {
|
|
|
111 |
$champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type]['tous']);
|
|
|
112 |
}
|
|
|
113 |
|
|
|
114 |
// sinon tous les champs extra du type
|
|
|
115 |
else {
|
|
|
116 |
$champs_proposes = Array();
|
|
|
117 |
reset($champs);
|
|
|
118 |
while (list($ch, ) = each($champs)) $champs_proposes[] = $ch;
|
|
|
119 |
}
|
|
|
120 |
|
|
|
121 |
// bug explode
|
|
|
122 |
if($champs_proposes == explode('|', '')) $champs_proposes = Array();
|
|
|
123 |
|
|
|
124 |
// maintenant, on affiche les formulaires pour les champs renseignes dans $extra
|
|
|
125 |
// et pour les champs proposes
|
|
|
126 |
reset($champs_proposes);
|
|
|
127 |
while (list(, $champ) = each($champs_proposes)) {
|
|
|
128 |
$desc = $champs[$champ];
|
|
|
129 |
list($form, $filtre, $prettyname, $choix, $valeurs) = explode("|", $desc);
|
|
|
130 |
|
|
|
131 |
if (!$prettyname) $prettyname = ucfirst($champ);
|
|
|
132 |
$affiche .= "<b>$prettyname :</b><br />";
|
|
|
133 |
|
|
|
134 |
switch($form) {
|
|
|
135 |
|
|
|
136 |
case "case":
|
|
|
137 |
case "checkbox":
|
|
|
138 |
$affiche = ereg_replace("<br />$", " ", $affiche);
|
|
|
139 |
$affiche .= "<INPUT TYPE='checkbox' NAME='suppl_$champ'";
|
|
|
140 |
if ($extra[$champ] == 'true')
|
|
|
141 |
$affiche .= " CHECKED ";
|
|
|
142 |
break;
|
|
|
143 |
|
|
|
144 |
case "list":
|
|
|
145 |
case "liste":
|
|
|
146 |
case "select":
|
|
|
147 |
$choix = explode(",",$choix);
|
|
|
148 |
if (!is_array($choix)) {
|
|
|
149 |
$affiche .= "Pas de choix définis.\n";
|
|
|
150 |
break;
|
|
|
151 |
}
|
|
|
152 |
|
|
|
153 |
// prendre en compte les valeurs des champs
|
|
|
154 |
// si elles sont renseignees
|
|
|
155 |
$valeurs = explode(",",$valeurs);
|
|
|
156 |
if($valeurs == explode(",",""))
|
|
|
157 |
$valeurs = $choix ;
|
|
|
158 |
|
|
|
159 |
$affiche .= "<SELECT NAME='suppl_$champ' ";
|
|
|
160 |
$affiche .= "CLASS='forml'>\n";
|
|
|
161 |
$i = 0 ;
|
|
|
162 |
while (list(, $choix_) = each($choix)) {
|
|
|
163 |
$val = $valeurs[$i] ;
|
|
|
164 |
$affiche .= "<OPTION VALUE=\"$val\"";
|
|
|
165 |
if ($val == entites_html($extra[$champ]))
|
|
|
166 |
$affiche .= " SELECTED";
|
|
|
167 |
$affiche .= ">$choix_</OPTION>\n";
|
|
|
168 |
$i++;
|
|
|
169 |
}
|
|
|
170 |
$affiche .= "</SELECT>";
|
|
|
171 |
break;
|
|
|
172 |
|
|
|
173 |
case "radio":
|
|
|
174 |
$choix = explode(",",$choix);
|
|
|
175 |
if (!is_array($choix)) {
|
|
|
176 |
$affiche .= "Pas de choix définis.\n";
|
|
|
177 |
break;
|
|
|
178 |
}
|
|
|
179 |
$valeurs = explode(",",$valeurs);
|
|
|
180 |
if($valeurs == explode(",",""))
|
|
|
181 |
$valeurs = $choix ;
|
|
|
182 |
|
|
|
183 |
$i=0;
|
|
|
184 |
while (list(, $choix_) = each($choix)) {
|
|
|
185 |
$affiche .= "<INPUT TYPE='radio' NAME='suppl_$champ' ";
|
|
|
186 |
$val = $valeurs[$i] ;
|
|
|
187 |
if (entites_html($extra["$champ"])== $val)
|
|
|
188 |
$affiche .= " CHECKED";
|
|
|
189 |
|
|
|
190 |
// premiere valeur par defaut
|
|
|
191 |
if (!$extra["$champ"] AND $i == 0)
|
|
|
192 |
$affiche .= " CHECKED";
|
|
|
193 |
|
|
|
194 |
$affiche .= " VALUE='$val'>$choix_</INPUT>\n";
|
|
|
195 |
$i++;
|
|
|
196 |
}
|
|
|
197 |
break;
|
|
|
198 |
|
|
|
199 |
// A refaire car on a pas besoin de renvoyer comme pour checkbox
|
|
|
200 |
// les cases non cochees
|
|
|
201 |
case "multiple":
|
|
|
202 |
$choix = explode(",",$choix);
|
|
|
203 |
if (!is_array($choix)) {
|
|
|
204 |
$affiche .= "Pas de choix définis.\n";
|
|
|
205 |
break; }
|
|
|
206 |
for ($i=0; $i < count($choix); $i++) {
|
|
|
207 |
$affiche .= "<INPUT TYPE='checkbox' NAME='suppl_$champ$i'";
|
|
|
208 |
if (entites_html($extra["$champ"][$i])=="on")
|
|
|
209 |
$affiche .= " CHECKED";
|
|
|
210 |
$affiche .= ">\n";
|
|
|
211 |
$affiche .= $choix[$i];
|
|
|
212 |
$affiche .= "</INPUT>\n";
|
|
|
213 |
}
|
|
|
214 |
break;
|
|
|
215 |
|
|
|
216 |
case "bloc":
|
|
|
217 |
case "block":
|
|
|
218 |
$affiche .= "<TEXTAREA NAME='suppl_$champ' CLASS='forml' ROWS='5' COLS='40'>".entites_html($extra[$champ])."</TEXTAREA>\n";
|
|
|
219 |
break;
|
|
|
220 |
|
|
|
221 |
case "masque":
|
|
|
222 |
$affiche .= "<font color='#555555'>".interdire_scripts($extra[$champ])."</font>\n";
|
|
|
223 |
break;
|
|
|
224 |
|
|
|
225 |
case "ligne":
|
|
|
226 |
case "line":
|
|
|
227 |
default:
|
|
|
228 |
$affiche .= "<INPUT TYPE='text' NAME='suppl_$champ' CLASS='forml'\n";
|
|
|
229 |
$affiche .= " VALUE=\"".entites_html($extra[$champ])."\" SIZE='40'>\n";
|
|
|
230 |
break;
|
|
|
231 |
}
|
|
|
232 |
|
|
|
233 |
$affiche .= "<p>\n";
|
|
|
234 |
}
|
|
|
235 |
|
|
|
236 |
if ($affiche) {
|
|
|
237 |
debut_cadre_enfonce();
|
|
|
238 |
echo $affiche;
|
|
|
239 |
fin_cadre_enfonce();
|
|
|
240 |
}
|
|
|
241 |
}
|
|
|
242 |
|
|
|
243 |
// recupere les valeurs postees pour reconstituer l'extra
|
|
|
244 |
function extra_recup_saisie($type) {
|
|
|
245 |
$champs = $GLOBALS['champs_extra'][$type];
|
|
|
246 |
if (is_array($champs)) {
|
|
|
247 |
$extra = Array();
|
|
|
248 |
while(list($champ,)=each($champs)) {
|
|
|
249 |
list($style, $filtre, , $choix,) = explode("|", $GLOBALS['champs_extra'][$type][$champ]);
|
|
|
250 |
list(, $filtre) = explode(",", $filtre);
|
|
|
251 |
switch ($style) {
|
|
|
252 |
case "multiple":
|
|
|
253 |
$choix = explode(",", $choix);
|
|
|
254 |
$extra["$champ"] = array();
|
|
|
255 |
for ($i=0; $i < count($choix); $i++) {
|
|
|
256 |
if ($filtre && function_exists($filtre))
|
|
|
257 |
$extra["$champ"][$i] =
|
|
|
258 |
$filtre($GLOBALS["suppl_$champ$i"]);
|
|
|
259 |
else
|
|
|
260 |
$extra["$champ"][$i] = $GLOBALS["suppl_$champ$i"];
|
|
|
261 |
}
|
|
|
262 |
break;
|
|
|
263 |
|
|
|
264 |
case 'case':
|
|
|
265 |
case 'checkbox':
|
|
|
266 |
if ($GLOBALS["suppl_$champ"] == 'on')
|
|
|
267 |
$GLOBALS["suppl_$champ"] = 'true';
|
|
|
268 |
else
|
|
|
269 |
$GLOBALS["suppl_$champ"] = 'false';
|
|
|
270 |
|
|
|
271 |
default:
|
|
|
272 |
if ($filtre && function_exists($filtre))
|
|
|
273 |
$extra["$champ"]=$filtre($GLOBALS["suppl_$champ"]);
|
|
|
274 |
else $extra["$champ"]=$GLOBALS["suppl_$champ"];
|
|
|
275 |
break;
|
|
|
276 |
}
|
|
|
277 |
}
|
|
|
278 |
return serialize($extra);
|
|
|
279 |
} else
|
|
|
280 |
return '';
|
|
|
281 |
}
|
|
|
282 |
|
|
|
283 |
// Retourne la liste des filtres a appliquer pour un champ extra particulier
|
|
|
284 |
function extra_filtres($type, $nom_champ) {
|
|
|
285 |
$champ = $GLOBALS['champs_extra'][$type][$nom_champ];
|
|
|
286 |
if (!$champ) return array();
|
|
|
287 |
list(, $filtre, ) = explode("|", $champ);
|
|
|
288 |
list($filtre, ) = explode(",", $filtre);
|
|
|
289 |
if ($filtre && $filtre != 'brut' && function_exists($filtre))
|
|
|
290 |
return array($filtre);
|
|
|
291 |
return array();
|
|
|
292 |
}
|
|
|
293 |
|
|
|
294 |
// Retourne la liste des filtres a appliquer a la recuperation
|
|
|
295 |
// d'un champ extra particulier
|
|
|
296 |
function extra_filtres_recup($type, $nom_champ) {
|
|
|
297 |
$champ = $GLOBALS['champs_extra'][$type][$nom_champ];
|
|
|
298 |
if (!$champ) return array();
|
|
|
299 |
list(, $filtre, ) = explode("|", $champ);
|
|
|
300 |
list(,$filtre) = explode(",", $filtre);
|
|
|
301 |
if ($filtre && $filtre != 'brut' && function_exists($filtre))
|
|
|
302 |
return array($filtre);
|
|
|
303 |
return array();
|
|
|
304 |
}
|
|
|
305 |
|
|
|
306 |
function extra_champ_valide($type, $nom_champ) {
|
|
|
307 |
return isset($GLOBALS['champs_extra'][$type][$nom_champ]);
|
|
|
308 |
}
|
|
|
309 |
|
|
|
310 |
// a partir de la liste des champs, generer l'affichage
|
|
|
311 |
function extra_affichage($extra, $type) {
|
|
|
312 |
$extra = unserialize ($extra);
|
|
|
313 |
if (!is_array($extra)) return;
|
|
|
314 |
$champs = $GLOBALS['champs_extra'][$type];
|
|
|
315 |
|
|
|
316 |
while (list($nom,$contenu) = each($extra)) {
|
|
|
317 |
list ($style, $filtre, $prettyname, $choix, $valeurs) =
|
|
|
318 |
explode("|", $champs[$nom]);
|
|
|
319 |
list($filtre, ) = explode(",", $filtre);
|
|
|
320 |
switch ($style) {
|
|
|
321 |
case "checkbox":
|
|
|
322 |
case "case":
|
|
|
323 |
if ($contenu=="true") $contenu = _T('item_oui');
|
|
|
324 |
elseif ($contenu=="false") $contenu = _T('item_non');
|
|
|
325 |
break;
|
|
|
326 |
|
|
|
327 |
case "multiple":
|
|
|
328 |
$contenu_ = "";
|
|
|
329 |
$choix = explode (",", $choix);
|
|
|
330 |
if (is_array($contenu) AND is_array($choix)
|
|
|
331 |
AND count($choix)==count($contenu))
|
|
|
332 |
for ($i=0; $i < count($contenu); $i++)
|
|
|
333 |
if ($contenu[$i] == "on")
|
|
|
334 |
$contenu_ .= "$choix[$i], ";
|
|
|
335 |
else if ($contenu[$i] <> '')
|
|
|
336 |
$contenu_ = "Choix incohérents, "
|
|
|
337 |
."vérifiez la configuration... ";
|
|
|
338 |
$contenu = ereg_replace(", $", "", $contenu_);
|
|
|
339 |
break;
|
|
|
340 |
}
|
|
|
341 |
if ($filtre != 'brut' AND function_exists($filtre))
|
|
|
342 |
$contenu = $filtre($contenu);
|
|
|
343 |
if (!$prettyname)
|
|
|
344 |
$prettyname = ucfirst($nom);
|
|
|
345 |
if ($contenu)
|
|
|
346 |
$affiche .= "<div><b>$prettyname :</b> "
|
|
|
347 |
.interdire_scripts($contenu)."<br /></div>\n";
|
|
|
348 |
}
|
|
|
349 |
|
|
|
350 |
if ($affiche) {
|
|
|
351 |
debut_cadre_enfonce();
|
|
|
352 |
echo $affiche;
|
|
|
353 |
fin_cadre_enfonce();
|
|
|
354 |
}
|
|
|
355 |
}
|
|
|
356 |
|
|
|
357 |
?>
|