Mise en route du suivi.
[aidenligne_francais_universite.git] / ecrire / inc / forum.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
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 \***************************************************************************/
12
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14 include_spip('inc/actions');
15
16 // http://doc.spip.org/@affiche_navigation_forum
17 function affiche_navigation_forum($script, $args, $debut, $i, $pack, $ancre, $query)
18 {
19 $nav = ($i <=0) ? '' : ("<a href='" . generer_url_ecrire($script, $args) ."'>0</a> ... |\n");
20
21 $e = (_SPIP_AJAX === 1 );
22
23 $n = spip_num_rows($query);
24
25 for (;$n;$n--){
26
27 if ($i == $pack*floor($i/$pack)) {
28 if ($i == $debut)
29 $nav .= "<span class='spip_medium'><b>$i</b></span> |\n";
30 else {
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";
34 }
35 }
36 $i ++;
37 }
38
39 $h = generer_url_ecrire($script, $args . "&debut=$i");
40
41 if ($e) $e = "\nonclick=" . ajax_action_declencheur($h,$ancre);
42
43 return "$nav<a href='$h'$e>...</a> |";
44 }
45
46
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
51
52 // http://doc.spip.org/@boutons_controle_forum
53 function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref, $forum_ip) {
54 $controle = '';
55
56
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
60 case "prive":
61 $logo = "forum-interne-24.gif";
62 $valider = false;
63 $valider_repondre = false;
64 $suppression = 'privoff';
65 break;
66 # forum des administrateurs
67 case "privadmin":
68 $logo = "forum-admin-24.gif";
69 $valider = false;
70 $valider_repondre = false;
71 $suppression = false;
72 break;
73 # forum de l'espace prive, supprime (non revalidable,
74 # d'ailleurs on ne sait plus a quel type de forum il appartenait)
75 case "privoff":
76 $logo = "forum-interne-24.gif";
77 $valider = false;
78 $valider_repondre = false;
79 $suppression = false;
80 break;
81 # forum general de l'espace prive
82 case "privrac":
83 $logo = "forum-interne-24.gif";
84 $valider = false;
85 $valider_repondre = false;
86 $suppression = 'privoff';
87 break;
88
89 # forum publie sur le site public
90 case "publie":
91 $logo = "forum-public-24.gif";
92 $valider = false;
93 $valider_repondre = false;
94 $suppression = 'off';
95 break;
96 # forum supprime sur le site public
97 case "off":
98 $logo = "forum-public-24.gif";
99 $valider = 'publie';
100 $valider_repondre = false;
101 $suppression = false;
102 $controle = "<br /><span style='color: red; font-weight: bold;'>"._T('info_message_supprime')." $forum_ip</span>";
103 if($forum_id_auteur)
104 $controle .= " - <a href='" . generer_url_ecrire('auteur_infos', "id_auteur=$forum_id_auteur") .
105 "'>" ._T('lien_voir_auteur'). "</a>";
106 break;
107 # forum propose (a moderer) sur le site public
108 case "prop":
109 $logo = "forum-public-24.gif";
110 $valider = 'publie';
111 $valider_repondre = true;
112 $suppression = 'off';
113 break;
114 # forum original (reponse a un forum modifie) sur le site public
115 case "original":
116 $logo = "forum-public-24.gif";
117 $original = true;
118 break;
119 default:
120 return;
121 }
122
123 $lien = str_replace('&amp;', '&', self()) . "#id$id_forum";
124 if ($suppression)
125 $controle .= icone(_T('icone_supprimer_message'), generer_action_auteur('instituer_forum',"$id_forum-$suppression", _DIR_RESTREINT_ABS . $lien),
126 $logo,
127 "supprimer.gif", 'right', 'non');
128
129 if ($valider)
130 $controle .= icone(_T('icone_valider_message'), generer_action_auteur('instituer_forum',"$id_forum-$valider", _DIR_RESTREINT_ABS . $lien),
131 $logo,
132 "creer.gif", 'right', 'non');
133
134 if ($valider_repondre) {
135 $dblret = rawurlencode(_DIR_RESTREINT_ABS . $lien);
136 $controle .= icone(_T('icone_valider_message') . " &amp; " . _T('lien_repondre_message'), generer_action_auteur('instituer_forum',"$id_forum-$valider", generer_url_public('forum', "$ref&id_forum=$id_forum&retour=$dblret", true)),
137 $logo,
138 "creer.gif", 'right', 'non');
139 }
140
141 // TODO: un bouton retablir l'original ?
142 if ($original) {
143 $controle .= "<div style='float:".$GLOBALS['spip_lang_right'].";color:green'>"
144 ."("
145 ._T('forum_info_original')
146 .")</div>";
147 }
148
149 return $controle;
150 }
151
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) {
155
156 if (is_array($id_rubrique)) $id_rubrique = join(',',$id_rubrique);
157 if (!$id_rubrique) {
158 $from = 'spip_forum AS F';
159 $where = "";
160 $and = "";
161 } else {
162 if (strpos($id_rubrique,','))
163 $eq = " IN ($id_rubrique)";
164 else $eq = "=$id_rubrique";
165
166 $from = 'spip_forum AS F, spip_articles AS A';
167 $where = "A.id_secteur$eq AND F.id_article=A.id_article";
168 $and = ' AND ';
169 }
170
171 switch ($page) {
172 case 'public':
173 $and .= "F.statut IN ('publie', 'off', 'prop') AND F.texte!=''";
174 break;
175 case 'prop':
176 $and .= "F.statut='prop'";
177 break;
178 case 'interne':
179 $and .= "F.statut IN ('prive', 'privrac', 'privoff', 'privadm') AND F.texte!=''";
180 break;
181 case 'vide':
182 $and .= "F.statut IN ('publie', 'off', 'prive', 'privrac', 'privoff', 'privadm') AND F.texte=''";
183 break;
184 default:
185 $where = '0=1';
186 $and ='';
187 break;
188 }
189 return array($from, "$where$and");
190 }
191
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;
199 }
200
201 //
202 // Recalculer tous les threads
203 //
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");
208
209 // reparer les messages qui n'ont pas l'id_secteur de leur parent
210 do {
211 $discussion = "0";
212 $precedent = 0;
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'];
217 else {
218 if ($precedent)
219 spip_query("UPDATE spip_forum SET id_thread=$precedent WHERE id_forum IN ($discussion)");
220 $precedent = $row['thread'];
221 $discussion = $row['id'];
222 }
223 }
224 spip_query("UPDATE spip_forum SET id_thread=$precedent WHERE id_forum IN ($discussion)");
225 } while ($discussion != "0");
226 }
227
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);
233
234 if($row = spip_fetch_array($result)){
235 if($row['id_parent']) {
236 return racine_forum($row['id_parent']);
237 }
238 else {
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);
243 }
244 }
245 }
246
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;
253 switch($type) {
254 case 'article':
255 return generer_url_article($id)."#forum$id_forum";
256 break;
257 case 'breve':
258 return generer_url_breve($id)."#forum$id_forum";
259 break;
260 case 'rubrique':
261 return generer_url_rubrique($id)."#forum$id_forum";
262 break;
263 case 'site':
264 return generer_url_site($id)."#forum$id_forum";
265 break;
266 default:
267 return '';
268 }
269 }
270
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'");
276
277 if (spip_num_rows($s))
278 return ''; // pas d'erreur
279
280 // recopier le forum
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))
283 );
284
285 if ($t
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
290 }
291
292 return '&erreur';
293 }
294
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");
300 return;
301 }
302
303 include_spip('inc/modifier');
304 return revision_forum($id_forum, $c);
305 }
306
307 ?>