Subversion Repositories Sites.tela-botanica.org

Rev

Rev 609 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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&eacute;f&eacute;rences alimentaires|Veggie,Viande",
32
			"habitation" => "liste|brut|Lieu|Kuala Lumpur,Cape Town,Uppsala",
33
			"ml" => "case|propre|Je souhaite m'abonner &agrave; la mailinglist",
34
			"age" => "ligne|propre|&Acirc;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&nbsp;:</b><br />";
133
 
134
		switch($form) {
135
 
136
			case "case":
137
			case "checkbox":
138
				$affiche = ereg_replace("<br />$", "&nbsp;", $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&eacute;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&eacute;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&eacute;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&eacute;rents, "
337
							."v&eacute;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&nbsp;:</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
?>