source: spip-zone/_plugins_/inscription2/inscription2_2_0/formulaires/inscription2.php @ 44238

Last change on this file since 44238 was 44238, checked in by toutati@…, 9 years ago

Quitte a pouvoir mettre un logo_auteur obligatoire, autant que cela soit vraiment possible. Revert possible bien sur. Et merci pour ce super plugin.

File size: 14.6 KB
Line 
1<?php
2/**
3 * Formulaire d'inscription et de modification de profil amélioré au site
4 *
5 * Pour l'utiliser en tant que formulaire d'inscription :
6 * - #FORMULAIRE_INSCRIPTION2
7 *
8 * Pour l'utiliser afin de modifier le profil d'un utilisateur :
9 * - #FORMULAIRE_INSCRIPTION2{#ID_AUTEUR} dans une boucle auteur
10 * - #FORMULAIRE_INSCRIPTION2{#ENV{id_auteur}} si l'id_auteur est dans
11 * l'environnement (modèle / page spécifique)
12 * - #FORMULAIRE_INSCRIPTION2{2} pour éditer le profil d'un utilisateur en
13 * particulier (ici l'id_auteur numéro 2)
14 *
15 */
16
17if (!defined("_ECRIRE_INC_VERSION")) return;
18
19// charger cfg
20include_spip('cfg_options');
21include_spip('inc/autoriser');
22
23/**
24 *
25 * Chargement des valeurs par defaut des champs du formulaire
26 *
27 * @return array L'ensemble des champs et de leur valeurs
28 * @param int $id_auteur[optional] Si cette valeur est utilisée, on entre dans le cadre de
29 * la modification d'un auteur, et plus dans la création
30 */
31function formulaires_inscription2_charger_dist($id_auteur = NULL,$redirect = null){
32
33        //initialise les variables d'environnement pas défaut
34        $valeurs = array();
35
36        //recupere la liste des champs possible
37        $chercher_champs = charger_fonction('inscription2_champs_formulaire','inc');
38        $champs = $chercher_champs($id_auteur);
39
40        /**
41         * si on a un auteur alors on preremplit le formulaire avec ses informations
42         * les nom des champs sont les memes que ceux de la base de données
43         */
44        if (is_numeric($id_auteur)) {
45                if (!autoriser('modifier','auteur',$id_auteur)) {
46                        return;
47                }
48                /**
49                 * On sélectionne tout pour éviter les champs qui ne sont pas dans la
50                 * base de donnée.
51                 * par exemple : logo_auteur et reglement
52                 */
53                $auteur = sql_fetsel(
54                        '*',
55                        'spip_auteurs a LEFT JOIN spip_auteurs_elargis b ON a.id_auteur=b.id_auteur',
56                        'a.id_auteur ='.$id_auteur
57                );
58                $auteur['id_auteur'] = $id_auteur;
59               
60                if(in_array('naissance',$champs)){
61                        if(preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})/",$auteur['naissance'],$date_naissance)){
62                                include_spip('inc/date');
63                                $auteur['annee'] = $date_naissance[1];
64                                $auteur['mois'] = $date_naissance[2];
65                                $auteur['jour'] = $date_naissance[3];
66                        }
67                }
68                $champs = $auteur;
69                //trouver si logo
70                $chercher_logo = charger_fonction('chercher_logo', 'inc');
71                $logo = $chercher_logo($id_auteur, 'id_auteur', 'on');
72                        if ($logo){
73                        $champs['logo_auteur'] = $logo[0];
74                        }               
75        } else {
76            //si on est en mode creation et que l'utilisateur a saisi ses valeurs on les prends en compte
77            foreach($champs as $clef =>$valeurs) {
78            if (_request($valeurs)) {
79                $champs[$valeurs] = trim(_request($valeurs));
80            }
81            if($valeurs == 'naissance'){
82                                include_spip('inc/date');
83                                $champs['annee'] = _request('annee');
84                                $champs['mois'] = _request('mois');
85                                $champs['jour'] = _request('jour');
86            }
87            }
88        }
89
90        //Offrir aux autres plugins la possibilite de charger les donnees
91        $champs = pipeline('i2_charger_formulaire',
92                array(
93                        'args' => '',
94                        'data' => $champs
95                )
96        );
97
98        return $champs;
99}
100
101function formulaires_inscription2_verifier_dist($id_auteur = null,$redirect = null){
102
103        //initialise le tableau des erreurs
104        $erreurs = array();
105
106    //initialise le tableau de valeurs $champs => $valeur
107    $valeurs = array();
108
109        //recupere la liste des champs possible
110        $chercher_champs = charger_fonction('inscription2_champs_formulaire','inc');
111        $champs = $chercher_champs($id_auteur);
112
113        $champs_a_verifier = pipeline('i2_verifications_specifiques',array());
114
115        //gere la correspondance champs -> _request(champs)
116        foreach($champs as $clef => $valeur) {
117
118                // On récupère sa valeur
119                $valeurs[$valeur] = trim(_request($valeur));
120
121                // On vérifie s'il est obligatoire et s'il est bien rempli
122                if ((lire_config('inscription2/'.$valeur.'_obligatoire') == 'on' ) && ((empty($valeurs[$valeur]) OR (strlen(_request($valeur)) == 0)))) {
123                        $erreurs[$valeur] = _T('inscription2:champ_obligatoire');
124                        $erreurs_obligatoires = true;
125                        if($valeur=='logo_auteur'){
126                                //un logo existe deja ?
127                                $chercher_logo = charger_fonction('chercher_logo', 'inc');
128                                $logo = $chercher_logo($id_auteur, 'id_auteur', 'on');
129                                if ($logo){
130                                unset($erreurs['logo_auteur']);
131                                $erreurs_obligatoires = false;
132                                }
133                                //ou un file est charge
134                                elseif(isset($_FILES['logo_auteur']) && ($_FILES['logo_auteur']['error'] == 0)){
135                                unset($erreurs['logo_auteur']);
136                                $erreurs_obligatoires = false;
137                                }
138                        }
139                        if($valeur == 'naissance'){
140                                $annee = trim(_request('annee'));
141                                $mois = trim(_request('mois'));
142                                $jour = trim(_request('jour'));
143                                if($annee && $mois && $jour){
144                                        unset($erreurs['naissance']);
145                                }
146                        }
147                        if(is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on') && (strlen(_request('pass')) == 0)){
148                                // Si le password est vide et que l'on est dans le cas de la modification d'un auteur
149                                // On garde le pass original
150                                unset($erreurs['pass']);
151                                $pass == 'ok';
152                        }
153                }
154
155                // Sinon on la vérifie une seconde fois si nécessaire avec les fonctions spécifiques de validations
156                if(!$erreurs[$valeur]){
157                        if(array_key_exists($valeur,$champs_a_verifier)){
158                                $fonction_verif_{$valeur} = charger_fonction('inscription2_'.$champs_a_verifier[$valeur],'inc');
159                                if($val = $fonction_verif_{$valeur}($valeurs[$valeur],$id_auteur)){
160                                        $erreurs[$valeur] = $val;
161                                }
162                        }
163                }
164        }
165
166        //Verifier certains champs specifiquement
167
168        //messages d'erreur au cas par cas (PASSWORD)
169        /**
170         * Il se peut que l'on active pas le password à l'inscription
171         * mais uniquement à la modification ...
172         * On le test ici en créant la variable $pass_actif
173         * pass et password1 sont les variables a la creation du compte
174         * password et password1 sont les variables a la modification du compte
175         */ 
176        $pass_actif = false;
177        if(is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on')){
178                $pass_actif = true;
179        }else if(!$id_auteur && (lire_config('inscription2/pass') == 'on')){
180                $pass_actif = true;
181        }
182        if(($pass != 'ok') && $pass_actif) {
183                if (strlen(_request('password')) != 0){
184                        $p = _request('password');
185                }
186                else{
187                        $p = _request('pass');
188                }
189                if($p){
190                        if(strlen($p)){
191                                $pass_min = !defined('_PASS_MIN') ? 6 : _PASS_MIN; 
192                    if (strlen($p) < $pass_min) {
193                                        $erreurs['pass'] = _T('info_passe_trop_court');
194                                        $erreurs['message_erreur'] .= _T('info_passe_trop_court')."<br />";
195                                } elseif ($p != _request('password1')) {
196                                        $erreurs['pass'] = _T('info_passes_identiques');
197                                        $erreurs['message_erreur'] .= _T('info_passes_identiques')."<br />";
198                                }
199                        }else{
200                                if(!is_numeric($id_auteur)){
201                                        // (1) Si on est dans la modif d'id_auteur on garde l'ancien pass si rien n'est rentre
202                                        // donc on accepte la valeur vide
203                                        // dans le cas de la création d'un auteur ... le password sera necessaire
204                                        $erreurs['pass'] = _T('inscription2:password_obligatoire');
205                                }
206                        }
207                }
208        }
209
210        //Offrir aux autres plugins la possibilite de verifier les donnees
211        $erreurs = pipeline('i2_verifier_formulaire',
212                array(
213                        'args' => array(
214                            'champs' => $valeurs
215                        ),
216                'data' => $erreurs
217                )
218        );
219
220        //verifier que l'auteur a bien des droits d'edition
221        if (is_numeric($id_auteur)) {
222                if (!autoriser('modifier','auteur',$id_auteur)) {
223                        $erreurs['message_erreur'] .= _T('inscription2:profil_droits_insuffisants');
224                }
225        }
226
227        //message d'erreur generalise
228        if (count($erreurs)) {
229                if(isset($erreurs_obligatoires)){
230                        $erreurs['message_erreur'] .= _T('inscription2:formulaire_remplir_obligatoires');
231                }else{
232                        $erreurs['message_erreur'] .= _T('inscription2:formulaire_remplir_validation');
233                }
234
235        }
236
237    return $erreurs; // si c'est vide, traiter sera appele, sinon le formulaire sera resoumis
238}
239
240function formulaires_inscription2_traiter_dist($id_auteur = NULL,$redirect = null){
241
242        $retour = array();
243        $data = array();
244
245        if((is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') != 'on'))
246                OR (is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on')) && (strlen(_request('password')) == 0)){
247                $mode = 'modification_auteur_simple';
248        }
249        else if((is_numeric($id_auteur) && (lire_config('inscription2/pass_fiche_mod') == 'on')) and (strlen(_request('password')) != 0)){
250                $mode = 'modification_auteur_pass';
251        }
252        else if((lire_config('inscription2/pass') == 'on') && (strlen(_request('pass')))){
253                $mode = 'inscription_pass';
254        }
255        else{
256                $mode = 'inscription';
257        }
258
259        /* Generer la liste des champs a traiter
260        * champ => valeur formulaire
261        */
262        if(!is_numeric($id_auteur)){
263                $new = true;
264        }
265
266        $chercher_champs = charger_fonction('inscription2_champs_formulaire','inc');
267        $champs = $chercher_champs($id_auteur);
268
269        foreach($champs as $clef => $valeur) {
270                $valeurs[$valeur] = trim(_request($valeur));
271                if($valeur == 'naissance'){
272                        include_spip('inc/date');
273                        $annee = trim(_request('annee'));
274                        $mois = _request('mois');
275                        $jour = _request('jour');
276                        $valeurs[$valeur] = format_mysql_date($annee,$mois,$jour);
277                        spip_log("on récupère la valeur du champs naissance : ".$valeurs[$valeur]);
278                }
279        }
280        // Definir le login s'il a besoin de l'etre
281        // NOM et LOGIN sont des champs obligatoires donc a la creation il ne doivent pas etre vide
282        // Apres on s'en fiche s'il n'est pas dans le formulaire
283        if($new){
284                if(!$valeurs['nom']){
285                        if($valeurs['nom_famille']||$valeurs['prenom']){
286                                $valeurs['nom'] = $valeurs['prenom'].' '.$valeurs['nom_famille'];
287                        }
288                        else{
289                                $valeurs['nom'] = strtolower(translitteration(preg_replace('/@.*/', '', $valeurs['email'])));
290                        }
291                }
292                if(!$valeurs['login']){
293                        $definir_login = charger_fonction('inscription2_definir_login','inc');
294                        $valeurs['login'] = $definir_login($valeurs['nom'], $valeurs['email']);
295                }
296        }
297
298        $trouver_table = charger_fonction('trouver_table','base');
299
300        //$valeurs contient donc tous les champs remplit ou non
301        include_spip('inc/inscription2_compat_php4');
302        //definir les champs pour spip_auteurs
303        $table = "spip_auteurs";
304
305        //genere le tableau des valeurs a mettre a jour pour spip_auteurs
306        //toutes les clefs qu'inscription2 peut mettre a jour
307
308        //$clefs = array_fill_keys(array('login','nom','email','bio','nom_site','url_site','pgp'),'');
309        $clefs = $trouver_table('auteurs');
310        $clefs = $clefs['field'];
311
312        //extrait uniquement les donnees qui ont ete proposees a la modification
313        $val = array_intersect_key($valeurs,$clefs);
314
315        //Verification du password
316        if(($mode == 'inscription_pass') || ($mode == 'modification_auteur_pass')){
317                if (strlen(_request('password')) != 0)
318                        $new_pass = _request('password');
319                elseif($mode == 'inscription_pass')
320                        $new_pass = _request('pass'); 
321
322                if (strlen($new_pass)>0) {
323                        include_spip('inc/acces');
324                        $htpass = generer_htpass($new_pass);
325                        $alea_actuel = creer_uniqid();
326                        $alea_futur = creer_uniqid();
327                        $pass = md5($alea_actuel.$new_pass);
328                        $val['pass'] = $pass;
329                        $val['htpass'] = $htpass;
330                        $val['alea_actuel'] = $alea_actuel;
331                        $val['alea_futur'] = $alea_futur;
332                        $val['low_sec'] = '';
333                }
334               
335                if(!is_numeric($id_auteur)){
336                        $val['statut'] = lire_config('inscription2/statut_nouveau','6forum');
337                }
338        }else{
339                if(!is_numeric($id_auteur)){
340                        $val['statut'] = 'aconfirmer';
341                }
342        }
343        $pass_length = strlen($val['pass']);
344        if($pass_length == 0){
345                unset($val['pass']);
346        }
347
348        // affecter $id_auteur avec la session si dispo
349        // présent depuis moins de quelques minutes ou inscrit partiel
350
351        include_spip("inc/inscription2_session");
352        if($id_inscrit = i2_session_valide()){
353                $id_auteur = $id_inscrit ;
354                $modif_par_session = true ;
355        }       
356
357        //inserer les donnees dans spip_auteurs -- si $id_auteur : mise a jour - autrement : nouvelle entree
358        if (!$new or $modif_par_session) {
359                $where = 'id_auteur = '.$id_auteur;
360                sql_updateq(
361                        $table,
362                        $val,
363                        $where
364                );
365        } else {
366                $id_auteur = sql_insertq(
367                        $table,
368                        $val
369                );
370        }
371
372        $table = 'spip_auteurs_elargis';
373        //extrait les valeurs propres a spip_auteurs_elargis
374
375        //genere le tableau des valeurs a mettre a jour pour spip_auteurs
376        //toutes les clefs qu'inscription2 peut mettre a jour
377        //s'appuie sur les tables definies par le plugin
378
379        $clefs = $trouver_table('auteurs_elargis');
380        $clefs = $clefs['field'];
381
382        if(is_array($clefs)){
383                //extrait uniquement les donnees qui ont ete proposees a la modification
384                $val = array_intersect_key($valeurs,$clefs);
385        }else{
386                $where = 'id_auteur='.sql_quote($id_auteur);
387                $res = sql_select('*',$table,$where);
388                $clefs = sql_fetch($res);
389                $val = array_intersect_key($valeurs,$clefs);
390        }
391
392        unset($val['login']);
393
394        //recherche la presence d'un complement sur l'auteur
395        $id_elargi = sql_getfetsel('id_auteur','spip_auteurs_elargis','id_auteur='.$id_auteur);
396
397        if ($id_elargi) {
398                $where = 'id_auteur = '.$id_auteur;
399                sql_updateq(
400                        $table,
401                        $val,
402                        $where
403                );
404        } else {
405                // Si on utilise la date de creation de la fiche
406                if(lire_config('inscription2/creation') == 'on'){
407                        $val['creation'] = date("Y-m-d H:i:s",time());
408                }
409                $val['id_auteur'] = $id_auteur;
410                $id = sql_insertq(
411                        $table,
412                        $val
413                );
414        }
415
416        if(isset($_FILES['logo_auteur']) && ($_FILES['logo_auteur']['error'] == 0)){
417            $chercher_logo = charger_fonction('chercher_logo', 'inc');
418               
419                // supprimer l'ancien logo
420                $on = $chercher_logo($id_auteur, 'id_auteur', 'on');
421                if ($on) @unlink($on[0]);
422
423                // ajouter le nouveau
424                include_spip('action/iconifier');
425                action_spip_image_ajouter_dist(
426                        type_du_logo('id_auteur').'on'.$id_auteur, false, false
427                ); // beurk
428                // indiquer qu'on doit recalculer les images
429                $GLOBALS['var_images'] = true;
430        }
431
432        $traiter_plugin = pipeline('i2_traiter_formulaire',
433                array(
434                        'args' => array(
435                                'id_auteur' => $id_auteur,
436                                'champs' => $valeurs
437                        ),
438                'data' => $data
439                )
440        );
441
442    if (!$new){
443        $message .= _T('inscription2:profil_modifie_ok');
444        if($mode == 'modification_auteur_simple'){
445                $message .= '<br />'._T('inscription2:mot_passe_reste_identique');
446        }
447        $editable = true;
448    } else {
449                if(!$traiter_plugin['ne_pas_confirmer_par_mail']){
450                        $envoyer_inscription = charger_fonction('envoyer_inscription2','inc');
451                        $envoyer_inscription($id_auteur,$mode);
452                        $message = _T('inscription2:formulaire_inscription_ok');
453                }
454                if($traiter_plugin['message_ok'])
455                        $message = $traiter_plugin['message_ok'];
456                        $editable = false;
457    }
458
459        // Invalider les caches
460        include_spip('inc/invalideur');
461    suivre_invalideur("id='id_auteur/$id_auteur'");
462       
463        $retour['editable'] = $editable;
464        $retour['message_ok'] = $message;
465
466        if($redirect){
467                $retour['redirect'] = $redirect;
468        }
469
470    return $retour;
471}
472
473/**
474 * Extraction des sources des fichiers uploades correspondant aux 2 logos (normal + survol)
475 * si leur upload s'est bien passé
476 *
477 * @return Array
478 */
479function formulaire_inscription2_logo_get_sources(){
480        if (!$_FILES) $_FILES = $GLOBALS['HTTP_POST_FILES'];
481        if (!is_array($_FILES)) return array();
482       
483                if ($_FILES['logo_auteur']['error'] == 0) {
484                        $source = $_FILES;
485                }
486        return $source;
487}
488?>
Note: See TracBrowser for help on using the repository browser.