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']) . " : <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') ? ' ' : ''),
|
|
|
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 :</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%'> </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 |
?>
|