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