Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 david 1
<?php
2
 
3
if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
4
 
5
include_ecrire('inc_meta.php3');
6
include_ecrire('inc_admin.php3');
7
include_ecrire('inc_acces.php3');
8
include_ecrire('inc_texte.php3');
9
include_ecrire('inc_filtres.php3');
10
include_ecrire('inc_lang.php3');
11
include_ecrire('inc_mail.php3');
12
include_ecrire('inc_forum.php3');
13
include_ecrire("inc_abstract_sql.php3");
14
include_local(_FILE_CONNECT);
15
 
16
// Gestionnaire d'URLs
17
if (@file_exists("inc-urls.php3"))
18
	include_local("inc-urls.php3");
19
else
20
	include_local("inc-urls-".$GLOBALS['type_urls'].".php3");
21
 
22
/*******************************/
23
/* GESTION DU FORMULAIRE FORUM */
24
/*******************************/
25
 
26
// Contexte du formulaire
27
global $balise_FORMULAIRE_FORUM_collecte;
28
$balise_FORMULAIRE_FORUM_collecte = array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic');
29
 
30
 
31
// verification des droits a faire du forum
32
function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
33
 
34
	// Note : ceci n'est pas documente !!
35
	// $filtres[0] peut contenir l'url sur lequel faire tourner le formulaire
36
	// exemple dans un squelette article.html : [(#FORMULAIRE_FORUM|forum.php3)]
37
 
38
	// $args[5] peut contenir l'url sur lequel faire le retour
39
	// exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
40
 
41
	// recuperer les donnees du forum auquel on repond, false = forum interdit
42
	list ($idr, $idf, $ida, $idb, $ids) = $args;
43
	if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
44
		return '';
45
 
46
	list ($titre, $table, $forums_publics) = $r;
47
 
48
	// Attention id_rubrique est passe pour les articles => on n'en veut pas
49
	if ($idr > 0 AND ($ida OR $idb OR $ids))
50
		$idr = 0;
51
 
52
	return
53
		array($titre, $table, $forums_publics, $idr, $idf, $ida, $idb, $ids,
54
			$filtres[0], $args[5]);
55
}
56
 
