3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14 include_spip('inc/actions');
16 // http://doc.spip.org/@affiche_navigation_forum
17 function affiche_navigation_forum($script, $args, $debut, $i, $pack, $ancre, $query)
19 $nav = ($i <=0) ?
'' : ("<a href='" . generer_url_ecrire($script, $args) ."'>0</a> ... |\n");
21 $e = (_SPIP_AJAX
=== 1 );
23 $n = spip_num_rows($query);
27 if ($i == $pack*floor($i/$pack)) {
29 $nav .= "<span class='spip_medium'><b>$i</b></span> |\n";
31 $h = generer_url_ecrire($script, $args . "&debut=$i");
32 if ($e) $e = "\nonclick=" . ajax_action_declencheur($h,$ancre);
33 $nav .= "<a href='$h'$e>$i</a> |\n";
39 $h = generer_url_ecrire($script, $args . "&debut=$i");
41 if ($e) $e = "\nonclick=" . ajax_action_declencheur($h,$ancre);
43 return "$nav<a href='$h'$e>...</a> |";
47 // tous les boutons de controle d'un forum
48 // nb : les forums prives (privrac ou prive), une fois effaces
49 // (privoff), ne sont pas revalidables ; le forum d'admin (privadm)
50 // n'est pas effacable
52 // http://doc.spip.org/@boutons_controle_forum
53 function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref, $forum_ip) {
57 // selection du logo et des boutons correspondant a l'etat du forum
58 switch ($forum_stat) {
59 # forum sous un article dans l'espace prive
61 $logo = "forum-interne-24.gif";
63 $valider_repondre = false
;
64 $suppression = 'privoff';
66 # forum des administrateurs
68 $logo = "forum-admin-24.gif";
70 $valider_repondre = false
;
73 # forum de l'espace prive, supprime (non revalidable,
74 # d'ailleurs on ne sait plus a quel type de forum il appartenait)
76 $logo = "forum-interne-24.gif";
78 $valider_repondre = false
;
81 # forum general de l'espace prive
83 $logo = "forum-interne-24.gif";
85 $valider_repondre = false
;
86 $suppression = 'privoff';
89 # forum publie sur le site public
91 $logo = "forum-public-24.gif";
93 $valider_repondre = false
;
96 # forum supprime sur le site public
98 $logo = "forum-public-24.gif";
100 $valider_repondre = false
;
101 $suppression = false
;
102 $controle = "<br /><span style='color: red; font-weight: bold;'>"._T('info_message_supprime')." $forum_ip</span>";
104 $controle .= " - <a href='" . generer_url_ecrire('auteur_infos', "id_auteur=$forum_id_auteur") .
105 "'>" ._T('lien_voir_auteur'). "</a>";
107 # forum propose (a moderer) sur le site public
109 $logo = "forum-public-24.gif";
111 $valider_repondre = true
;
112 $suppression = 'off';
114 # forum original (reponse a un forum modifie) sur le site public
116 $logo = "forum-public-24.gif";
123 $lien = str_replace('&', '&', self()) . "#id$id_forum";
125 $controle .= icone(_T('icone_supprimer_message'), generer_action_auteur('instituer_forum',"$id_forum-$suppression", _DIR_RESTREINT_ABS
. $lien),
127 "supprimer.gif", 'right', 'non');
130 $controle .= icone(_T('icone_valider_message'), generer_action_auteur('instituer_forum',"$id_forum-$valider", _DIR_RESTREINT_ABS
. $lien),
132 "creer.gif", 'right', 'non');
134 if ($valider_repondre) {
135 $dblret = rawurlencode(_DIR_RESTREINT_ABS
. $lien);
136 $controle .= icone(_T('icone_valider_message') . " & " . _T('lien_repondre_message'), generer_action_auteur('instituer_forum',"$id_forum-$valider", generer_url_public('forum', "$ref&id_forum=$id_forum&retour=$dblret", true
)),
138 "creer.gif", 'right', 'non');
141 // TODO: un bouton retablir l'original ?
143 $controle .= "<div style='float:".$GLOBALS['spip_lang_right'].";color:green'>"
145 ._T('forum_info_original')
152 // recuperer le critere SQL qui selectionne nos forums
153 // http://doc.spip.org/@critere_statut_controle_forum
154 function critere_statut_controle_forum($page, $id_rubrique=0) {
156 if (is_array($id_rubrique)) $id_rubrique = join(',',$id_rubrique);
158 $from = 'spip_forum AS F';
162 if (strpos($id_rubrique,','))
163 $eq = " IN ($id_rubrique)";
164 else $eq = "=$id_rubrique";
166 $from = 'spip_forum AS F, spip_articles AS A';
167 $where = "A.id_secteur$eq AND F.id_article=A.id_article";
173 $and .= "F.statut IN ('publie', 'off', 'prop') AND F.texte!=''";
176 $and .= "F.statut='prop'";
179 $and .= "F.statut IN ('prive', 'privrac', 'privoff', 'privadm') AND F.texte!=''";
182 $and .= "F.statut IN ('publie', 'off', 'prive', 'privrac', 'privoff', 'privadm') AND F.texte=''";
189 return array($from, "$where$and");
192 // Index d'invalidation des forums
193 // http://doc.spip.org/@calcul_index_forum
194 function calcul_index_forum($id_article, $id_breve, $id_rubrique, $id_syndic) {
195 if ($id_article) return 'a'.$id_article;
196 if ($id_breve) return 'b'.$id_breve;
197 if ($id_rubrique) return 'r'.$id_rubrique;
198 if ($id_syndic) return 's'.$id_syndic;
202 // Recalculer tous les threads
204 // http://doc.spip.org/@calculer_threads
205 function calculer_threads() {
206 // fixer les id_thread des debuts de discussion
207 spip_query("UPDATE spip_forum SET id_thread=id_forum WHERE id_parent=0");
209 // reparer les messages qui n'ont pas l'id_secteur de leur parent
213 $r = spip_query("SELECT fille.id_forum AS id, maman.id_thread AS thread FROM spip_forum AS fille, spip_forum AS maman WHERE fille.id_parent = maman.id_forum AND fille.id_thread <> maman.id_thread ORDER BY thread");
214 while ($row = spip_fetch_array($r)) {
215 if ($row['thread'] == $precedent)
216 $discussion .= "," . $row['id'];
219 spip_query("UPDATE spip_forum SET id_thread=$precedent WHERE id_forum IN ($discussion)");
220 $precedent = $row['thread'];
221 $discussion = $row['id'];
224 spip_query("UPDATE spip_forum SET id_thread=$precedent WHERE id_forum IN ($discussion)");
225 } while ($discussion != "0");
228 // Calculs des URLs des forums (pour l'espace public)
229 // http://doc.spip.org/@racine_forum
230 function racine_forum($id_forum){
231 if (!$id_forum = intval($id_forum)) return;
232 $result = spip_query("SELECT id_parent, id_rubrique, id_article, id_breve, id_syndic FROM spip_forum WHERE id_forum=".$id_forum);
234 if($row = spip_fetch_array($result)){
235 if($row['id_parent']) {
236 return racine_forum($row['id_parent']);
239 if($row['id_rubrique']) return array('rubrique',$row['id_rubrique'], $id_forum);
240 if($row['id_article']) return array('article',$row['id_article'], $id_forum);
241 if($row['id_breve']) return array('breve',$row['id_breve'], $id_forum);
242 if($row['id_syndic']) return array('site',$row['id_syndic'], $id_forum);
247 // http://doc.spip.org/@generer_url_forum_dist
248 function generer_url_forum_dist($id_forum, $show_thread=false
) {
249 if (!$id_forum) return '';
250 list($type, $id, $id_thread) = racine_forum($id_forum);
251 if ($id_thread>0 AND $show_thread)
252 $id_forum = $id_thread;
255 return generer_url_article($id)."#forum$id_forum";
258 return generer_url_breve($id)."#forum$id_forum";
261 return generer_url_rubrique($id)."#forum$id_forum";
264 return generer_url_site($id)."#forum$id_forum";
271 // Quand on edite un forum, on tient a conserver l'original
272 // sous forme d'un forum en reponse, de statut 'original'
273 // http://doc.spip.org/@conserver_original
274 function conserver_original($id_forum) {
275 $s = spip_query("SELECT id_forum FROM spip_forum WHERE id_parent="._q($id_forum)." AND statut='original'");
277 if (spip_num_rows($s))
278 return ''; // pas d'erreur
281 $t = spip_fetch_array(
282 spip_query("SELECT date_heure,titre,texte,auteur,email_auteur,nom_site,url_site,ip,id_auteur,idx,id_thread FROM spip_forum WHERE id_forum="._q($id_forum))
286 AND spip_query("INSERT spip_forum (date_heure,titre,texte,auteur,email_auteur,nom_site,url_site,ip,id_auteur,idx,id_thread) VALUES (".join(',',array_map('_q', $t)).")")) {
287 $id_copie = spip_insert_id();
288 spip_query("UPDATE spip_forum SET id_parent="._q($id_forum).", statut='original' WHERE id_forum=$id_copie");
289 return ''; // pas d'erreur
295 // appelle conserver_original(), puis modifie le contenu via l'API inc/modifier
296 // http://doc.spip.org/@enregistre_et_modifie_forum
297 function enregistre_et_modifie_forum($id_forum, $c=false
) {
298 if ($err = conserver_original($id_forum)) {
299 spip_log("erreur de sauvegarde de l'original, $err");
303 include_spip('inc/modifier');
304 return revision_forum($id_forum, $c);