source: spip-zone/_plugins_/contact/trunk/formulaires/contact.php @ 53600

Last change on this file since 53600 was 53600, checked in by cedric@…, 8 years ago

Mise a jour pour SPIP3, avec consultation des messages

File size: 14.3 KB
Line 
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3
4include_spip('inc/config');
5include_spip('configurer/pipelines');
6include_spip('contact_fonctions');
7
8function 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
105function 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: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
218function 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        // On évite de couper les urls
282        define('_MAX_LONG_URL',100000);
283        define('_MAX_COUPE_URL',100000);
284        $texte_final = propre($texte);
285        // Eviter que le facteur machouille les apostrophes
286        if ($GLOBALS['meta']['facteur_filtre_iso_8859']){
287                $texte_final = preg_replace(',&#8217;,',"'",$texte_final);
288        }
289        // Sauvegarder un soupcon de liste dans le mail
290        $texte_final = preg_replace (array('/<li>/','/<\/li>/','/<\/ul>/'), array("- ","\n","\n"), $texte_final);
291        $texte_final = supprimer_tags($texte_final);
292
293        // On formate pour les accents
294        // Texte a mettre en base
295        $texte = filtrer_entites($texte);
296
297        // On va vérifie s'il y a des pièces jointes
298        $pj_enregistrees_nom = _request('pj_enregistrees_nom');
299        $pj_enregistrees_mime = _request('pj_enregistrees_mime');
300        $pj_enregistrees_extension = _request('pj_enregistrees_extension');
301        $repertoire_temp_pj = _DIR_TMP.'/contact_pj/';
302
303        // Si oui on les ajoute avec le plugin Facteur
304        if ($pj_enregistrees_nom != null) {
305                //On rajoute des sauts de ligne pour différencier du message.
306                $texte_final = array(
307                        'texte' => $texte_final
308                );
309                foreach ($pj_enregistrees_nom as $cle => $nom_pj) {
310                        $texte_final['pieces_jointes'][$cle] = array(
311                                'chemin' => $repertoire_temp_pj.$nom_pj,
312                                'nom' => $nom_pj,
313                                'encodage' => 'base64',
314                                'mime' => $pj_enregistrees_mime[$cle]
315                        );
316                }
317        }
318
319        // Enregistrement des messages en base de données si on l'a demandé
320        if (lire_config('contact/sauvegarder_contacts')) {
321                // Il s'agit d'un visiteur : on va donc l'enregistrer dans la table auteur pour garder son mail.
322                // Sauf s'il existe déjà.
323                $id_aut = sql_getfetsel(
324                        'id_auteur',
325                        'spip_auteurs',
326                        'email = '.sql_quote($posteur['mail'])
327                );
328                if (!$id_aut){
329                        $nom_auteur = trim(_request('prenom').' '._request('nom'));
330                        if (!$nom_auteur) $nom_auteur = $posteur['mail'];
331                        $id_aut = sql_insertq(
332                                'spip_auteurs',
333                                array(
334                                        'nom' => $nom_auteur,
335                                        'email' => $posteur['mail'],
336                                        'statut' => 'contact'
337                                )
338                        );
339                }
340
341                // Ensuite on ajoute le message dans la base
342                $id_message = sql_insertq(
343                        'spip_messages',
344                        array(
345                                'titre' => $posteur['sujet'],
346                                'statut' => 'publie',
347                                'type' => 'contac',
348                                'id_auteur' => $id_aut,
349                                'date_heure' => date('Y-m-d H:i:s'),
350                                'texte' => $texte,
351                                'rv' => 'non'
352                        )
353                );
354
355                // S'il y a des pièces jointes on les ajoute aux documents de SPIP.
356                if ($pj_enregistrees_nom != null) {
357                        //On charge la fonction pour ajouter le document là où il faut
358                        $ajouter_documents = charger_fonction('ajouter_documents','action');
359                        $files[] = array('tmp_name'=>$repertoire_temp_pj.$nom_pj,'name'=>$nom_pj);
360                        foreach ($pj_enregistrees_nom as $nom_pj) {
361                                $id_doc = $ajouter_documents("new", $files, 'message', $id_message, 'document');
362                        }
363                }
364
365                // On lie le message au(x) destinataire(s) concerné(s)
366                foreach ($destinataire as $id_destinataire) {
367                        sql_insertq(
368                                'spip_auteurs_liens',
369                                array(
370                                        'id_auteur' => $id_destinataire,
371                                        'id_objet' => $id_message,
372                                        'objet' => 'message',
373                                        'vu' =>'non')
374                        );
375                }
376
377                $memoire = generer_url_ecrire('contact_un_message', 'id_message='.$id_message);
378                if ($pj_enregistrees_nom != null) {
379                        $texte_final['texte'] .= "\n\n"._T('contact:consulter_memoire')."\n".$memoire;
380                }
381                else{
382                        $texte_final .= "\n\n"._T('contact:consulter_memoire')."\n".$memoire;
383                }
384        }
385        // envoyer le mail maintenant
386        $envoyer_mail = charger_fonction('envoyer_mail','inc');
387        $envoyer_mail($mail, $posteur['sujet'], $texte_final, $posteur['mail'], "X-Originating-IP: ".$GLOBALS['ip']);
388
389        // Maintenant que tout a été envoyé ou enregistré, s'il y avait des PJ il faut supprimer les fichiers
390        if ($pj_enregistrees_nom != null) {
391                foreach ($pj_enregistrees_nom as $cle => $nom_pj) {
392                        unlink($repertoire_temp_pj.$nom_pj);
393                }
394        }
395
396        $message = _T('contact:succes', array("equipe_site" => $nom_site));
397        return array('message_ok'=>$message);
398}
399
400?>
Note: See TracBrowser for help on using the repository browser.