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