2128c94d0520d96af4938bbbc5c37484b6566cbe
[lhc/web/www.git] / www / plugins-dist / forum / inc / forum_insert.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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")) {
14 return;
15 }
16 include_spip('inc/forum');
17 include_spip('inc/filtres');
18 include_spip('inc/actions');
19
20 // Ce fichier est inclus par dist/formulaires/forum.php
21
22 // https://code.spip.net/@mots_du_forum
23 function mots_du_forum($ajouter_mot, $id_message) {
24 include_spip('action/editer_mot');
25 mot_associer($ajouter_mot, array('forum' => $id_message));
26 }
27
28
29 // https://code.spip.net/@tracer_erreur_forum
30 function tracer_erreur_forum($type = '') {
31 spip_log("erreur forum ($type): " . print_r($_POST, true));
32
33 define('_TRACER_ERREUR_FORUM', false);
34 if (_TRACER_ERREUR_FORUM) {
35 $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
36 $envoyer_mail($GLOBALS['meta']['email_webmaster'], "erreur forum ($type)",
37 "erreur sur le forum ($type) :\n\n" .
38 '$_POST = ' . print_r($_POST, true) . "\n\n" .
39 '$_SERVER = ' . print_r($_SERVER, true));
40 }
41 }
42
43 /**
44 * Un parametre permet de forcer le statut (exemple: plugin antispam)
45 *
46 * https://code.spip.net/@inc_forum_insert_dist
47 *
48 * @param $objet
49 * @param $id_objet
50 * @param $id_forum
51 * en reponse a
52 * @param null $force_statut
53 * @return bool
54 */
55 function inc_forum_insert_dist($objet, $id_objet, $id_forum, $force_statut = null) {
56
57 if (!in_array($force_statut, array('privrac', 'privadm'))) {
58 if (!strlen($objet)
59 or !intval($id_objet)
60 ) {
61 spip_log("Erreur insertion forum sur objet='$objet', id_objet=$id_objet", 'forum.' . _LOG_ERREUR);
62
63 return 0;
64 }
65 }
66 spip_log("insertion de forum $force_statut sur $objet $id_objet (+$id_forum)", 'forum');
67
68
69 include_spip('inc/filtres');
70 include_spip('inc/modifier');
71 include_spip('inc/session');
72 $champs = objet_info('forum', 'champs_editables');
73 $c = collecter_requests($champs, array());
74
75 $c['statut'] = 'off';
76 $c['objet'] = $objet;
77 $c['id_objet'] = $id_objet;
78 $c['auteur'] = sinon(session_get('nom'), session_get('session_nom'));
79 $c['email_auteur'] = sinon(session_get('email'), session_get('session_email'));
80
81 $c = pipeline('pre_edition', array(
82 'args' => array(
83 'table' => 'spip_forum',
84 'id_objet' => $id_forum,
85 'action' => 'instituer'
86 ),
87 'data' => forum_insert_statut($c, $force_statut)
88 ));
89
90 $id_reponse = forum_insert_base($c, $id_forum, $objet, $id_objet, $c['statut'], _request('ajouter_mot'));
91
92 if (!$id_reponse) {
93 spip_log("Echec insertion forum sur $objet $id_objet (+$id_forum)", 'forum.' . _LOG_ERREUR);
94 } else {
95 spip_log("forum insere' $id_reponse sur $objet $id_objet (+$id_forum)", 'forum');
96 }
97
98 return $id_reponse;
99
100 }
101
102 // https://code.spip.net/@forum_insert_base
103 function forum_insert_base($c, $id_forum, $objet, $id_objet, $statut, $ajouter_mot = false) {
104
105 if (!in_array($statut, array('privrac', 'privadm'))) {
106 // si le statut est vide, c'est qu'on ne veut pas de ce presume spam !
107 if (!$statut or !$objet or !$id_objet) {
108 $args = func_get_args();
109 spip_log("Erreur sur forum_insert_base " . var_export($args, 1), 'forum.' . _LOG_ERREUR);
110
111 return false;
112 }
113 }
114
115 // Entrer le message dans la base
116 $id_reponse = sql_insertq('spip_forum', array(
117 'date_heure' => date('Y-m-d H:i:s'),
118 'ip' => $GLOBALS['ip'],
119 'id_auteur' => $GLOBALS['visiteur_session']['id_auteur']
120 ));
121
122 if ($id_reponse) {
123 if ($id_forum > 0) {
124 $id_thread = sql_getfetsel("id_thread", "spip_forum", "id_forum =" . intval($id_forum));
125 } else {
126 $id_thread = $id_reponse;
127 } # id_thread oblige INSERT puis UPDATE.
128
129 // Entrer les cles
130 sql_updateq('spip_forum', array(
131 'id_parent' => $id_forum,
132 'objet' => $objet,
133 'id_objet' => $id_objet,
134 'id_thread' => $id_thread,
135 'statut' => $statut
136 ), "id_forum=" . intval($id_reponse));
137
138 // Entrer les mots-cles associes
139 if ($ajouter_mot) {
140 mots_du_forum($ajouter_mot, $id_reponse);
141 }
142
143 //
144 // Entree du contenu et invalidation des caches
145 //
146 include_spip('action/editer_forum');
147 revision_forum($id_reponse, $c);
148
149 // Ajouter un document
150 if (isset($_FILES['ajouter_document'])
151 and $_FILES['ajouter_document']['tmp_name']
152 ) {
153 $files[] = array(
154 'tmp_name' => $_FILES['ajouter_document']['tmp_name'],
155 'name' => $_FILES['ajouter_document']['name']
156 );
157 $ajouter_documents = charger_fonction('ajouter_documents', 'action');
158 $ajouter_documents(
159 'new',
160 $files,
161 'forum',
162 $id_reponse,
163 'document');
164 // supprimer le temporaire et ses meta donnees
165 spip_unlink($_FILES['ajouter_document']['tmp_name']);
166 spip_unlink(preg_replace(',\.bin$,',
167 '.txt', $_FILES['ajouter_document']['tmp_name']));
168 }
169
170 // Notification
171 $quoi = (strncmp($statut, 'priv', 4) == 0 ? 'forumprive' : 'forumposte');
172 if ($notifications = charger_fonction('notifications', 'inc')) {
173 $notifications($quoi, $id_reponse);
174 }
175 }
176
177 return $id_reponse;
178 }
179
180
181 // https://code.spip.net/@forum_insert_statut
182 function forum_insert_statut($champs, $forcer_statut = null) {
183 include_spip('inc/forum');
184 $statut = controler_forum($champs['objet'], $champs['id_objet']);
185
186 if ($forcer_statut !== null) {
187 $champs['statut'] = $forcer_statut;
188 } else {
189 $champs['statut'] = ($statut == 'non') ? 'off' : (($statut == 'pri') ? 'prop' : 'publie');
190 }
191
192 return $champs;
193 }