[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / forum / forum_pipelines.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
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
19 if (!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 */
29 function 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 */
65 function 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 */
118 function 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 */
161 function 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 */
181 function 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 */
200 function 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><a href="' . generer_url_ecrire('controler_forum', 'id_auteur='.$id_auteur) . '">' . singulier_ou_pluriel($nb, "forum:info_1_message_forum",
228 'forum:info_nb_messages_forum') . '</a></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 */
245 function 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 */
262 function 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 */
285 function 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 */
366 function 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 */
381 function 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 $res = sql_allfetsel(
395 array("id_thread, id_forum"),
396 'spip_forum',
397 $cond . sql_in('id_forum', array_keys($points)),
398 '', '', '', '', $serveur
399 );
400 if ($res) {
401 foreach ($res as $t) {
402 $id_thread = intval($t['id_thread']);
403 if (empty($p2[$id_thread])) {
404 $p2[$id_thread] = array('score' => 0);
405 }
406 $p2[$id_thread]['score'] += $points[intval($t['id_forum'])]['score'];
407 }
408 }
409 $flux['data'] = $p2;
410 }
411 }
412
413 return $flux;
414 }
415
416
417 /**
418 * Bloc en sur les encours d'une rubrique (page naviguer)
419 *
420 * @param array $flux
421 * @return array
422 */
423 function forum_rubrique_encours($flux) {
424 if (strlen($flux['data'])
425 and $GLOBALS['meta']['forum_prive_objets'] != 'non'
426 ) {
427 $flux['data'] = _T('forum:texte_en_cours_validation_forum') . $flux['data'];
428 }
429
430 return $flux;
431 }
432
433 /**
434 * Supprimer les forums lies aux objets du core lors de leur suppression
435 *
436 * @param array $objets
437 * @return array
438 */
439 function forum_trig_supprimer_objets_lies($objets) {
440 foreach ($objets as $objet) {
441 if ($objet['type'] == 'message') {
442 sql_delete("spip_forum", "id_message=" . intval($objet['id']));
443 }
444 if (!sql_countsel(table_objet_sql($objet['type']), id_table_objet($objet['type']) . "=" . intval($objet['id']))) {
445 sql_delete("spip_forum", array("id_objet=" . intval($objet['id']), "objet=" . sql_quote($objet['type'])));
446 }
447 }
448
449 return $objets;
450 }