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

Last change on this file since 93640 was 93640, checked in by marcimat@…, 5 years ago

Meilleure compatibilité avec PSR-2 et nos règles d'écriture, en appliquant
différents fix avec php-cs-fixers. Fixers appliqués ici :

'encoding', utf8
'eof_ending',
un saut de ligne en fin de fichier
'elseif', elseif plutôt que else if
'function_call_space',
espaces sur fonctions
'function_declaration', espaces sur fonctions
'function_typehint_space',
espaces sur fonctions
'linefeed', sauts de ligne \n uniquement
'lowercase_constants',
true, false, null en munuscule
'lowercase_keywords', mots clés PHP en lowercase
'method_argument_space',
espaces sur appels de fonctions
'multiple_use', use unique sur fonctions anonymes
'newline_after_open_tag',
ouverture de php… et c'est tout sur cette ligne
'operators_spaces', espaces de part et d'autres des opérateurs binaires
'parenthesis',
pas d'espace juste après parenthèse ouvrante, ou avant parenthèse fermante
'php_closing_tag', pas de fermeture de php
'short_tag',
tag PHP corrects
'trailing_spaces', pas d'espace qui traîne en fin de ligne
'visibility',
déclarer 'public / private / protected' sur les méthodes

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