source: spip-zone/_plugins_/contact/branches/v0_7/formulaires/contact.php @ 48547

Last change on this file since 48547 was 46963, checked in by kent1@…, 10 years ago

Revert du dernier commit ... fausse alerte ... un problème de maj svn chez moi

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