source: spip-zone/_core_/plugins/forum/forum_pipelines.php @ 47888

Last change on this file since 47888 was 47888, checked in by cedric@…, 10 years ago

correction de structure html, et ajout d'une chaine de langue

File size: 12.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
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
14/**
15 * Bloc sur les encours editoriaux en page d'accueil
16 *
17 * @param string $texte
18 * @return string
19 */
20function forum_accueil_encours($texte){
21        // si aucun autre objet n'est a valider, on ne dit rien sur les forum
22        if ($GLOBALS['visiteur_session']['statut'] == '0minirezo') {
23                // Les forums en attente de moderation
24                $cpt = sql_countsel("spip_forum", "statut='prop'");
25                if ($cpt) {
26                        if ($cpt>1)
27                                $lien = _T('forum:info_liens_syndiques_3')." "._T('forum:info_liens_syndiques_4');
28                        else
29                                $lien = _T('forum:info_liens_syndiques_5')." "._T('forum:info_liens_syndiques_6');
30                        $lien = "<small>$cpt $lien " ._T('forum:info_liens_syndiques_7'). "</small>";
31                        if ($GLOBALS['connect_toutes_rubriques'])
32                                $lien = "<a href='" . generer_url_ecrire("controler_forum","statut=prop") . "' style='color: black;'>". $lien . ".</a>";
33                        $texte .= "\n<br />" . $lien;
34                }
35                if (strlen($texte) AND $GLOBALS['meta']['forum_prive_objets'] != 'non')
36                        $cpt2 = sql_countsel("spip_articles", "statut='prop'");
37                        if ($cpt2)
38                                $texte = _T('forum:texte_en_cours_validation_forum') . $texte;
39        }
40
41        return $texte;
42}
43
44
45/**
46 * Bloc sur les informations generales concernant chaque type d'objet
47 *
48 * @param string $texte
49 * @return string
50 */
51function forum_accueil_informations($texte){
52        include_spip('base/abstract_sql');
53        $q = sql_select('COUNT(*) AS cnt, statut', 'spip_forum', sql_in('statut', array('publie', 'prop')), 'statut', '','', "COUNT(*)<>0");
54
55        $where = count($GLOBALS['connect_id_rubrique']) ? sql_in('id_rubrique', $GLOBALS['connect_id_rubrique'])        : '';
56        $cpt = array();
57        $cpt2 = array();
58        $defaut = $where ? '0/' : '';
59        while($row = sql_fetch($q)) {
60          $cpt[$row['statut']] = $row['cnt'];
61          $cpt2[$row['statut']] = $defaut;
62        }
63
64        if ($cpt) {
65                if ($where) {
66                  include_spip('inc/forum');
67                  list($f, $w) = critere_statut_controle_forum('public');
68                  $q = sql_select("COUNT(*) AS cnt, F.statut", "$f", "$w ", "F.statut");
69                  while($row = sql_fetch($q)) {
70                                $r = $row['statut'];
71                                $cpt2[$r] = intval($row['cnt']) . '/';
72                        }
73                }
74
75                $texte .= "<div class='accueil_informations forum liste'>";
76                $afficher_plus = 'afficher_plus_info';
77                $plus = "";
78                if (!function_exists($afficher_plus))
79                        $afficher_plus = 'afficher_plus';
80                if (autoriser('modererforum'))
81                        $plus = $afficher_plus(generer_url_ecrire("controler_forum",""));
82                $texte .= "<h4>$plus" ._T('forum:onglet_messages_publics') ."</h4>";
83                $texte .= "<ul class='liste-items'>";
84                if (isset($cpt['prop'])) $texte .= "<li class='item'>"._T("texte_statut_attente_validation").": ".$cpt2['prop'] .$cpt['prop'] . '</li>';
85                if (isset($cpt['publie'])) $texte .= "<li class='item on'>"._T("texte_statut_publies").": ".$cpt2['publie'] .$cpt['publie'] .'</li>';
86                $texte .= "</ul>";
87                $texte .= "</div>";
88        }
89        return $texte;
90}
91
92/**
93 * Affichage de la fiche complete des articles et rubriques
94 *
95 * @param array $flux
96 * @return array
97 */
98function forum_afficher_fiche_objet($flux){
99
100        if (in_array($type = $flux['args']['type'],array('article','breve','site'))
101          AND $GLOBALS['meta']['forum_prive_objets'] != 'non'){
102                $id = $flux['args']['id'];
103                $table = table_objet($type);
104                $id_table_objet = id_table_objet($type);
105                $contexte = array_merge($flux['args']['contexte'],
106                        array(
107                                'objet'=>$type,
108                                'id_objet'=>$id,
109                                'quoi'=>'interne',
110                                'statut'=>'prive'
111                        )
112                );
113                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/discuter_forum',$contexte,array('ajax'=>true));
114        }
115        if (($type = $flux['args']['type'])=='rubrique'){
116                $id_rubrique = $flux['args']['id'];
117                if (autoriser('publierdans','rubrique',$id_rubrique)
118                  AND !sql_getfetsel('id_parent','spip_rubriques','id_rubrique='.intval($id_rubrique))) {
119                        include_spip('inc/forum');
120                        list($from, $where) = critere_statut_controle_forum('prop', $id_rubrique);
121                        $n_forums = sql_countsel($from, $where);
122                }
123                else
124                        $n_forums = 0;
125                if ($n_forums)
126                $flux['data'] .= icone_verticale(_T('forum:icone_suivi_forum', array('nb_forums' => $n_forums)), generer_url_ecrire("controler_forum","objet=rubrique&id_objet=$id_rubrique"), "forum-24.png", "", 'center');
127        }
128        return $flux;
129}
130
131/**
132 * Boite de configuration des objets articles
133 *
134 * @param array $flux
135 * @return array
136 */
137function forum_afficher_config_objet($flux){
138        if (($type = $flux['args']['type'])
139                AND $id = $flux['args']['id']){
140                if (autoriser('modererforum', $type, $id)) {
141                        $id_table_objet = id_table_objet($type);
142                        $flux['data'] .= recuperer_fond("prive/objets/configurer/moderation",array('id_objet'=>$id,'objet'=>  objet_type(table_objet($type))));
143                }
144        }
145        return $flux;
146}
147
148/**
149 * Message d'information relatif au statut d'un objet
150 *
151 * @param array $flux
152 * @return array
153 */
154function forum_afficher_message_statut_objet($flux){
155        if ($type = $flux['args']['type']=='article'){
156                $statut = $flux['args']['statut'];
157                if ($GLOBALS['meta']['forum_prive_objets'] != 'non'
158                  AND $statut == 'prop')
159                        $flux['data'] .= "<p class='article_prop'>"._T('forum:text_article_propose_publication_forum').'</p>';
160        }
161        return $flux;
162}
163
164/**
165 * Nombre de forums d'un secteur dans la boite d'info
166 *
167 * @param array $flux
168 * @return array
169 */
170function forum_boite_infos($flux){
171        if ($type = $flux['args']['type']=='rubrique'){
172                if (autoriser('publierdans','rubrique',$id_rubrique) AND !$flux['args']['row']['id_parent']) {
173                        include_spip('inc/forum');
174                        list($from, $where) = critere_statut_controle_forum('prop', $id_rubrique);
175                        $n_forums = sql_countsel($from, $where);
176                }
177                else
178                        $n_forums = 0;
179                if ($n_forums){
180                        $aff = "<p class='forums'>"._T('forum:icone_suivi_forum',array('nb_forums'=>$n_forums)).'</p>';
181                        if (($pos = strpos($flux['data'],'<!--nb_elements-->'))!==FALSE)
182                                $flux['data'] = substr($flux['data'],0,$pos) . $aff . substr($flux['data'],$pos);
183                        else
184                                $flux['data'] .= $aff;
185                }
186        }
187        return $flux;
188}
189
190/**
191 * Compter et afficher les contributions d'un visiteur
192 * pour affichage dans la page auteurs
193 *
194 * @param array $flux
195 * @return array
196 */
197function forum_compter_contributions_auteur($flux){
198        $id_auteur = intval($flux['args']['id_auteur']);
199        if ($cpt = sql_countsel("spip_forum AS F", "F.id_auteur=".intval($flux['args']['id_auteur']))){
200                // manque "1 message de forum"
201                $contributions = singulier_ou_pluriel($cpt,'forum:info_1_message_forum','forum:info_nb_messages_forum');
202                $flux['data'][] = $contributions;
203        }
204        return $flux;
205}
206
207/**
208 * Definir les meta de configuration liee aux forums
209 *
210 * @param array $metas
211 * @return array
212 */
213function forum_configurer_liste_metas($metas){
214        $metas['mots_cles_forums'] =  'non';
215        $metas['forums_titre'] = 'oui';
216        $metas['forums_texte'] = 'oui';
217        $metas['forums_urlref'] = 'non';
218        $metas['forums_afficher_barre'] = 'oui';
219        $metas['formats_documents_forum'] = '';
220        $metas['forums_publics'] = 'posteriori';
221        $metas['forum_prive'] = 'oui'; # forum global dans l'espace prive
222        $metas['forum_prive_objets'] = 'oui'; # forum sous chaque article de l'espace prive
223        $metas['forum_prive_admin'] = 'non'; # forum des administrateurs
224
225        return $metas;
226}
227
228
229
230/**
231 * Optimiser la base de donnee en supprimant les forums orphelins
232 *
233 * @param int $n
234 * @return int
235 */
236function forum_optimiser_base_disparus($flux){
237        $n = &$flux['data'];
238        $mydate = $flux['args']['date'];
239
240        # les forums lies a une id_objet inexistant
241        $r = sql_select("DISTINCT objet",'spip_forum');
242        while ($t = sql_fetch($r)){
243                $type = $t['objet'];
244                $spip_table_objet = table_objet_sql($type);
245                $id_table_objet = id_table_objet($type);       
246                # les forums lies a un objet inexistant
247                $res = sql_select("forum.id_forum AS id",
248                                                "spip_forum AS forum
249                                                        LEFT JOIN $spip_table_objet AS O
250                                                                ON O.$id_table_objet=forum.id_objet AND forum.objet=".sql_quote($type),
251                                "O.$id_table_objet IS NULL AND forum.id_objet>0");
252
253        $n+= optimiser_sansref('spip_forum', 'id_forum', $res);
254        }
255
256       
257        //
258        // Forums
259        //
260
261        sql_delete("spip_forum", "statut='redac' AND maj < $mydate");
262
263        // nettoyer les documents des forums en spam&poubelle pour eviter de sortir des quota disques
264        // bizarrement on ne nettoie jamais les messages eux meme ?
265        include_spip('action/editer_liens');
266        if (objet_associable('document')){
267                $res = sql_select('L.id_document,F.id_forum',"spip_documents_liens AS L JOIN spip_forum AS F ON (F.id_forum=L.id_objet AND L.objet='forum')","F.statut IN ('off','spam')");
268                while ($row = sql_fetch($res)){
269                        include_spip('inc/autoriser');
270                        // si un seul lien (ce forum donc), on supprime le document
271                        // si un document est attache a plus d'un forum, c'est un cas bizarre ou gere a la main
272                        // on ne touche a rien !
273                        if (count(objet_trouver_liens(array('document'=>$row['id_document']),'*'))==1){
274                                autoriser_exception('supprimer','document',$row['id_document']);
275                                if ($supprimer_document = charger_fonction('supprimer_document','action',true))
276                                        $supprimer_document($row['id_document']);
277                        }
278                }
279        }
280
281
282        //
283        // CNIL -- Informatique et libertes
284        //
285        // masquer le numero IP des vieux forums
286        //
287        ## date de reference = 4 mois
288        ## definir a 0 pour desactiver
289        define('_CNIL_PERIODE', 3600*24*31*4);
290
291        if (_CNIL_PERIODE) {
292                $critere_cnil = 'date_heure<"'.date('Y-m-d', time()-_CNIL_PERIODE).'"'
293                        . ' AND statut != "spam"'
294                        . ' AND (ip LIKE "%.%" OR ip LIKE "%:%")'; # ipv4 ou ipv6
295
296                $c = sql_countsel('spip_forum', $critere_cnil);
297
298                if ($c>0) {
299                        spip_log("CNIL: masquer IP de $c forums anciens");
300                        sql_update('spip_forum', array('ip' => 'MD5(ip)'), $critere_cnil);
301                }
302        }
303
304        return $flux;
305
306}
307
308
309/**
310 * Remplissage des champs a la creation d'objet
311 *
312 * @param array $flux
313 * @return array
314 */
315function forum_pre_insertion($flux){
316        if ($flux['args']['table']=='spip_articles'){
317                $flux['args']['data']['accepter_forum'] =       substr($GLOBALS['meta']['forums_publics'],0,3);
318        }
319        return $flux;
320}
321
322/**
323 * Regrouper les resultats de recherche par threads
324 * sauf si {plat} est present
325 *
326 * @param array $flux
327 * @return array
328 */
329function forum_prepare_recherche($flux){
330        # Pour les forums, unifier par id_thread et forcer statut='publie'
331        if ($flux['args']['type']=='forum'
332          AND $points = $flux['data']){
333          $serveur =  $flux['args']['serveur'];
334          $modificateurs = (isset($flux['args']['modificateurs'])?$flux['args']['modificateurs']:array());
335
336          // pas de groupe par thread si {plat}
337          if (!isset($modificateurs['plat'])){
338                        $p2 = array();
339                        // si critere statut dans la boucle, ne pas filtrer par statut publie ici
340                        $cond = (isset($modificateurs['criteres']['statut'])?"":"statut='publie' AND ");
341                        $s = sql_select("id_thread, id_forum", "spip_forum", $cond.sql_in('id_forum', array_keys($points)), '','','','',$serveur);
342                        while ($t = sql_fetch($s, $serveur))
343                                $p2[intval($t['id_thread'])]['score']
344                                        += $points[intval($t['id_forum'])]['score'];
345                        $flux['data'] = $p2;
346          }
347        }
348        return $flux;
349}
350
351
352/**
353 * Bloc en sur les encours d'une rubrique (page naviguer)
354 *
355 * @param array $flux
356 * @return array
357 */
358function forum_rubrique_encours($flux){
359        if (strlen($flux['data'])
360          AND $GLOBALS['meta']['forum_prive_objets'] != 'non')
361                $flux['data'] = _T('forum:texte_en_cours_validation_forum') . $flux['data'];
362        return $flux;
363}
364
365/**
366 * Supprimer les forums lies aux objets du core lors de leur suppression
367 *
368 * @param array $objets
369 * @return array
370 */
371function forum_trig_supprimer_objets_lies($objets){
372        foreach($objets as $objet){
373                if ($objet['type']=='message')
374                        sql_delete("spip_forum", "id_message=".intval($objet['id']));
375        }
376        return $objets;
377}
378
379/**
380 * Ajouter jquery.autosave.js
381 * (Uniquement pour SPIP 2.1, par defaut dans SPIP 2.2)
382 * @param unknown_type $array
383 */
384function forum_jquery_plugins($array){
385        if(!in_array('javascript/jquery.autosave.js',$array)){
386                $array[] = 'javascript/jquery.autosave.js';
387        }
388        return $array;
389}
390?>
Note: See TracBrowser for help on using the repository browser.