1 | <?php |
---|
2 | |
---|
3 | if (!defined("_ECRIRE_INC_VERSION")) return; |
---|
4 | |
---|
5 | include_spip('inc/config'); |
---|
6 | include_spip('configurer/pipelines'); |
---|
7 | |
---|
8 | function formulaires_contact_charger_dist($id_auteur='',$tracer=''){ |
---|
9 | $valeurs = array(); |
---|
10 | |
---|
11 | $valeurs['destinataire'] = array(); |
---|
12 | $valeurs['choix_destinataires'] = ''; |
---|
13 | |
---|
14 | // La liste dans laquelle on pourra éventuellement choisir |
---|
15 | $choix_destinataires = ($tmp = lire_config('contact/choix_destinataires')) ? $tmp : array(); |
---|
16 | $choix_destinataires = array_map('intval',$choix_destinataires); |
---|
17 | |
---|
18 | // tableau des type_choix necessitant la prise en compte de $id_auteur |
---|
19 | $t_c = array('tous_et', 'tous_ou', 'un_et', 'un_ou', 'plusieurs_et', 'plusieurs_ou'); |
---|
20 | $valeurs['type_choix'] = $type_choix = lire_config('contact/type_choix'); |
---|
21 | if( in_array($type_choix,$t_c) ){ |
---|
22 | if(!is_array($id_auteur)){ |
---|
23 | $id_auteur = explode(',',$id_auteur); |
---|
24 | if(!is_numeric($id_auteur[0]))$id_auteur=array(); |
---|
25 | } |
---|
26 | } |
---|
27 | |
---|
28 | $nb_d = count($choix_destinataires); |
---|
29 | // Rien n'a été défini, on utilise l'auteur 1 |
---|
30 | if ($nb_d == 0){ |
---|
31 | $valeurs['destinataire'][] = 1; |
---|
32 | }else{ |
---|
33 | $valeurs['destinataire'] = $choix_destinataires; |
---|
34 | } |
---|
35 | |
---|
36 | if ($type_choix == 'tous_ou' and $id_auteur){ |
---|
37 | $valeurs['destinataire'] = $id_auteur; |
---|
38 | }else if ($type_choix == 'tous_et' and $id_auteur){ |
---|
39 | $valeurs['destinataire'] = array_unique(array_merge($valeurs['destinataire'],$id_auteur)); |
---|
40 | }else if (($type_choix == 'un' or $type_choix == 'plusieurs') and $nb_d>1){ |
---|
41 | $valeurs['choix_destinataires'] = $valeurs['destinataire']; |
---|
42 | }else if ($type_choix == 'un_et' or $type_choix == 'plusieurs_et'){ |
---|
43 | $c_d = array_unique(array_merge($valeurs['destinataire'],$id_auteur)); |
---|
44 | if(count($c_d)>1){ |
---|
45 | $valeurs['choix_destinataires'] = $c_d; |
---|
46 | }else{ |
---|
47 | $valeurs['destinataire'] = $c_d; |
---|
48 | } |
---|
49 | }else if ($type_choix == 'un_ou' or $type_choix == 'plusieurs_ou'){ |
---|
50 | if(count($id_auteur)>1){ |
---|
51 | $valeurs['choix_destinataires'] = $id_auteur; |
---|
52 | }elseif(count($id_auteur)==1){ |
---|
53 | $valeurs['destinataire'] = $id_auteur; |
---|
54 | }elseif(count($valeurs['destinataire'])>1){ |
---|
55 | $valeurs['choix_destinataires'] = $valeurs['destinataire']; |
---|
56 | } |
---|
57 | } |
---|
58 | $valeurs['destinataire_selection'] = _request('destinataire'); |
---|
59 | |
---|
60 | // Les infos supplémentaires |
---|
61 | $champs_possibles = contact_infos_supplementaires(); |
---|
62 | $champs_mini_config = array('mail', 'sujet', 'texte'); |
---|
63 | |
---|
64 | $champs_choisis = lire_config('contact/champs',$champs_mini_config); |
---|
65 | |
---|
66 | // On envoie un tableau contenant tous les champs choisis et leur titre |
---|
67 | // DANS L'ORDRE de ce qu'on a récupéré de CFG |
---|
68 | $champs_choisis = array_flip($champs_choisis); |
---|
69 | foreach ($champs_choisis as $cle => $valeur){ |
---|
70 | $champs_choisis[$cle] = $champs_possibles[$cle]; |
---|
71 | } |
---|
72 | $valeurs['_champs'] = $champs_choisis; |
---|
73 | // Mais aussi tous les champs un par un |
---|
74 | $valeurs = array_merge( |
---|
75 | $valeurs, |
---|
76 | array_map( |
---|
77 | create_function('', 'return "";'), |
---|
78 | $champs_choisis |
---|
79 | ) |
---|
80 | ); |
---|
81 | |
---|
82 | |
---|
83 | $valeurs['_obligatoires'] = $champs_obligatoires = lire_config('contact/obligatoires',$champs_mini_config); |
---|
84 | |
---|
85 | // Infos sur l'ajout de pièces jointes ou non |
---|
86 | $autoriser_pj = (lire_config('contact/autoriser_pj') == 'true'); |
---|
87 | $valeurs['autoriser_pj'] = $autoriser_pj; |
---|
88 | |
---|
89 | // Si on autorise les pièces jointes, on regarde quel est le nombre max de pj. |
---|
90 | if ($autoriser_pj) { |
---|
91 | $nb_max_pj = lire_config('contact/nb_max_pj'); |
---|
92 | $valeurs['nb_max_pj'] = $nb_max_pj; |
---|
93 | // On pré-remplit un tableau pour pouvoir boucler dessus le bon nombre de fois |
---|
94 | $valeurs['pj_fichiers'] = array_fill(0, $nb_max_pj, ''); |
---|
95 | } |
---|
96 | |
---|
97 | //Sert à stocker les informations des fichiers plus ou moins bien uploadés lorsqu'il y a des erreurs. |
---|
98 | $valeurs['pj_nom_enregistrees'] = array(); |
---|
99 | $valeurs['pj_cle_enregistrees'] = array(); |
---|
100 | $valeurs['pj_mime_enregistrees'] = array(); |
---|
101 | |
---|
102 | return $valeurs; |
---|
103 | } |
---|
104 | |
---|
105 | function formulaires_contact_verifier_dist($id_auteur='',$tracer=''){ |
---|
106 | $erreurs = array(); |
---|
107 | include_spip('inc/filtres'); |
---|
108 | include_spip('inc/documents'); |
---|
109 | include_spip('inc/charsets'); |
---|
110 | if($tracer){ |
---|
111 | $trace=explode('-',$tracer); |
---|
112 | if( !(count($trace)==2) or !(intval($trace[1])>0) ){ |
---|
113 | $erreurs['message_erreur'] = 'Une erreur de transmission s\'est produite, merci de renouveller vôtre demande.'; |
---|
114 | } |
---|
115 | } |
---|
116 | if (!_request('destinataire')) |
---|
117 | $erreurs['destinataire'] = _T("info_obligatoire"); |
---|
118 | if (!$adres = _request('mail')) |
---|
119 | $erreurs['mail'] = _T("info_obligatoire"); |
---|
120 | elseif(!email_valide($adres)) |
---|
121 | $erreurs['mail'] = _T('form_prop_indiquer_email'); |
---|
122 | |
---|
123 | $champs_mini_config = array('mail', 'sujet', 'texte'); |
---|
124 | $champs_choisis = lire_config('contact/champs',$champs_mini_config ); |
---|
125 | $champs_obligatoires = lire_config('contact/obligatoires',$champs_mini_config); |
---|
126 | if (is_array($champs_choisis) and is_array($champs_obligatoires)){ |
---|
127 | foreach($champs_choisis as $champ){ |
---|
128 | if (!_request($champ) and in_array($champ, $champs_obligatoires)) |
---|
129 | $erreurs[$champ] = _T("info_obligatoire"); |
---|
130 | } |
---|
131 | } |
---|
132 | |
---|
133 | if(!(strlen(_request('sujet'))>3)) |
---|
134 | $erreurs['sujet'] = _T('forum_attention_trois_caracteres'); |
---|
135 | |
---|
136 | $texte_min = !defined('_TEXTE_MIN')?10:_TEXTE_MIN; |
---|
137 | if(!(strlen(_request('texte'))>$texte_min) && !$erreurs['texte']) |
---|
138 | $erreurs['texte'] = _T('contact:forum_attention_nbre_caracteres',array('nbre_caract'=>$texte_min)); |
---|
139 | |
---|
140 | if ($nobot=_request('nobot')) |
---|
141 | $erreurs['nobot'] = 'Vous êtes un robot. Méchant robot.'; |
---|
142 | |
---|
143 | // On s'occupe des pièces jointes. |
---|
144 | $pj_fichiers = $_FILES['pj_fichiers']; |
---|
145 | |
---|
146 | //Si le répertoire temporaire n'existe pas encore, il faut le créer. |
---|
147 | $repertoire_temp_pj = _DIR_TMP.'/contact_pj/'; |
---|
148 | if (!is_dir($repertoire_temp_pj)) mkdir($repertoire_temp_pj); |
---|
149 | |
---|
150 | //Pour les nouvelles pj uploadées |
---|
151 | if ($pj_fichiers != null) { |
---|
152 | foreach ($pj_fichiers['name'] as $cle => $nom_pj) { |
---|
153 | // On commence par transformer le nom du fichier pour éviter les conflits |
---|
154 | $nom_pj = trim(preg_replace('/[\s]+/', '_', strtolower(translitteration($nom_pj)))); |
---|
155 | // Si le fichier a bien un nom et qu'il n'y a pas d'erreur associé à ce fichier |
---|
156 | if (($nom_pj != null) && ($pj_fichiers['error'][$cle] == 0)) { |
---|
157 | //On vérifie qu'un fichier ne porte pas déjà le même nom, sinon on lui donne un nom aléatoire + nom original |
---|
158 | if (file_exists($repertoire_temp_pj.$nom_pj)) |
---|
159 | $nom_pj = $nom_pj.'_'.rand(); |
---|
160 | |
---|
161 | //déplacement du fichier vers le dossier de réception temporaire |
---|
162 | if (move_uploaded_file($pj_fichiers['tmp_name'][$cle], $repertoire_temp_pj.$nom_pj)) { |
---|
163 | $infos_pj[$cle]['message'] = 'ajout fichier'; |
---|
164 | $infos_pj[$cle]['nom'] = $nom_pj; |
---|
165 | // On en déduit l'extension et du coup la vignette |
---|
166 | $infos_pj[$cle]['extension'] = strtolower(preg_replace('/^.*\.([\w]+)$/i', '$1', $nom_pj)); |
---|
167 | if (function_exists('vignette_par_defaut')) |
---|
168 | $vignette = 'vignette_par_defaut'; |
---|
169 | else |
---|
170 | $vignette = charger_fonction('vignette', 'inc'); |
---|
171 | $infos_pj[$cle]['vignette'] = $vignette($infos_pj[$cle]['extension'], false, true); |
---|
172 | //On récupère le tye MIME du fichier aussi |
---|
173 | $infos_pj[$cle]['mime'] = $pj_fichiers['type'][$cle]; |
---|
174 | } |
---|
175 | } |
---|
176 | } |
---|
177 | } |
---|
178 | |
---|
179 | //Pour les pj qui ont déjà été récupérées avec succes, on remet le tableau des informations sur les pj à jour |
---|
180 | $pj_enregistrees_nom = _request('pj_enregistrees_nom'); |
---|
181 | $pj_enregistrees_mime = _request('pj_enregistrees_mime'); |
---|
182 | $pj_enregistrees_extension = _request('pj_enregistrees_extension'); |
---|
183 | $pj_enregistrees_vignette = _request('pj_enregistrees_vignette'); |
---|
184 | |
---|
185 | if (is_array($pj_enregistrees_nom)) |
---|
186 | foreach ($pj_enregistrees_nom as $cle => $nom){ |
---|
187 | $infos_pj[$cle]['message'] = 'ajout fichier'; |
---|
188 | $infos_pj[$cle]['nom'] = $nom; |
---|
189 | $infos_pj[$cle]['mime'] = $pj_enregistrees_mime[$cle]; |
---|
190 | $infos_pj[$cle]['extension'] = $pj_enregistrees_extension[$cle]; |
---|
191 | $infos_pj[$cle]['vignette'] = $pj_enregistrees_vignette[$cle]; |
---|
192 | } |
---|
193 | |
---|
194 | //Maintenant on vérifie s'il n'y a pas eu une suppression de fichiers |
---|
195 | $nb_max_pj = lire_config('contact/nb_max_pj'); |
---|
196 | for ($cle=0 ; $cle<$nb_max_pj ; $cle++) { |
---|
197 | if (_request('pj_supprimer_'.$cle)) { |
---|
198 | //On récupère le nom de la pièce jointe à supprimer |
---|
199 | $nom_pj_supprimer = $infos_pj[$cle]['nom']; |
---|
200 | //On supprime le fichier portant ce nom |
---|
201 | unlink($repertoire_temp_pj.$nom_pj_supprimer); |
---|
202 | //On re-propose la possibilité de télécharger un fichier en supprimant les infos du fichier |
---|
203 | unset($infos_pj[$cle]); |
---|
204 | } |
---|
205 | } |
---|
206 | |
---|
207 | // Si on est pas dans une confirmation et qu'il n'y pas de vraies erreurs on affiche la prévisu du message |
---|
208 | if (!_request('confirmer') AND !count($erreurs)) |
---|
209 | $erreurs['previsu']=' '; |
---|
210 | |
---|
211 | // Si on est pas dans une confirmation, on ajoute au contexte les infos des fichiers déjà téléchargés |
---|
212 | if (!_request('confirmer')) |
---|
213 | $erreurs['infos_pj'] = $infos_pj; |
---|
214 | |
---|
215 | return $erreurs; |
---|
216 | } |
---|
217 | |
---|
218 | function formulaires_contact_traiter_dist($id_auteur='',$tracer=''){ |
---|
219 | |
---|
220 | include_spip('base/abstract_sql'); |
---|
221 | include_spip('inc/texte'); |
---|
222 | |
---|
223 | $infos = ''; |
---|
224 | |
---|
225 | // On récupère à qui ça va être envoyé |
---|
226 | $destinataire = _request('destinataire'); |
---|
227 | if (!is_array($destinataire)) |
---|
228 | $destinataire = array($destinataire); |
---|
229 | $destinataire = array_map('intval', $destinataire); |
---|
230 | $mail = sql_allfetsel( |
---|
231 | 'email', |
---|
232 | 'spip_auteurs', |
---|
233 | 'id_auteur IN ('.join(', ', $destinataire).')' |
---|
234 | ); |
---|
235 | $mail = array_map('reset', $mail); |
---|
236 | // S'il n'y a pas le plugin facteur, on met l'(es) adresse(s) sous forme de chaine de caractères. |
---|
237 | if (!defined("_DIR_PLUGIN_FACTEUR")) |
---|
238 | $mail = join(', ', $mail); |
---|
239 | |
---|
240 | // Les infos supplémentaires |
---|
241 | $champs_possibles = contact_infos_supplementaires(); |
---|
242 | $champs_mini_config = array('mail', 'sujet', 'texte'); |
---|
243 | $champs_choisis = lire_config('contact/champs',$champs_mini_config); |
---|
244 | if (is_array($champs_choisis)){ |
---|
245 | foreach($champs_choisis as $champ){ |
---|
246 | if ($reponse_champ = _request($champ)){ |
---|
247 | if( ($champ=='mail') OR ($champ=='sujet') OR ($champ=='texte') ){ |
---|
248 | $posteur[$champ] = $reponse_champ; |
---|
249 | }else{ |
---|
250 | $infos .= "\n".$champs_possibles[$champ]." : ".$reponse_champ; |
---|
251 | } |
---|
252 | } |
---|
253 | } |
---|
254 | } |
---|
255 | if($tracer){ |
---|
256 | $trace=explode('-',$tracer); |
---|
257 | if( (count($trace)==2) and (intval($trace[1])>0) ){ |
---|
258 | $url = generer_url_entite(intval($trace[1]),$trace[0]); |
---|
259 | if($url){ |
---|
260 | $inforigine= $GLOBALS['meta']['adresse_site']."/".$url; |
---|
261 | }else{ |
---|
262 | $inforigine= 'info trace non comprise'; |
---|
263 | } |
---|
264 | }else{ |
---|
265 | $inforigine= 'info trace non comprise'; |
---|
266 | } |
---|
267 | $inforigine= _T('contact:inforigine')."\n".$inforigine."\n\n"; |
---|
268 | |
---|
269 | } |
---|
270 | |
---|
271 | // horodatons |
---|
272 | $horodatage = affdate_heure (date ("Y-m-d H:i:s")); |
---|
273 | $horodatage = "\n\n"._T('contact:horodatage', array('horodatage'=>$horodatage))."\n\n"; |
---|
274 | $par = _T('contact:par').$posteur['mail']."\n\n"; |
---|
275 | |
---|
276 | $texte = $horodatage.$par.$inforigine.$infos."\n\n".$posteur['texte']; |
---|
277 | $nom_site = supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site'])); |
---|
278 | $texte .= "\n\n "._T('envoi_via_le_site')." ".$nom_site." ( ".$GLOBALS['meta']['adresse_site']."/ ) \n"; |
---|
279 | |
---|
280 | // Texte a envoyer par mail, sans raccourcis SPIP |
---|
281 | $texte_final = propre($texte); |
---|
282 | // Eviter que le facteur machouille les apostrophes |
---|
283 | if ($GLOBALS['meta']['facteur_filtre_iso_8859']){ |
---|
284 | $texte_final = preg_replace(',’,',"'",$texte_final); |
---|
285 | } |
---|
286 | // Sauvegarder un soupcon de liste dans le mail |
---|
287 | $texte_final = preg_replace (array('/<li>/','/<\/li>/','/<\/ul>/'), array("- ","\n","\n"), $texte_final); |
---|
288 | $texte_final = supprimer_tags($texte_final); |
---|
289 | |
---|
290 | // On formate pour les accents |
---|
291 | // Texte a mettre en base |
---|
292 | $texte = filtrer_entites($texte); |
---|
293 | |
---|
294 | // On va vérifie s'il y a des pièces jointes |
---|
295 | $pj_enregistrees_nom = _request('pj_enregistrees_nom'); |
---|
296 | $pj_enregistrees_mime = _request('pj_enregistrees_mime'); |
---|
297 | $pj_enregistrees_extension = _request('pj_enregistrees_extension'); |
---|
298 | $repertoire_temp_pj = _DIR_TMP.'/contact_pj/'; |
---|
299 | |
---|
300 | // Si oui on les ajoute avec le plugin Facteur |
---|
301 | if ($pj_enregistrees_nom != null) { |
---|
302 | //On rajoute des sauts de ligne pour différencier du message. |
---|
303 | $texte_final = array( |
---|
304 | 'texte' => $texte_final |
---|
305 | ); |
---|
306 | foreach ($pj_enregistrees_nom as $cle => $nom_pj) { |
---|
307 | $texte_final['pieces_jointes'][$cle] = array( |
---|
308 | 'chemin' => $repertoire_temp_pj.$nom_pj, |
---|
309 | 'nom' => $nom_pj, |
---|
310 | 'encodage' => 'base64', |
---|
311 | 'mime' => $pj_enregistrees_mime[$cle] |
---|
312 | ); |
---|
313 | } |
---|
314 | } |
---|
315 | |
---|
316 | // Enregistrement des messages en base de données si on l'a demandé |
---|
317 | if (lire_config('contact/sauvegarder_contacts')) { |
---|
318 | // Il s'agit d'un visiteur : on va donc l'enregistrer dans la table auteur pour garder son mail. |
---|
319 | // Sauf s'il existe déjà. |
---|
320 | $id_aut = sql_getfetsel( |
---|
321 | 'id_auteur', |
---|
322 | 'spip_auteurs', |
---|
323 | 'email = '.sql_quote($posteur['mail']) |
---|
324 | ); |
---|
325 | if (!$id_aut){ |
---|
326 | $nom_auteur = trim(_request('prenom').' '._request('nom')); |
---|
327 | if (!$nom_auteur) $nom_auteur = $posteur['mail']; |
---|
328 | $id_aut = sql_insertq( |
---|
329 | 'spip_auteurs', |
---|
330 | array( |
---|
331 | 'nom' => $nom_auteur, |
---|
332 | 'email' => $posteur['mail'], |
---|
333 | 'statut' => 'contact' |
---|
334 | ) |
---|
335 | ); |
---|
336 | } |
---|
337 | |
---|
338 | // Ensuite on ajoute le message dans la base |
---|
339 | $id_message = sql_insertq( |
---|
340 | 'spip_messages', |
---|
341 | array( |
---|
342 | 'titre' => $posteur['sujet'], |
---|
343 | 'statut' => 'publie', |
---|
344 | 'type' => 'contac', |
---|
345 | 'id_auteur' => $id_aut, |
---|
346 | 'date_heure' => date('Y-m-d H:i:s'), |
---|
347 | 'texte' => $texte, |
---|
348 | 'rv' => 'non' |
---|
349 | ) |
---|
350 | ); |
---|
351 | |
---|
352 | // S'il y a des pièces jointes on les ajoute aux documents de SPIP. |
---|
353 | if ($pj_enregistrees_nom != null) { |
---|
354 | //On charge la fonction pour ajouter le document là où il faut |
---|
355 | $ajouter_document = charger_fonction('ajouter_documents', 'inc'); |
---|
356 | foreach ($pj_enregistrees_nom as $nom_pj) { |
---|
357 | $id_doc = $ajouter_document($repertoire_temp_pj.$nom_pj, $nom_pj, 'message', $id_message, 'document', $id_document, $titrer=false); |
---|
358 | } |
---|
359 | } |
---|
360 | |
---|
361 | // On lie le message au(x) destinataire(s) concerné(s) |
---|
362 | foreach ($destinataire as $id_destinataire) { |
---|
363 | sql_insertq( |
---|
364 | 'spip_auteurs_messages', |
---|
365 | array( |
---|
366 | 'id_auteur' => $id_destinataire, |
---|
367 | 'id_message' => $id_message, |
---|
368 | 'vu' =>'non') |
---|
369 | ); |
---|
370 | } |
---|
371 | |
---|
372 | $memoire = generer_url_ecrire('contact_un_message', 'id_message='.$id_message); |
---|
373 | if ($pj_enregistrees_nom != null) { |
---|
374 | $texte_final['texte'] .= "\n\n"._T('contact:consulter_memoire')."\n".$memoire; |
---|
375 | } |
---|
376 | else{ |
---|
377 | $texte_final .= "\n\n"._T('contact:consulter_memoire')."\n".$memoire; |
---|
378 | } |
---|
379 | } |
---|
380 | // envoyer le mail maintenant |
---|
381 | $envoyer_mail = charger_fonction('envoyer_mail','inc'); |
---|
382 | $envoyer_mail($mail, $posteur['sujet'], $texte_final, $posteur['mail'], "X-Originating-IP: ".$GLOBALS['ip']); |
---|
383 | |
---|
384 | // Maintenant que tout a été envoyé ou enregistré, s'il y avait des PJ il faut supprimer les fichiers |
---|
385 | if ($pj_enregistrees_nom != null) { |
---|
386 | foreach ($pj_enregistrees_nom as $cle => $nom_pj) { |
---|
387 | unlink($repertoire_temp_pj.$nom_pj); |
---|
388 | } |
---|
389 | } |
---|
390 | |
---|
391 | $message = _T('contact:succes', array("equipe_site" => $nom_site)); |
---|
392 | return array('message_ok'=>$message); |
---|
393 | } |
---|
394 | |
---|
395 | ?> |
---|