source: spip-zone/_core_/branches/spip-2.1/plugins/forum/forum_pipelines.php @ 93500

Last change on this file since 93500 was 93500, checked in by pierre.fiches@…, 5 years ago

Annuler le commit précédent sur les espaces insécables.
C'est probablement sur la chaine de langue qu'il faut intervenir.
Elle est dans ecrire_fr.php, ne faudrait-il pas la déplacer dans le plugin forum
texte_statut_publies
texte_statut_attente_validation
?

File size: 12.8 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2014                                                *
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('info_liens_syndiques_3')." "._T('info_liens_syndiques_4');
28                        else
29                                $lien = _T('info_liens_syndiques_5')." "._T('info_liens_syndiques_6');
30                        $lien = "<small>$cpt $lien " ._T('info_liens_syndiques_7'). "</small>";
31                        if ($GLOBALS['connect_toutes_rubriques'])
32                                $lien = "<a href='" . generer_url_ecrire("controle_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('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 verdana1'>";
76                $afficher_plus = 'afficher_plus_info';
77                if (!function_exists($afficher_plus))
78                        $afficher_plus = 'afficher_plus';
79                if (autoriser('modererforum'))
80                        $texte .= $afficher_plus(generer_url_ecrire("controle_forum",""));
81                $texte .= "<b>" ._T('onglet_messages_publics') ."</b>";
82                $texte .= "<ul style='margin:0px; padding-".$GLOBALS['spip_lang_left'].": 20px; margin-bottom: 5px;'>";
83                if (isset($cpt['prop'])) $texte .= "<li>"._T("texte_statut_attente_validation").": ".$cpt2['prop'] .$cpt['prop'] . '</li>';
84                if (isset($cpt['publie'])) $texte .= "<li><b>"._T("texte_statut_publies").": ".$cpt2['publie'] .$cpt['publie'] . "</b>" .'</li>';
85                $texte .= "</ul>";
86                $texte .= "</div>";
87        }
88        return $texte;
89}
90
91/**
92 * Affichage de la fiche complete des articles et rubriques
93 *
94 * @param array $flux
95 * @return array
96 */
97function forum_afficher_fiche_objet($flux){
98
99        if (in_array($type = $flux['args']['type'],array('article','breve','site'))){
100                $id = $flux['args']['id'];
101                $table = table_objet($type);
102                $id_table_objet = id_table_objet($type);
103                $discuter = charger_fonction('discuter', 'inc');
104                $flux['data'] .= $discuter($id, $table, $id_table_objet, 'prive', _request('debut'));
105        }
106        if (($type = $flux['args']['type'])=='rubrique'){
107                $id_rubrique = $flux['args']['id'];
108                if (autoriser('publierdans','rubrique',$id_rubrique)
109                  AND !sql_getfetsel('id_parent','spip_rubriques','id_rubrique='.intval($id_rubrique))) {
110                        include_spip('inc/forum');
111                        list($from, $where) = critere_statut_controle_forum('prop', $id_rubrique);
112                        $n_forums = sql_countsel($from, $where);
113                }
114                else
115                        $n_forums = 0;
116                if ($n_forums)
117                $flux['data'] .= icone_inline(_T('icone_suivi_forum', array('nb_forums' => $n_forums)), generer_url_ecrire("controle_forum","objet=rubrique&id_objet=$id_rubrique"), "forum-24.png", "", 'center');
118        }
119        return $flux;
120}
121
122/**
123 * Boite de configuration des objets articles
124 *
125 * @param array $flux
126 * @return array
127 */
128function forum_afficher_config_objet($flux){
129        if (($type = $flux['args']['type'])
130                AND $id = $flux['args']['id']){
131                if (autoriser('modererforum', $type, $id)) {
132                        $id_table_objet = id_table_objet($type);
133                        $flux['data'] .= recuperer_fond("prive/configurer/moderation",array('id_objet'=>$id,'objet'=>  objet_type(table_objet($type))));
134                }
135        }
136        return $flux;
137}
138
139/**
140 * Message d'information relatif au statut d'un objet
141 *
142 * @param array $flux
143 * @return array
144 */
145function forum_afficher_message_statut_objet($flux){
146        if ($type = $flux['args']['type']=='article'){
147                $statut = $flux['args']['statut'];
148                if ($GLOBALS['meta']['forum_prive_objets'] != 'non'
149                  AND $statut == 'prop')
150                        $flux['data'] .= "<p class='article_prop'>"._T('text_article_propose_publication_forum').'</p>';
151        }
152        return $flux;
153}
154
155/**
156 * Nombre de forums d'un secteur dans la boite d'info
157 *
158 * @param array $flux
159 * @return array
160 */
161function forum_boite_infos($flux){
162        if ($type = $flux['args']['type']=='rubrique'){
163                if (autoriser('publierdans','rubrique',$id_rubrique) AND !$flux['args']['row']['id_parent']) {
164                        include_spip('inc/forum');
165                        list($from, $where) = critere_statut_controle_forum('prop', $id_rubrique);
166                        $n_forums = sql_countsel($from, $where);
167                }
168                else
169                        $n_forums = 0;
170                if ($n_forums){
171                        $aff = "<p class='forums'>"._T('icone_suivi_forum',array('nb_forums'=>$n_forums)).'</p>';
172                        if (($pos = strpos($flux['data'],'<!--nb_elements-->'))!==FALSE)
173                                $flux['data'] = substr($flux['data'],0,$pos) . $aff . substr($flux['data'],$pos);
174                        else
175                                $flux['data'] .= $aff;
176                }
177        }
178        return $flux;
179}
180
181/**
182 * Compter et afficher les contributions d'un visiteur
183 * pour affichage dans la page auteurs
184 *
185 * @param array $flux
186 * @return array
187 */
188function forum_compter_contributions_auteur($flux){
189        $id_auteur = intval($flux['args']['id_auteur']);
190        if ($cpt = sql_countsel("spip_forum AS F", "F.id_auteur=".intval($flux['args']['id_auteur']))){
191                // manque "1 message de forum"
192                $contributions = singulier_ou_pluriel($cpt,'forum:info_1_message_forum','forum:info_nb_messages_forum');
193                $flux['data'][] = $contributions;
194        }
195        return $flux;
196}
197
198/**
199 * Definir les meta de configuration liee aux forums
200 *
201 * @param array $metas
202 * @return array
203 */
204function forum_configurer_liste_metas($metas){
205        $metas['mots_cles_forums'] =  'non';
206        $metas['forums_titre'] = 'oui';
207        $metas['forums_texte'] = 'oui';
208        $metas['forums_urlref'] = 'non';
209        $metas['forums_afficher_barre'] = 'oui';
210        $metas['formats_documents_forum'] = '';
211        $metas['forums_publics'] = 'posteriori';
212        $metas['forum_prive'] = 'oui'; # forum global dans l'espace prive
213        $metas['forum_prive_objets'] = 'oui'; # forum sous chaque article de l'espace prive
214        $metas['forum_prive_admin'] = 'non'; # forum des administrateurs
215
216        return $metas;
217}
218
219/**
220 * Declarer le surnom des forums
221 *
222 * @param array $table
223 * @return array
224 */
225function forum_declarer_tables_objets_surnoms($table){
226        $table['forum'] = 'forums'; # hum hum redevient spip_forum par table_objet_sql mais casse par un bete "spip_".table_objet()
227        return $table;
228}
229
230
231
232/**
233 * Optimiser la base de donnee en supprimant les forums orphelins
234 *
235 * @param int $n
236 * @return int
237 */
238function forum_optimiser_base_disparus($flux){
239        $n = &$flux['data'];
240        $mydate = $flux['args']['date'];
241
242        # les forums lies a une id_rubrique inexistante
243        $res = sql_select("forum.id_forum AS id",
244                        "spip_forum AS forum
245                        LEFT JOIN spip_rubriques AS rubriques
246                          ON forum.objet='rubrique' AND rubriques.id_rubrique=forum.id_objet",
247                        "rubriques.id_rubrique IS NULL
248                         AND forum.objet='rubrique' AND forum.id_objet>0");
249
250        $n+= optimiser_sansref('spip_forum', 'id_forum', $res);
251
252
253        # les forums lies a des articles effaces
254        $res = sql_select("forum.id_forum AS id",
255                        "spip_forum AS forum
256                        LEFT JOIN spip_articles AS articles
257                                ON forum.objet='article' AND articles.id_article=forum.id_objet",
258                                "articles.id_article IS NULL
259                                        AND forum.objet='article' AND forum.id_objet>0");
260
261        $n+= optimiser_sansref('spip_forum', 'id_forum', $res);
262
263        # les forums lies a des breves effacees
264        $res = sql_select("forum.id_forum AS id",
265                        "spip_forum AS forum
266                        LEFT JOIN spip_breves AS breves
267                                ON forum.objet='breve' AND breves.id_breve=forum.id_objet",
268                                "breves.id_breve IS NULL
269                                        AND forum.objet='breve' AND forum.id_objet>0");
270
271        $n+= optimiser_sansref('spip_forum', 'id_forum', $res);
272
273
274        # les forums lies a des sites effaces
275        $res = sql_select("forum.id_forum AS id",
276                        "spip_forum AS forum
277                        LEFT JOIN spip_syndic AS syndic
278                                ON forum.objet='syndic' AND syndic.id_syndic=forum.id_objet",
279                        "syndic.id_syndic IS NULL
280                         AND forum.objet='syndic' AND forum.id_objet>0");
281
282        $n+= optimiser_sansref('spip_forum', 'id_forum', $res);
283
284
285        # les liens mots-forum sur des mots effaces
286        $res = sql_select("mots_forum.id_mot AS id",
287                        "spip_mots_forum AS mots_forum
288                        LEFT JOIN spip_mots AS mots
289                          ON mots_forum.id_mot=mots.id_mot",
290                        "mots.id_mot IS NULL");
291
292        $n+= optimiser_sansref('spip_mots_forum', 'id_mot', $res);
293
294        //
295        // Forums
296        //
297
298        sql_delete("spip_forum", "statut='redac' AND maj < $mydate");
299
300
301        # les liens mots-forum sur des forums effaces
302        $res = sql_select("mots_forum.id_forum AS id",
303                        "spip_mots_forum AS mots_forum
304                        LEFT JOIN spip_forum AS forum
305                          ON mots_forum.id_forum=forum.id_forum",
306                        "forum.id_forum IS NULL");
307
308        $n+= optimiser_sansref('spip_mots_forum', 'id_forum', $res);
309
310
311        //
312        // CNIL -- Informatique et libertes
313        //
314        // masquer le numero IP des vieux forums
315        //
316        ## date de reference = 4 mois
317        ## definir a 0 pour desactiver
318        define('_CNIL_PERIODE', 3600*24*31*4);
319
320        if (_CNIL_PERIODE) {
321                $critere_cnil = 'date_heure<"'.date('Y-m-d', time()-_CNIL_PERIODE).'"'
322                        . ' AND statut != "spam"'
323                        . ' AND (ip LIKE "%.%" OR ip LIKE "%:%")'; # ipv4 ou ipv6
324
325                $c = sql_countsel('spip_forum', $critere_cnil);
326
327                if ($c>0) {
328                        spip_log("CNIL: masquer IP de $c forums anciens");
329                        sql_update('spip_forum', array('ip' => 'MD5(ip)'), $critere_cnil);
330                }
331        }
332
333        return $flux;
334
335}
336
337
338/**
339 * Remplissage des champs a la creation d'objet
340 *
341 * @param array $flux
342 * @return array
343 */
344function forum_pre_insertion($flux){
345        if ($flux['args']['table']=='spip_articles'){
346                $flux['args']['data']['accepter_forum'] =       substr($GLOBALS['meta']['forums_publics'],0,3);
347        }
348        return $flux;
349}
350
351/**
352 * Regrouper les resultats de recherche par threads
353 *
354 * @param array $flux
355 * @return array
356 */
357function forum_prepare_recherche($flux){
358        # Pour les forums, unifier par id_thread et forcer statut='publie'
359        if ($flux['args']['type']=='forum'
360          AND $points = $flux['data']){
361          $serveur =  $flux['args']['serveur'];
362                $p2 = array();
363                $s = sql_select("id_thread, id_forum", "spip_forum", "statut='publie' AND ".sql_in('id_forum', array_keys($points)), '','','','',$serveur);
364                while ($t = sql_fetch($s, $serveur))
365                        $p2[intval($t['id_thread'])]['score']
366                                += $points[intval($t['id_forum'])]['score'];
367                $flux['data'] = $p2;
368        }
369        return $flux;
370}
371
372
373/**
374 * Definir la liste des champs de recherche sur la table forum
375 *
376 * @param array $liste
377 * @return array
378 */
379function forum_rechercher_liste_des_champs($liste){
380        $liste['forum'] = array(
381          'titre' => 3, 'texte' => 1, 'auteur' => 2, 'email_auteur' => 2, 'nom_site' => 1, 'url_site' => 1
382        );
383
384        return $liste;
385}
386
387/**
388 * Bloc en sur les encours d'une rubrique (page naviguer)
389 *
390 * @param array $flux
391 * @return array
392 */
393function forum_rubrique_encours($flux){
394        if (strlen($flux['data'])
395          AND $GLOBALS['meta']['forum_prive_objets'] != 'non')
396                $flux['data'] = _T('texte_en_cours_validation_forum') . $flux['data'];
397        return $flux;
398}
399
400/**
401 * Supprimer les forums lies aux objets du core lors de leur suppression
402 *
403 * @param array $objets
404 * @return array
405 */
406function forum_trig_supprimer_objets_lies($objets){
407        foreach($objets as $objet){
408                if ($objet['type']=='message')
409                        sql_delete("spip_forum", "id_message=".sql_quote($objet['id']));
410                if ($objet['type']=='mot')
411                        sql_delete("spip_mots_forum", "id_mot=".intval($objet['id']));
412        }
413        return $objets;
414}
415
416/**
417 * Ajouter jquery.autosave.js
418 * (Uniquement pour SPIP 2.1, par defaut dans SPIP 2.2)
419 * @param unknown_type $array
420 */
421function forum_jquery_plugins($array){
422        if(!in_array('javascript/jquery.autosave.js',$array)){
423                $array[] = 'javascript/jquery.autosave.js';
424        }
425        return $array;
426}
427?>
Note: See TracBrowser for help on using the repository browser.