57
function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic, $url, $url_param_retour) {
58
	global $REMOTE_ADDR, $afficher_texte, $_COOKIE, $_POST;
59
 
60
	// Recuperer les donnees postees du formulaire ou, a defaut, du contexte
61
	foreach (array('id_article', 'id_breve', 'id_syndic',
62
	'id_rubrique', 'id_forum') as $id)
63
		if (isset($_POST['forum_'.$id]))
64
			$$id = intval($_POST['forum_'.$id]);
65
		else
66
			$$id = intval($$id);
67
 
68
	// url de reference
69
	if (!$url) {
70
		$url = new Link();
71
		$url = $url->getUrl();
72
	} else {
73
		// identifiants des parents
74
		$args = array();
75
		if ($id_rubrique) $args[] = "id_rubrique=$id_rubrique";
76
		if ($id_forum) $args[] = "id_forum=$id_forum";
77
		if ($id_article) $args[] = "id_article=$id_article";
78
		if ($id_breve) $args[] = "id_breve=$id_breve";
79
		if ($id_syndic) $args[] = "id_syndic=$id_syndic";
80
		if (count($args))
81
			$url .= (strpos($url,'?') ? '&' : '?'). join('&',$args);
82
	}
83
 
84
	$url = ereg_replace("[?&]var_erreur=[^&]*", '', $url);
85
	$url = ereg_replace("[?&]var_login=[^&]*", '', $url);
86
	$url = ereg_replace("[?&]url=[^&]*", '', $url);
87
 
88
	// verifier l'identite des posteurs pour les forums sur abo
89
	if (($forums_publics == "abo") && (!$GLOBALS["auteur_session"])) {
90
		return array('formulaire_login_forum', 0, array());
91
	}
92
 
93
	// ne pas mettre '', sinon le squelette n'affichera rien.
94
	$previsu = ' ';
95
 
96
	// au premier appel (pas de Post-var nommee "retour_forum")
97
	// memoriser evntuellement l'URL de retour pour y revenir apres
98
	// envoi du message ; aux appels suivants, reconduire la valeur.
99
	// Initialiser aussi l'auteur
100
	if (!$retour_forum = rawurldecode(_request('retour_forum'))) {
101
		if ($retour_forum = rawurldecode(_request('retour')))
102
			$retour_forum = str_replace('&var_mode=recalcul','',$retour_forum);
103
		else {
104
			// par defaut, on veut prendre url_forum(), mais elle ne sera connue
105
			// qu'en sortie, on inscrit donc une valeur absurde ("!")
106
			$retour_forum = "!";
107
 
108
			// sauf si on a passe un parametre en argument (exemple : {#SELF})
109
			if($url_param_retour)
110
				$retour_forum = str_replace("&amp;", "&", $url_param_retour);
111
		}
112
 
113
		if (isset($_COOKIE['spip_forum_user'])
114
		AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) {
115
			$auteur = $cookie_user['nom'];
116
			$email_auteur = $cookie_user['email'];
117
		} else {
118
			$auteur = $GLOBALS['auteur_session']['nom'];
119
			$email_auteur = $GLOBALS['auteur_session']['email'];
120
		}
121
 
122
	} else {
123
 
124
		// Recuperer le message a previsualiser
125
		$titre = _request('titre');
126
		$texte = _request('texte');
127
		$auteur = _request('auteur');
128
		$email_auteur = _request('email_auteur');
129
		$nom_site_forum = _request('nom_site_forum');
130
		$url_site = _request('url_site');
131
		$ajouter_mot = _request('ajouter_mot'); // array
132
 
133
		// Verifier mots associes au message
134
		if (is_array($ajouter_mot))
135
		$mots = preg_replace('/[^0-9,]/', '', join(',',$ajouter_mot));
136
		else $mots = '0';
137
 
138
		// affichage {par num type, type, num titre,titre}
139
		$result_mots = spip_query("SELECT id_mot, titre, type
140
			FROM spip_mots
141
			WHERE id_mot IN ($mots)
142
			ORDER BY 0+type,type,0+titre,titre");
143
		if (spip_num_rows($result_mots)>0) {
144
			$mots_forums = "<p>"._T('forum_avez_selectionne')."</p><ul>";
145
			while ($row = spip_fetch_array($result_mots)) {
146
				$les_mots[$row['id_mot']] = "checked='checked'";
147
				$presence_mots = true;
148
				$mots_forums .= "<li style='font-size: 80%;'> "
149
				. typo($row['type']) . "&nbsp;: <b>"
150
				. typo($row['titre']) ."</b></li>";
151
			}
152
			$mots_forums .= '</ul>';
153
		}
154
 
155
		//
156
		// Preparer la previsualisation
157
		//
158
		if ($afficher_texte != 'non') {
159
			if (strlen($texte) < 10 AND !$presence_mots)
160
				$erreur = _T('forum_attention_dix_caracteres');
161
			else if (strlen($titre) < 3 AND $afficher_texte <> "non")
162
				$erreur = _T('forum_attention_trois_caracteres');
163
			else
164
				$bouton = _T('forum_message_definitif');
165
 
166
			$previsu = inclure_balise_dynamique(
167
				array(
168
					'formulaire_forum_previsu',
169
					0,
170
					array(
171
						'titre' => interdire_scripts(typo($titre)),
172
						'email_auteur' => $email_auteur,
173
						'auteur' => interdire_scripts(typo($auteur)),
174
						'texte' => propre($texte),
175
						'url_site' => $url_site,
176
						'nom_site_forum' =>
177
							interdire_scripts(typo($nom_site_forum)),
178
						'mots_forum' => $mots_forum,
179
						'erreur' => $erreur,
180
						'bouton' => $bouton
181
					)
182
				), false);
183
 
184
			// supprimer les <form> de la previsualisation
185
			// (sinon on ne peut pas faire <cadre>...</cadre> dans les forums)
186
			$previsu = preg_replace("@<(/?)f(orm[>[:space:]])@ism",
187
				"<\\1no-f\\2", $previsu);
188
		}
189
 
190
	// Une securite qui nous protege contre :
191
	// - les doubles validations de forums (derapages humains ou des brouteurs)
192
	// - les abus visant a mettre des forums malgre nous sur un article (??)
193
	// On installe un fichier temporaire dans _DIR_SESSIONS (et pas _DIR_CACHE
194
	// afin de ne pas bugguer quand on vide le cache)
195
	// Le lock est leve au moment de l'insertion en base (inc-messforum.php3)
196
	// Ce systeme n'est pas fonctionnel pour les forums sans previsu (notamment
197
	// si $afficher_texte = 'non')
198
 
199
		$alea = preg_replace('/[^0-9]/', '', $alea);
200
		if(!$alea OR !@file_exists(_DIR_SESSIONS."forum_$alea.lck")) {
201
			while (
202
				# astuce : mt_rand pour autoriser les hits simultanes
203
				$alea = time() + @mt_rand()
204
				AND @file_exists($f = _DIR_SESSIONS."forum_$alea.lck")) {};
205
			spip_touch ($f);
206
		}
207
 
208
		# et maintenant on purge les locks de forums ouverts depuis > 4 h
209
		if ($dh = @opendir(_DIR_SESSIONS))
210
			while (($file = @readdir($dh)) !== false)
211
				if (preg_match('/^forum_([0-9]+)\.lck$/', $file)
212
				AND (time()-@filemtime(_DIR_SESSIONS.$file) > 4*3600))
213
					@unlink(_DIR_SESSIONS.$file);
214
 
215
		$hash = calculer_action_auteur("ajout_forum $id_rubrique $id_forum $id_article $id_breve $id_syndic $alea");
216
	}
217
 
218
	// Faut-il ajouter des propositions de mots-cles
219
	if ($table AND (lire_meta("mots_cles_forums") == "oui"))
220
		$table = table_des_mots($table, $les_mots);
221
	else
222
		$table = '';
223
 
224
	// preparer les parametres du forum en input hidden
225
	$parametres_forum = '';
226
	foreach (array('alea', 'hash', 'retour_forum') as $var)
227
		if ($val = entites_html($$var))
228
			$parametres_forum .=
229
			"<input type='hidden' name='$var' value=\"$val\" />\n";
230
	foreach (array(
231
	'id_article', 'id_breve', 'id_syndic', 'id_rubrique', 'id_forum')
232
	as $var)
233
		if ($val = $$var)
234
			$parametres_forum .=
235
			"<input type='hidden' name='forum_$var' value='$val' />\n";
236
 
237
	return array('formulaire_forum', 0,
238
	array(
239
		'auteur' => $auteur,
240
		'disabled' => ($forums_publics == "abo")? " disabled='disabled'" : '',
241
		'email_auteur' => $email_auteur,
242
		'modere' => (($forums_publics != 'pri') ? '' : _T('forum_info_modere')),
243
		'nom_site_forum' => $nom_site_forum,
244
		'previsu' => $previsu,
245
		'table' => $table,
246
		'texte' => $texte,
247
		'titre' => extraire_multi($titre),
248
		'url' =>  $url,
249
		'url_site' => ($url_site ? $url_site : "http://"),
250
		'parametres_forum' => $parametres_forum,
251
 
252
		## gestion des la variable de personnalisation $afficher_texte
253
		# mode normal : afficher le texte en < input text >, cf. squelette
254
		'afficher_texte_input' => (($afficher_texte <> 'non') ? '&nbsp;' : ''),
255
		# mode 'non' : afficher les elements en < input hidden >
256
		'afficher_texte_hidden' => (($afficher_texte <> 'non') ? '' :
257
			(boutonne('hidden', 'titre', htmlspecialchars($titre)) .
258
				$table .
259
				"\n<br /><div align='right'>" .
260
				boutonne('submit', '', _T('forum_valider'),
261
				"class='spip_bouton'") .
262
				"</div>"))
263
 
264
		));
265
}
266
 
267
 
268
function barre_forum($texte)
269
{
270
	include_ecrire('inc_layer.php3');
271
 
272
	if (!$GLOBALS['browser_barre'])
273
		return "<textarea name='texte' rows='12' class='forml' cols='40'>$texte</textarea>";
274
	static $num_formulaire = 0;
275
	$num_formulaire++;
276
	include_ecrire('inc_barre.php3');
277
	return afficher_barre("document.getElementById('formulaire_$num_formulaire')", true) .
278
	  "
279
<textarea name='texte' rows='12' class='forml' cols='40'
280
id='formulaire_$num_formulaire'
281
onselect='storeCaret(this);'
282
onclick='storeCaret(this);'
283
onkeyup='storeCaret(this);'
284
ondbclick='storeCaret(this);'>$texte</textarea>";
285
}
286
 
287
// Mots-cles dans les forums :
288
// Si la variable de personnalisation $afficher_groupe[] est definie
289
// dans le fichier d'appel, et si la table de reference est OK, proposer
290
// la liste des mots-cles
291
function table_des_mots($table, $les_mots) {
292
	global $afficher_groupe;
293
 
294
	if (!is_array($afficher_groupe)) return;
295
 
296
	$in_group = " AND id_groupe IN (" . join($afficher_groupe, ", ") .")";
297
 
298
	$result_groupe = spip_query("SELECT * FROM spip_groupes_mots
299
	WHERE forum = 'oui' AND $table = 'oui'". $in_group);
300
 
301
	$ret = '';
302
	while ($row_groupe = spip_fetch_array($result_groupe)) {
303
		$id_groupe = $row_groupe['id_groupe'];
304
		$titre_groupe = propre($row_groupe['titre']);
305
		$unseul = ($row_groupe['unseul']== 'oui') ? 'radio' : 'checkbox';
306
		$result =spip_query("SELECT * FROM spip_mots
307
		WHERE id_groupe='$id_groupe'");
308
		$total_rows = spip_num_rows($result);
309
 
310
		if ($total_rows > 0) {
311
			$ret .= "\n<p />"
312
			  . "<div class='spip_encadrer' style='font-size: 80%;'>"
313
			  . "<b>$titre_groupe&nbsp;:</b>"
314
			  . "<table cellpadding='0' cellspacing='0' border='0' width='100%'>\n"
315
			  ."<tr><td width='47%' valign='top'>";
316
			$i = 0;
317
 
318
		while ($row = spip_fetch_array($result)) {
319
			$id_mot = $row['id_mot'];
320
			$titre_mot = propre($row['titre']);
321
			$descriptif_mot = propre($row['descriptif']);
322
 
323
			if ($i >= ($total_rows/2) AND $i < $total_rows) {
324
				$i = $total_rows + 1;
325
				$ret .= "</td><td width='6%'>&nbsp;</td>
326
				<td width='47%' valign='top'>";
327
			}
328
 
329
			$ret .= boutonne($unseul, "ajouter_mot[]", $id_mot, "id='mot$id_mot' " . $les_mots[$id_mot]) .
330
			  afficher_petits_logos_mots($id_mot)
331
			. "<b><label for='mot$id_mot'>$titre_mot</label></b><br />";
332
 
333
			if ($descriptif_mot)
334
				$ret .= "$descriptif_mot<br />";
335
			$i++;
336
		}
337
 
338
		$ret .= "</td></tr></table>";
339
		$ret .= "</div>";
340
		}
341
	}
342
 
343
	return $ret;
344
}
345
 
346
 
347
function afficher_petits_logos_mots($id_mot) {
348
	include_ecrire('inc_logos.php3');
349
	$on = cherche_image_nommee("moton$id_mot");
350
	if ($on) {
351
	  $image = ("$on[0]$on[1].$on[2]");
352
		$taille = @getimagesize($image);
353
		$largeur = $taille[0];
354
		$hauteur = $taille[1];
355
		if ($largeur < 100 AND $hauteur < 100)
356
			return "<img src='$image' align='middle' width='$largeur'
357
			height='$hauteur' hspace='1' vspace='1' alt=' ' border='0'
358
			class='spip_image' /> ";
359
	}
360
}
361
 
362
 
363
 
364
/*******************************************************/
365
/* FONCTIONS DE CALCUL DES DONNEES DU FORMULAIRE FORUM */
366
/*******************************************************/
367
 
368
//
369
// Chercher le titre et la configuration du forum de l'element auquel on repond
370
//
371
 
372
function sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids) {
373
 
374
	// changer la table de reference s'il y a lieu (pour afficher_groupes[] !!)
375
	if ($ida) {
376
		$r = "SELECT titre FROM spip_articles WHERE id_article = $ida";
377
		$table = "articles";
378
	} else if ($idb) {
379
		$r = "SELECT titre FROM spip_breves WHERE id_breve = $idb";
380
		$table = "breves";
381
	} else if ($ids) {
382
		$r = "SELECT nom_site AS titre FROM spip_syndic WHERE id_syndic = $ids";
383
		$table = "syndic";
384
	} else if ($idr) {
385
		$r = "SELECT titre FROM spip_rubriques WHERE id_rubrique = $idr";
386
		$table = "rubriques";
387
	}
388
 
389
	if ($idf)
390
		$r = "SELECT titre FROM spip_forum WHERE id_forum = $idf";
391
 
392
	if ($r) {
393
		list($titre) = spip_fetch_array(spip_query($r));
394
		$titre = '> ' . supprimer_numero(preg_replace('/^[> ]*/', '', $titre));
395
	} else {
396
		$titre = _T('forum_titre_erreur');
397
		$table = '';
398
	}
399
 
400
	// quelle est la configuration du forum ?
401
	if ($ida)
402
		list($accepter_forum) = spip_fetch_array(spip_query(
403
		"SELECT accepter_forum FROM spip_articles WHERE id_article=$ida"));
404
	if (!$accepter_forum)
405
		$accepter_forum = substr(lire_meta("forums_publics"),0,3);
406
	// valeurs possibles : 'pos'teriori, 'pri'ori, 'abo'nnement
407
	if ($accepter_forum == "non")
408
		return false;
409
 
410
	return array ($titre, $table, $accepter_forum);
411
}
412
 
413
?>