source: spip-zone/_plugins_/inscription/trunk/inscription3_pipelines.php

Last change on this file was 112636, checked in by cyp@…, 3 years ago

Si on n'arrive pas à envoyer de mail c'est une erreur. Merci @placido (https://www.mediaspip.net/documentation/les-plugins-developpes-pour-mediaspip/inscription3-amelioration-de-la/article/inscription3-modification-des#forum1984)

File size: 45.3 KB
Line 
1<?php
2/**
3 * Plugin Inscription3 pour SPIP
4 * © cmtmt, BoOz, kent1
5 * Licence GPL v3
6 *
7 * Utilisations de pipelines
8 *
9 * @package SPIP\Inscription3\Pipelines
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 *
18 * Insertion dans le pipeline i3_exceptions_chargement_champs_auteurs_elargis (Inscription3)
19 * qui empêche le chargement et la recherche de champs lors de l'affichage de formulaires (editer_auteur / inscription)
20 *
21 * @return array Un tableau des champs correspondant au "name" de son input de configuration dans le CFG
22 * @param array $array Prend un tableau en argument qui doit être complété en fonction des besoins
23 */
24
25function inscription3_i3_exceptions_chargement_champs_auteurs_elargis($array = array()) {
26        if (!is_array($array)) {
27                $array = array();
28        }
29        // liste des champs pour lesquels on ne doit pas charger la valeur
30        $array[] = 'creation';
31        return $array;
32}
33
34/**
35 *
36 * Insertion dans le pipeline i3_exceptions_des_champs_auteurs_elargis
37 * qui empêche la création de certains champs dans la table
38 * après les avoir configuré
39 *
40 * @return array Un tableau des champs correspondant au "name" de son input de configuration dans le CFG
41 * @param array $array Prend un tableau en argument qui doit être complété en fonction des besoins
42 */
43
44function inscription3_i3_exceptions_des_champs_auteurs_elargis($array = array()) {
45        // liste des champs pour lesquels on ne doit pas créer de champs dans la table spip_auteurs
46        if (!is_array($array)) {
47                $array = array();
48        }
49        // Principalement les champs déjà présents dans spip_auteurs
50        $array[] = 'id_auteur';
51        $array[] = 'bio';
52        $array[] = 'nom';
53        $array[] = 'pass';
54        $array[] = 'login';
55        $array[] = 'email';
56        $array[] = 'statut';
57        $array[] = 'pgp';
58        $array[] = 'url_site';
59        $array[] = 'nom_site';
60
61        // Des choses spécifiques à inscription3
62        $array[] = 'logo';
63        $array[] = 'username';
64        $array[] = 'statut_nouveau';
65        $array[] = 'statut_int';
66        $array[] = 'statut_interne';
67        $array[] = 'accesrestreint';
68        $array[] = 'password';
69        $array[] = 'pass';
70        $array[] = 'affordance_form';
71        $array[] = 'reglement';
72        $array[] = 'reglement_article';
73        $array[] = 'password_complexite';
74        $array[] = 'validation_numero_international';
75        $array[] = 'pays_defaut';
76        $array[] = 'valider_comptes';
77        $array[] = 'message_form_inscription';
78        $array[] = 'auto_login';
79
80        return $array;
81}
82
83/**
84 *
85 * Insertion dans le pipeline i3_verifications_specifiques du plugin inscription3
86 * Utilisation de l'API verifier du plugin éponyme
87 *
88 * Pour chaque champs on fourni un array associatif contenant :
89 * - type => la fonction de l'api de vérification à utiliser
90 * - options => un array des options à passer à cette fonction
91 *
92 * @return array Tableau contenant plusieurs tableaux en fonction du type de champs
93 * @param object $array Doit recevoir un tableau du même type
94 */
95
96function inscription3_i3_verifications_specifiques($array = array()) {
97        if (!is_array($array)) {
98                $array = array();
99        }
100        // Les emails : fonction verifier/email
101        $array['email'] = array('type' => 'email','options' => array('disponible'=>'disponible'));
102        $array['mail_inscription'] = array('type' => 'email','options' => array('disponible'=>'disponible'));
103
104        // Les noms (signature)
105        $array['nom'] = array('type' => 'signature');
106        $array['nom_inscription'] = array('type' => 'signature');
107
108        // Les logins : fonction verifier/login
109        $array['login'] = array('type' => 'login');
110
111        // Les statuts : fonction verifier/statut
112        $array['statut'] = array('type' => 'statut');
113
114        // Les codes postaux : fonction verifier/code_postal
115        $array['code_postal'] = array('type' => 'code_postal');
116
117        // Les numéros de téléphone : fonction verifier/telephone
118        $array['telephone'] = array('type' => 'telephone');
119        $array['fax'] = array('type' => 'telephone');
120        $array['mobile'] = array('type' => 'telephone');
121
122        // Les dates
123        $array['naissance'] = array('type' => 'date','options' => array('format' => 'amj'));
124
125        return $array;
126}
127
128/**
129 * Insertion dans le pipeline affiche_droite (SPIP)
130 *
131 * Dans certaines pages définies, afficher le lien d'accès à la page des comptes utilisateurs
132 *
133 * @return array Le même tableau qu'il reçoit en argument
134 * @param array $flux Un tableau donnant des informations sur le contenu passé au pipeline
135 */
136
137function inscription3_affiche_droite($flux) {
138        if (is_array($flux) and isset($flux['args']['exec'])){
139                if (((preg_match('/^inscription3/', $flux['args']['exec']))
140                        or (preg_match('/^auteur/', $flux['args']['exec']))
141                        or (preg_match('/^i3_/', $flux['args']['exec']))
142                        or ($flux['args']['exec'] == 'configurer_inscription3')
143                        or (($flux['args']['exec'] == 'cfg')
144                                and ((_request('cfg') == 'inscription3') or preg_match('/^i3_/', _request('cfg'))))
145                        )
146                        and ($flux['args']['exec'] != 'inscription3_adherents')) {
147                        $flux['data'] .= recuperer_fond('prive/inscription3_affiche_droite');
148                }
149        }
150        return $flux;
151}
152
153/**
154 * Insertion dans le pipeline i3_definition_champs
155 *
156 * Définition spécifique des champs qui ne sont pas de type text
157 * Par défaut inscription3 définit les champs comme étant de type texte, cela peut être
158 * différent pour d'autres ...
159 */
160function inscription3_i3_definition_champs($flux) {
161        include_spip('inc/config');
162        /**
163         * Récupération de la configuration d'inscription3
164         * pour éviter d'avoir à utiliser la fonction lire_config beaucoup de fois
165         */
166        $config_i3 = lire_config('inscription3', array());
167
168        $flux['pays'] = array(
169                'saisie' => 'pays', // type de saisie
170                'options' => array(
171                        'sql' => 'int NOT NULL', // declaration sql
172                        'option_intro'=>_T('inscription3:aucun'),
173                        'class' => 'pays',
174                        'defaut' => ((array_key_exists('pays_defaut', $config_i3)
175                                and isset($config_i3['pays_defaut'])) ? $config_i3['pays_defaut'] : ''),
176                        'obligatoire' => (array_key_exists('pays_obligatoire', $config_i3)
177                                and $config_i3['pays_obligatoire'] == 'on') ? true : false,
178                        'rechercher' => false
179                )
180        );
181        $flux['validite'] = array(
182                'saisie' => 'date_jour_mois_annee', // type de saisie
183                'options'=> array(
184                        'sql' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // declaration sql
185                        'obligatoire' => (array_key_exists('validite_obligatoire', $config_i3)
186                                and $config_i3['validite_obligatoire'] == 'on') ? true : false,
187                        'rechercher' => false
188                ),
189                'verifier' => array(
190                        'type' => 'date',
191                        'options' => array(
192                                'format' => 'amj'
193                        )
194                )
195        );
196        $flux['creation'] = array(
197                'saisie' => 'date_jour_mois_annee', // type de saisie
198                'options' => array(
199                        'sql' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // declaration sql
200                        'rechercher' => false
201                ),
202                'restrictions' => array(
203                        'voir' => array('auteur' => ''),
204                        'modifier' => array('auteur' => 'webmestre')
205                )
206        );
207        $flux['naissance'] = array(
208                'saisie' => 'date_jour_mois_annee', // type de saisie
209                'options' => array(
210                        'sql' => "DATE DEFAULT '0000-00-00' NOT NULL", // declaration sql
211                        'obligatoire' => (array_key_exists('naissance_obligatoire', $config_i3)
212                                and $config_i3['naissance_obligatoire'] == 'on') ? true : false,
213                        'class'=>'nomulti',
214                        'datetime'=>'non',
215                        'rechercher' => false
216                ),
217                'verifier' => array(
218                        'type' => 'date',
219                        'options' => array(
220                                'format' => 'amj'
221                        )
222                )
223        );
224        $flux['sexe'] = array(
225                'saisie' => 'radio', // type de saisie
226                'options' => array(
227                        'label'=> _T('inscription3:label_civilite'),
228                        'datas'=> array(
229                                'F' => _T('inscription3:choix_feminin'),
230                                'M' => _T('inscription3:choix_masculin')
231                        ),
232                        'sql' => "varchar(2) NOT NULL default ''", // declaration sql
233                        'obligatoire' => (array_key_exists('sexe_obligatoire', $config_i3)
234                                and $config_i3['sexe_obligatoire'] == 'on') ? true : false,
235                        'rechercher' => false
236                )
237        );
238
239        $flux['commentaire']['saisie'] = 'textarea';
240        $flux['commentaire']['options'] = array_merge(((isset($flux['commentaire']['options'])
241                and is_array($flux['commentaire']['options'])) ?
242                        $flux['commentaire']['options'] : array()), array('rows' => 5,'class' => 'adresse'));
243
244        $flux['adresse']['saisie'] = 'textarea';
245        $flux['adresse']['options'] = array_merge(((isset($flux['adresse']['options'])
246                and is_array($flux['adresse']['options'])) ?
247                        $flux['adresse']['options'] : array()), array('rows' => 5, 'class' => 'adresse'));
248
249        $flux['telephone']['verifier']['type'] = 'telephone';
250        $flux['telephone']['options'] = array('class'=>'nomulti');
251
252        $flux['fax']['verifier'] = 'telephone';
253        $flux['fax']['options'] = array('class'=>'nomulti');
254
255        $flux['mobile']['verifier']['type'] = 'telephone';
256        $flux['mobile']['options'] = array('class'=>'nomulti');
257
258        $flux['code_postal']['verifier']['type'] = 'code_postal';
259        $flux['code_postal']['options']['class'] = 'nomulti';
260
261        return $flux;
262}
263
264/**
265 * Insertion dans le pipeline formulaire_charger (SPIP)
266 *
267 * Charge des valeurs spécifiques dans le formulaire d'inscription
268 *
269 * @param array $flux Le contexte d'environnement du pipeline
270 * @return array $flux Le contexte d'environnement modifié
271 */
272function inscription3_formulaire_charger($flux) {
273        if (is_array($flux)
274                and isset($flux['args']['form'])
275                and $flux['args']['form'] =='inscription') {
276                $valeurs = array();
277                $chercher_champs = charger_fonction('inscription3_champs_formulaire', 'inc');
278                $champs = $chercher_champs(null, 'inscription');
279                foreach ($champs as $valeur) {
280                        $valeurs[$valeur] = _request($valeur);
281                        if (is_array($valeurs[$valeur])) {
282                                $valeurs[$valeur] = implode(',', $valeurs[$valeur]);
283                        }
284                        $valeurs[$valeur] = trim($valeurs[$valeur]);
285                        if ($valeur == 'naissance') {
286                                $date_naissance = array();
287                                if (_request('naissance')
288                                        and preg_match('/([0-9]{4})-([0-9]{2})-([0-9]{2})/', _request('naissance'), $date_naissance)) {
289                                        $valeurs['naissance_annee'] = $date_naissance[1];
290                                        $valeurs['naissance_mois'] = $date_naissance[2];
291                                        $valeurs['naissance_jour'] = $date_naissance[3];
292                                } else {
293                                        $valeurs['naissance_annee'] = _request('naissance_annee') ? _request('naissance_annee') : '';
294                                        $valeurs['naissance_mois'] = _request('naissance_mois') ? _request('naissance_mois') : '';
295                                        $valeurs['naissance_jour'] = _request('naissance_jour') ? _request('naissance_jour') : '';
296                                }
297                        }
298                }
299                include_spip('cextras_pipelines');
300                $saisies = champs_extras_objet('spip_auteurs');
301                foreach ($champs as $valeur) {
302                        if (!$valeurs[$valeur]) {
303                                if (array_key_exists($valeur, $saisies)) {
304                                        $saisie_nom = $saisies[$valeur]['options']['nom'];
305                                        if (_request($saisie_nom)) {
306                                                $valeurs[$saisie_nom] = trim(_request($saisie_nom));
307                                        }
308                                }
309                        }
310                }
311                $valeurs = pipeline(
312                        'i3_charger_formulaire',
313                        array(
314                                'args' => $flux['args'],
315                                'data' => $valeurs
316                        ),
317                        array()
318                );
319
320                if (is_array($flux['data'])) {
321                        $flux['data'] = array_merge($flux['data'], $valeurs);
322                } else {
323                        $flux['data'] = $valeurs;
324                }
325        }
326
327        if (in_array($flux['args']['form'], array('editer_auteur', 'inscription'))
328                and (isset($flux['data']['naissance']) and $flux['data']['naissance'] == '0000-00-00')) {
329                unset($flux['data']['naissance']);
330                unset($flux['data']['naissance_annee']);
331                unset($flux['data']['naissance_mois']);
332                unset($flux['data']['naissance_jour']);
333        }
334
335        return $flux;
336}
337
338/**
339 * Insertion dans le pipeline formulaire_verifier (SPIP)
340 *
341 * Vérifie des valeurs spécifiques dans le formulaire d'inscription et d'édition d'auteur (pour le logo)
342 *
343 * @pipeline formulaire_verifier
344 * @param array $flux
345 *              Le contexte d'environnement du pipeline
346 * @return array $flux
347 *              Le contexte d'environnement modifié
348 */
349function inscription3_formulaire_verifier($flux) {
350        include_spip('inc/config');
351        if ($flux['args']['form'] == 'configurer_inscription3') {
352                /**
353                 * On supprime l'ancienne configuration pour avoir la nouvelle dans l'ordre
354                 */
355                include_spip('inc/meta');
356                effacer_meta('inscription3');
357        }
358        if ($flux['args']['form']=='oubli') {
359                $erreurs = $flux['args']['erreurs'];
360                if (!$erreurs or (count($erreurs) == 0)) {
361                        $email = _request('oubli');
362                        if (!empty($email)) {
363                                $statut = sql_getfetsel('statut', 'spip_auteurs', 'email='.sql_quote($email));
364                                if ($statut == '8aconfirmer') {
365                                        $flux['data']['oubli'] = _T('inscription3:erreur_compte_attente_mail');
366                                        $flux['data']['message_erreur'] = _T('inscription3:erreur_compte_attente');
367                                }
368                        } else {
369                                $erreurs['email'] = 'Champ email vide';
370                        }
371                }
372        }
373
374        if (in_array($flux['args']['form'], array('editer_auteur', 'inscription'))) {
375                /**
376                 * On inclue inscription3_fonctions pour prendre en compte la surcharge de
377                 * formulaires_inscription_traiter en ajax
378                 */
379                $erreurs = $flux['data'];
380
381                include_spip('inscription3_fonctions');
382                include_spip('inc/editer');
383                $config_i3 = lire_config('inscription3', array());
384                if ($erreurs['message_erreur'] == null) {
385                        unset($erreurs['message_erreur']);
386                }
387
388                /**
389                 * Vérifier le logo
390                 */
391                if (isset($_FILES['logo']) and ($_FILES['logo']['error'] == 0)) {
392                        $f =_DIR_LOGOS . rand() . '.tmp';
393                        include_spip('inc/documents');
394                        if ($erreur = check_upload_error($_FILES['logo']['error'], '', $f)) {
395                                $erreurs['logo'] = $erreur;
396                        } else {
397                                $source = deplacer_fichier_upload($_FILES['logo']['tmp_name'], $f);
398                        }
399
400                        if ($source and $f) {
401                                global $formats_logos;
402                                $size = @getimagesize($f);
403                                $type = !$size ? '': ($size[2] > 3 ? '' : $formats_logos[$size[2]-1]);
404                                if ($type) {
405                                        $poids = filesize($f);
406
407                                        if (_LOGO_MAX_SIZE > 0
408                                                and $poids > _LOGO_MAX_SIZE*1024) {
409                                                spip_unlink($f);
410                                                $erreur = _T(
411                                                        'info_logo_max_poids',
412                                                        array(
413                                                                'maxi' => taille_en_octets(_LOGO_MAX_SIZE*1024),
414                                                                'actuel' => taille_en_octets($poids)
415                                                        )
416                                                );
417                                        } elseif (_LOGO_MAX_WIDTH * _LOGO_MAX_HEIGHT
418                                                and ($size[0] > _LOGO_MAX_WIDTH
419                                                or $size[1] > _LOGO_MAX_HEIGHT)) {
420                                                spip_unlink($f);
421                                                $erreur = _T(
422                                                        'info_logo_max_poids',
423                                                        array(
424                                                                'maxi' => _T(
425                                                                        'info_largeur_vignette',
426                                                                        array(
427                                                                                'largeur_vignette' => _LOGO_MAX_WIDTH,
428                                                                                'hauteur_vignette' => _LOGO_MAX_HEIGHT
429                                                                        )
430                                                                ),
431                                                                'actuel' => _T(
432                                                                        'info_largeur_vignette',
433                                                                        array(
434                                                                                'largeur_vignette' => $size[0],
435                                                                                'hauteur_vignette' => $size[1]
436                                                                        )
437                                                                )
438                                                        )
439                                                );
440                                        }
441                                        spip_unlink($f);
442                                } else {
443                                        spip_unlink($f);
444                                        $erreur = _T(
445                                                'info_logo_format_interdit',
446                                                array('formats' => join(', ', $formats_logos))
447                                        );
448                                }
449                        }
450
451                        if ($erreur) {
452                                $erreurs['logo'] = $erreur;
453                        }
454                }
455
456                /**
457                 * Vérification des champs obligatoires
458                 * En fonction de ceux présents dans le formulaire
459                 */
460                $champs_obligatoires = charger_fonction('inscription3_champs_obligatoires', 'inc');
461                $obligatoires = $champs_obligatoires(null, $flux['args']['form']);
462                unset($obligatoires['email']);
463                unset($obligatoires['nom']);
464                $erreurs = array_merge($erreurs, formulaires_editer_objet_verifier('auteur', null, $obligatoires));
465
466                if ($flux['args']['form'] == 'inscription') {
467                        if (lire_config('inscription3/pass_obligatoire') == 'on'
468                                and lire_config('inscription3/pass') == 'on'
469                                and (!_request('pass') or !_request('password1'))) {
470                                $erreurs['pass'] = _T('info_obligatoire');
471                        } elseif (lire_config('inscription3/pass') == 'on') {
472                                if (_request('pass') != _request('password1')) {
473                                        $erreurs['pass'] = _T('info_passes_identiques');
474                                } elseif (strlen(_request('pass')) > 0) {
475                                        $pass_min = !defined('_PASS_MIN') ? 6 : _PASS_MIN;
476                                        if (strlen(_request('pass')) < $pass_min) {
477                                                $erreurs['pass'] = _T('info_passe_trop_court');
478                                        }
479                                }
480                        }
481
482                        if ($erreurs['reglement']) {
483                                $erreurs['reglement'] = _T('inscription3:erreur_reglement_obligatoire');
484                        }
485                }
486
487                if (count($erreurs)) {
488                        $erreurs_obligatoires = true;
489                }
490
491                $valeurs = array();
492
493                $verifier = charger_fonction('verifier', 'inc', true);
494
495                if ($verifier) {
496                        /**
497                         * Vérification des champs de champs extras
498                         */
499                        $options = array();
500                        if ($flux['args']['form'] == 'editer_auteur' and intval(_request('id_auteur'))) {
501                                $infos_auteurs = sql_fetsel('*', 'spip_auteurs', 'id_auteur='.intval(_request('id_auteur')));
502                                if (intval($infos_auteurs['id_auteur']) > 0) {
503                                        $options['id_auteur'] = $infos_auteurs['id_auteur'];
504                                }
505                        }
506
507                        $champs_a_verifier = pipeline('i3_verifications_specifiques', array());
508                        //gere la correspondance champs -> _request(champs)
509                        foreach ($champs_a_verifier as $clef => $type) {
510                                /*
511                                 * Si le champs n'est pas déjà en erreur suite aux champs obligatoires
512                                 * On s'assure qu'il est bien présent dans le formulaire également
513                                 */
514                                if ($flux['args']['form'] == 'editer_auteur'
515                                        and intval(_request('id_auteur')) > 0
516                                        and in_array($type['type'], array('email', 'signature'))) {
517                                        if ($type['type'] == 'email' and isset($type['options']['disponible'])
518                                                and $infos_auteurs[$clef] == _request($clef)) {
519                                                unset($type['options']['disponible']);
520                                        } elseif (($type['type'] == 'signature') and ($infos_auteurs[$clef] == _request($clef))) {
521                                                continue;
522                                        }
523                                }
524                                if (!isset($erreurs[$clef]) and _request($clef)) {
525                                        $valeurs[$clef] = trim(_request($clef));
526                                        $type['options'] = array_merge(array_merge(is_array($type['options']) ?
527                                                $type['options'] : array(), $_GET), $options);
528                                        $erreurs[$clef] = $verifier($valeurs[$clef], $type['type'], $type['options']);
529                                        if ($erreurs[$clef] == null) {
530                                                unset($erreurs[$clef]);
531                                        }
532                                }
533                        }
534                        /**
535                         * Vérification des champs de cextras
536                         * Uniquement sur le formulaire d'inscription
537                         *
538                         * On ne vérifie pas les obligatoires qui doivent être faits plus haut
539                         */
540                        if (($flux['args']['form'] == 'inscription')
541                                and $saisies = champs_extras_objet('spip_auteurs')) {
542                                include_spip('inc/autoriser');
543                                include_spip('inc/saisies');
544
545                                $saisies = saisies_lister_avec_sql($saisies);
546
547                                // restreindre la vue selon les autorisations
548                                $id_objet = $flux['args']['args'][0]; // ? vraiment toujours ?
549                                $saisies = champs_extras_autorisation(
550                                        'modifier',
551                                        'auteur',
552                                        $saisies,
553                                        array_merge(
554                                                $flux['args'],
555                                                array(
556                                                        'id' => $id_objet,
557                                                        'contexte' => array()
558                                                )
559                                        )
560                                ); // nous ne connaissons pas le contexte dans ce pipeline
561
562                                foreach ($saisies as $saisie) {
563                                        $nom = $saisie['options']['nom'];
564                                        // verifier (api) + normalisation
565                                        if ($verifier
566                                                and isset($saisie['verifier']['type'])
567                                                and $verif = $saisie['verifier']['type']) {
568                                                $options = isset($saisie['verifier']['options']) ? $saisie['verifier']['options'] : array();
569                                                $normaliser = null;
570                                                if ($erreur = $verifier(_request($nom), $verif, $options, $normaliser)) {
571                                                        $erreurs[$nom] = $erreur;
572                                                } elseif (!is_null($normaliser)) {
573                                                        // si une valeur de normalisation a ete transmis, la prendre.
574                                                        set_request($nom, $normaliser);
575                                                }
576                                        }
577                                }
578                        }
579                }
580                /**
581                 * Naisance est un champs spécifique coupé en trois on le vérifie séparément
582                 * s'il est obligatoire
583                 */
584                if ($erreurs['naissance']) {
585                        $annee = trim(_request('naissance_annee'));
586                        $mois = trim(_request('naissance_mois'));
587                        $jour = trim(_request('naissance_jour'));
588                        if ((!$annee or !$mois or !$jour)
589                                and $config_i3['naissance_obligatoire'] != 'on'
590                                and (trim(_request('naissance')) == '0000-00-00')) {
591                                unset($erreurs['naissance']);
592                        }
593                }
594                if (!$erreurs['naissance'] and _request('naissance') and (_request('naissance') != '0000-00-00')) {
595                        if (_request('naissance_annee') > (date('Y'))) {
596                                $erreurs['naissance'] = _T('inscription3:erreur_naissance_futur');
597                        } elseif (_request('naissance_annee') > (date('Y')-10)) {
598                                $erreurs['naissance'] = _T('inscription3:erreur_naissance_moins_cinq');
599                        } elseif ((date('Y') - _request('naissance_annee')) > 110) {
600                                $erreurs['naissance'] = _T('inscription3:erreur_naissance_plus_110');
601                        }
602                }
603
604                $args = array_merge($flux['args'], array('champs' => $valeurs));
605
606                /**
607                 * Offrir aux autres plugins la possibilite de verifier les donnees
608                 */
609                $erreurs = pipeline(
610                        'i3_verifier_formulaire',
611                        array(
612                                'args' => $args,
613                                'data' => $erreurs
614                        )
615                );
616
617                /**
618                 * Message d'erreur generalise
619                 */
620                if (count($erreurs) and !isset($erreurs['message_erreur'])) {
621                        if (isset($erreurs_obligatoires)) {
622                                $erreurs['message_erreur'] .= _T('inscription3:formulaire_remplir_obligatoires');
623                        } else {
624                                $erreurs['message_erreur'] .= _T('inscription3:formulaire_remplir_validation');
625                        }
626                }
627                $flux['data'] = $erreurs;
628        }
629
630        return $flux;
631}
632
633/**
634 * Insertion dans le pipeline formulaire_traiter (SPIP)
635 *
636 * Traitement des valeurs spécifiques dans le formulaire d'inscription
637 *
638 * @param array $flux Le contexte d'environnement du pipeline
639 * @return array $flux Le contexte d'environnement modifié
640 */
641function inscription3_formulaire_traiter($flux) {
642        if ($flux['args']['form']=='configurer_inscription3') {
643                /**
644                 * Crée les champs dans la table spip_auteurs dès la validation du CFG
645                 */
646                $verifier_tables = charger_fonction('inscription3_verifier_tables', 'inc');
647                $verifier_tables();
648        }
649        if ($flux['args']['form']=='mot_de_passe') {
650                $row = sql_fetsel(
651                        'id_auteur,email,login,source',
652                        'spip_auteurs',
653                        array("statut<>'5poubelle'","pass<>''"),
654                        '',
655                        'maj DESC',
656                        '1'
657                );
658                $affordance = lire_config('inscription3/affordance_form', 'login');
659                switch ($affordance) {
660                        case 'email':
661                                $flux['data']['message_ok'] = _T('pass_nouveau_enregistre').
662                                        '<p>' . _T('inscription3:pass_rappel_email', array('email' => $row['email']));
663                                break;
664                        case 'login_et_email':
665                                $flux['data']['message_ok'] = _T('pass_nouveau_enregistre').
666                                        '<p>' .
667                                        _T(
668                                                'inscription3:pass_rappel_login_email',
669                                                array('email' => $row['email'],'login'=>$row['login'])
670                                        );
671                                break;
672                }
673        }
674        /**
675         * Prise en charge du logo dans le formulaire d'édition d'auteur
676         */
677        if ($flux['args']['form'] == 'editer_auteur') {
678                if (isset($_FILES['logo']) and ($_FILES['logo']['error'] == 0)) {
679                        $id_auteur = $flux['data']['id_auteur'];
680                        if (intval($id_auteur) > 0) {
681                                $chercher_logo = charger_fonction('chercher_logo', 'inc');
682
683                                if ($on = $chercher_logo($id_auteur, 'id_auteur', 'on')) {
684                                        spip_unlink($on[0]);
685                                }
686                                include_spip('formulaires/editer_logo');
687                                include_spip('action/editer_logo');
688                                $sources = formulaire_editer_logo_get_sources();
689                                foreach ($sources as $etat => $file) {
690                                        if ($file and $file['error'] == 0) {
691                                                logo_modifier('auteur', $id_auteur, $etat, $file);
692                                                set_request('logo_up', ' ');
693                                        }
694                                }
695                                // indiquer qu'on doit recalculer les images
696                                $GLOBALS['var_images'] = true;
697                        }
698                } elseif (_request('supprimer_logo') and _request('supprimer_logo') == 'on') {
699                        $id_auteur = $flux['data']['id_auteur'];
700                        if (intval($id_auteur) > 0) {
701                                $chercher_logo = charger_fonction('chercher_logo', 'inc');
702
703                                // supprimer l'ancien logo s'il existe
704                                if ($on = $chercher_logo($id_auteur, 'id_auteur', 'on')) {
705                                        spip_unlink($on[0]);
706                                }
707                        }
708                }
709        }
710        if ($flux['args']['form']=='inscription') {
711                if (!function_exists('lire_config')) {
712                        include_spip('inc/config');
713                }
714                $config_i3 = lire_config('inscription3', array());
715                include_spip('inscription3_fonctions');
716
717                $valeurs = array();
718                /**
719                 * Les valeurs "normales" du formulaire d'inscription
720                 * qui nous permettront de retrouver l'id_auteur
721                 */
722                $nom = _request('nom_inscription');
723                $mail = _request('mail_inscription');
724
725                /**
726                 * A ce moment là SPIP a déjà créé l'auteur et lui a déjà donné un login et pass
727                 */
728                $user = sql_fetsel('*', 'spip_auteurs', 'email='.sql_quote($mail));
729
730                /**
731                 * Si l'on demande le passe dans le formulaire
732                 * On a un mode avec pass fourni
733                 * Sinon un mode simple
734                 */
735                if (($config_i3['pass'] == 'on') and (strlen(_request('pass')))) {
736                        $mode = 'inscription_pass';
737                } else {
738                        $mode = 'inscription';
739                }
740
741                /**
742                 * Generer la liste des champs a traiter
743                 * champ => valeur formulaire
744                 */
745                $chercher_champs = charger_fonction('inscription3_champs_formulaire', 'inc');
746                $champs = $chercher_champs(null, 'inscription');
747                foreach ($champs as $valeur) {
748                        $valeurs[$valeur] = _request($valeur);
749                        if (is_array($valeurs[$valeur])) {
750                                $valeurs[$valeur] = implode(',', $valeurs[$valeur]);
751                        }
752
753                        $valeurs[$valeur] = trim($valeurs[$valeur]);
754                        if ($valeur == 'naissance') {
755                                $annee = trim(_request('naissance_annee'));
756                                $mois = _request('naissance_mois');
757                                $jour = _request('naissance_jour');
758                                $valeurs[$valeur] = sql_format_date($annee, $mois, $jour);
759                                if ($valeurs[$valeur] == '0000-00-00') {
760                                        unset($valeurs[$valeur]);
761                                        set_request($valeur, '');
762                                }
763                        }
764                }
765                // Definir le login s'il a besoin de l'etre
766                // NOM et LOGIN sont des champs obligatoires donc a la creation il ne doivent pas etre vide
767                // Apres on s'en fiche s'il n'est pas dans le formulaire
768                if (!$valeurs['login'] and !$nom) {
769                        if ($valeurs['nom_famille'] or $valeurs['prenom']) {
770                                $valeurs['nom'] = trim($valeurs['prenom'].' '.$valeurs['nom_famille']);
771                        } else {
772                                $valeurs['nom'] = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
773                        }
774                } else {
775                        $valeurs['nom'] = $nom;
776                }
777
778                $valeurs['email'] = $mail;
779                if (!$valeurs['login']) {
780                        if ($user['login']) {
781                                $valeurs['login'] = $user['login'];
782                        }
783                }
784
785                $trouver_table = charger_fonction('trouver_table', 'base');
786
787                //genere le tableau des valeurs a mettre a jour pour spip_auteurs
788                //toutes les clefs qu'inscription3 peut mettre a jour
789                $clefs = $trouver_table('auteurs');
790                $clefs = $clefs['field'];
791
792                //extrait uniquement les donnees qui ont ete proposees a la modification
793                $val = array_intersect_key($valeurs, $clefs);
794
795                /**
796                 * Si on demande le pass dans le formulaire
797                 * Le compte est automatiquement activé
798                 */
799                if ($mode == 'inscription_pass') {
800                        if (strlen(_request('password')) != 0) {
801                                $new_pass = _request('password');
802                        } elseif ($mode == 'inscription_pass') {
803                                $new_pass = _request('pass');
804                        }
805
806                        if (strlen($new_pass)>0) {
807                                include_spip('inc/acces');
808                                include_spip('auth/sha256.inc');
809                                $val['htpass'] = generer_htpass($new_pass);
810                                $val['alea_actuel']  = creer_uniqid();
811                                $val['alea_futur'] = creer_uniqid();
812                                $val['pass'] = _nano_sha256($val['alea_actuel'].$new_pass);
813                                $val['low_sec'] = '';
814                        }
815                        $val['statut'] = (strlen($flux['args']['args'][0]) > 1) ?
816                                $flux['args']['args'][0] : ($config_i3['statut_nouveau'] ?
817                                        $config_i3['statut_nouveau'] : '6forum');
818                }
819
820                /**
821                 * On met le compte en "à confirmer" si on a configuré les choses comme cela
822                 * Dans ce cas on met la bio à '' si elle n'est pas dans le form afin d'enlever le statut temporaire
823                 * qui y est stocké par SPIP
824                 * Sinon si on a la bio dans le formulaire et qu'on la reçoit, on met directement un statut à
825                 * l'auteur, sinon on laisse l'ancien (nouveau normalement)
826                 */
827                if ($config_i3['valider_comptes'] == 'on') {
828                        $mode = 'aconfirmer';
829                        if (!$val['bio']) {
830                                $val['bio'] = '';
831                        }
832                        $val['statut'] = '8aconfirmer';
833                } elseif (_request('bio')) {
834                        /**
835                         * Si on a le champ bio dans le formulaire on force le statut
836                         */
837                        $val['statut'] = (strlen($flux['args']['args'][0]) > 1) ?
838                                $flux['args']['args'][0] : ($config_i3['statut_nouveau'] ?
839                                        $config_i3['statut_nouveau'] : '6forum');
840                }
841
842                if (strlen($val['pass']) == 0) {
843                        unset($val['pass']);
844                }
845
846                if (function_exists('test_inscription')) {
847                        $f = 'test_inscription';
848                } else {
849                        $f = 'test_inscription_dist';
850                }
851
852                $desc = $f($user['bio'], $mail, $valeurs['nom'], $user['id_auteur']);
853
854                if (is_array($desc) and $mail = $desc['email']) {
855                        /**
856                         * On recrée le pass pour être sûr d'avoir le bon
857                         */
858                        $desc['pass'] = creer_pass_pour_auteur($user['id_auteur']);
859                        $desc['login'] = $val['login'];
860
861                        /**
862                         * Mise à jour des infos
863                         */
864                        sql_updateq(
865                                'spip_auteurs',
866                                $val,
867                                'id_auteur = '.$user['id_auteur']
868                        );
869
870                        $args = array_merge(
871                                $flux['args'],
872                                array(
873                                        'id_auteur' => $user['id_auteur'],
874                                        'champs' => $valeurs
875                                )
876                        );
877
878                        /**
879                         * Prise en charge du logo
880                         */
881                        if (isset($_FILES['logo']) and ($_FILES['logo']['error'] == 0)) {
882                                $chercher_logo = charger_fonction('chercher_logo', 'inc');
883
884                                // supprimer l'ancien logo
885                                if ($on = $chercher_logo($id_auteur, 'id_auteur', 'on')) {
886                                        spip_unlink($on[0]);
887                                }
888
889                                include_spip('formulaires/editer_logo');
890                                include_spip('action/editer_logo');
891                                $sources = formulaire_editer_logo_get_sources();
892                                foreach ($sources as $etat => $file) {
893                                        if ($file and $file['error'] == 0) {
894                                                logo_modifier('auteur', $user['id_auteur'], $etat, $file);
895                                                set_request('logo_up', ' ');
896                                        }
897                                }
898                                // indiquer qu'on doit recalculer les images
899                                $GLOBALS['var_images'] = true;
900                        }
901                        /**
902                         * On appelle le pipeline traiter de inscription3
903                         * On connait dorénavant l'id_auteur
904                         * Ce pipeline doit retourner un array avec les valeurs possibles suivantes :
905                         * - ne_pas_confirmer_par_mail boolean (permet de squeezer la notification)
906                         * - message_ok string (permet de modifier le message de retour du formulaire)
907                         * - editable boolean (permet de modifier le comportement d'affichage au retour)
908                         */
909                        $traiter_plugin = pipeline(
910                                'i3_traiter_formulaire',
911                                array(
912                                        'args' => $args,
913                                        'data' => $flux['data']
914                                )
915                        );
916                        if (!$traiter_plugin['ne_pas_confirmer_par_mail']) {
917                                if ($mode == 'aconfirmer') {
918                                        $traiter_plugin['message_ok'] = _T('inscription3:form_retour_aconfirmer');
919                                        if ($notifications = charger_fonction('notifications', 'inc')) {
920                                                $notifications('i3_inscriptionauteur', $user['id_auteur'],
921                                                        array('statut' => '8aconfirmer')
922                                                );
923                                        }
924                                } elseif ($mode == 'inscription_pass') {
925                                        $traiter_plugin['message_ok'] = _T('inscription3:form_retour_inscription_pass');
926                                        if ($notifications = charger_fonction('notifications', 'inc')) {
927                                                $notifications('i3_inscriptionauteur', $user['id_auteur'],
928                                                        array('statut' => $val['statut'],'pass' => 'ok')
929                                                );
930                                        }
931                                        if ($config_i3['auto_login'] == 'on') {
932                                                $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur='.intval($user['id_auteur']));
933                                                include_spip('inc/auth');
934                                                auth_loger($auteur);
935                                                $traiter_plugin['message_ok'] = _T('inscription3:form_retour_inscription_pass_logue');
936                                        }
937                                } else {
938                                        $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
939                                        if (function_exists('envoyer_inscription3')) {
940                                                $mode = $config_i3['statut_nouveau'];
941                                                $f = 'envoyer_inscription3';
942                                                list($sujet,$msg,$from,$head) = $f($desc, $nom, $mode);
943                                        }
944                                        if ($desc) {
945                                                if (!$envoyer_mail($mail, $sujet, $msg, $from, $head)) {
946                                                        $flux['data']['message_erreur'] = _T('form_forum_probleme_mail');
947                                                } else {
948                                                        $traiter_plugin['message_ok'] = _T('form_forum_identifiant_mail');
949                                                }
950                                        } else {
951                                                $traiter_plugin['message_ok'] = _T('form_forum_identifiant_mail');
952                                        }
953                                }
954                        }
955                        $flux['data']['editable'] = $traiter_plugin['editable'];
956                        $flux['data']['message_ok'] = $traiter_plugin['message_ok'];
957                        $flux['data']['redirect'] = $traiter_plugin['redirect'];
958                }
959        }
960        return $flux;
961}
962
963/**
964 * Insertion dans le pipeline recuperer_fond (SPIP)
965 * Insère des champs dans le formulaire d'inscription
966 * Ajoute un vérificateur de complexité de mot de passe sur les formulaires de mot de passe
967 * et d'édition d'auteur si besoin
968 *
969 * @param array $flux
970 * @return array
971 */
972function inscription3_recuperer_fond($flux) {
973        $forms = array(
974                'formulaires/inscription',
975                'formulaires/login',
976                'formulaires/mot_de_passe',
977                'formulaires/editer_auteur'
978        );
979        if (in_array($flux['args']['fond'], $forms)) {
980                if (!function_exists('lire_config')) {
981                        include_spip('inc/config');
982                }
983                $config = lire_config('inscription3', array());
984                if ($flux['args']['fond']=='formulaires/inscription') {
985                        $insc = recuperer_fond('formulaires/inc-inscription-inscription3', $flux['data']['contexte']);
986                        $flux['data']['texte'] = preg_replace(
987                                "/(<(li|div) [^>]*class=[\"']editer saisie_mail_inscription.*<\/(li|div)>)/Uims",
988                                "\\1". $insc,
989                                $flux['data']['texte'],
990                                1
991                        );
992                        if (($texte_inscription = $config['inscription_texte']) and ($texte_inscription != 'origine')) {
993                                switch ($texte_inscription) {
994                                        case 'aucun':
995                                                $flux['data']['texte'] = preg_replace(
996                                                        "/<p [^>]*class=[\"']explication.*<\/p>/Uims",
997                                                        '',
998                                                        $flux['data']['texte'],
999                                                        1
1000                                                );
1001                                                break;
1002                                        case 'libre':
1003                                                $texte = PtoBR(propre($config['inscription_texte_libre']));
1004                                                $flux['data']['texte'] = preg_replace(
1005                                                        "/(<p class=[\"']explication mode[\"']>)(.*)(<\/p>)/Uims",
1006                                                        "\\1".$texte."\\3",
1007                                                        $flux['data']['texte'],
1008                                                        1
1009                                                );
1010                                                break;
1011                                }
1012                        }
1013                }
1014                if ($flux['args']['fond']=='formulaires/login') {
1015                        if (isset($config['affordance_form'])
1016                                and ($type_affordance = $config['affordance_form'])
1017                                and ($type_affordance != 'login')) {
1018                                switch ($type_affordance) {
1019                                        case 'email':
1020                                                $label = _T('inscription3:votre_mail');
1021                                                break;
1022                                        case 'login_et_email':
1023                                                $label = _T('inscription3:votre_login_mail');
1024                                                break;
1025                                        case 'libre':
1026                                                $label = $config['inscription3/affordance_form_libre'] ?
1027                                                        $config['inscription3/affordance_form_libre'] : _T('login_login2');
1028                                                break;
1029                                }
1030                                if ($label) {
1031                                        $flux['data']['texte'] = preg_replace(
1032                                                '/(<label.*for="var_login">)(.*)(<\/label>)/Uims',
1033                                                "\\1".$label."\\3",
1034                                                $flux['data']['texte'],
1035                                                1
1036                                        );
1037                                }
1038                        }
1039                }
1040                /**
1041                 * On ajoute un vérificateur de complexité de mot de passe
1042                 */
1043                if (
1044                        isset($config['inscription3/password_complexite'])
1045                        and $config['inscription3/password_complexite'] == 'on'
1046                        and in_array($flux['args']['fond'], array('formulaires/mot_de_passe','formulaires/editer_auteur'))) {
1047                        $js = recuperer_fond('formulaires/inc-js_pass_verification', $flux['data']['contexte']);
1048                        $flux['data']['texte'] = preg_replace('/(<\/form>)(.*)/Uims', "\\1".$js."\\2", $flux['data']['texte'], 1);
1049                }
1050        }
1051        return $flux;
1052}
1053
1054/**
1055 * Insertion dans le pipeline editer_contenu_objet (SPIP)
1056 * Enlève les champs dans le formulaire d'édition d'auteur pour le profil utilisateur
1057 * comme il est configuré dans inscription3
1058 *
1059 * @param array $flux
1060 * @return array
1061 */
1062function inscription3_editer_contenu_objet($flux) {
1063        $args = $flux['args'];
1064        $type = $args['type'];
1065        if ($type == 'auteur' and intval($args['id']) > 0 and !test_espace_prive()) {
1066                if (!function_exists('lire_config')) {
1067                        include_spip('inc/config');
1068                }
1069                $config = lire_config('inscription3', array());
1070                $champs_spip = array('nom','email','bio','pgp','url_site','nom_site','login','pass');
1071                $champs_vires = array();
1072                $inserer_saisie = '';
1073                foreach ($champs_spip as $champ) {
1074                        if (isset($config[$champ.'_fiche_mod']) and $config[$champ.'_fiche_mod'] != 'on') {
1075                                if ($champ == 'login') {
1076                                        $flux['data'] = preg_replace(
1077                                                "/(<(li|div) [^>]*class=[\"']editer editer_new_($champ).*<\/(li|div)>)/Uims",
1078                                                '',
1079                                                $flux['data'],
1080                                                1
1081                                        );
1082                                } elseif ($champ == 'pass') {
1083                                        $flux['data'] = preg_replace(
1084                                                "/(<(li|div) [^>]*class=[\"']editer editer_new_($champ).*<\/(li|div)>)/Uims",
1085                                                '',
1086                                                $flux['data'],
1087                                                1
1088                                        );
1089                                        $flux['data'] = preg_replace(
1090                                                "/(<(li|div) [^>]*class=[\"']editer editer_new_($champ)2.*<\/(li|div)>)/Uims",
1091                                                '',
1092                                                $flux['data'],
1093                                                1
1094                                        );
1095                                } else {
1096                                        $flux['data'] = preg_replace(
1097                                                "/(<(li|div) [^>]*class=[\"']editer editer_($champ).*<\/(li|div)>)/Uims",
1098                                                '',
1099                                                $flux['data'],
1100                                                1
1101                                        );
1102                                }
1103                                $champs_vires[] = $champ;
1104                                if (in_array($champ, array('nom','email'))) {
1105                                        $inserer_saisie .= "<input type='hidden' name='$champ' value='".$flux['args']['contexte'][$champ]."' />\n";
1106                                }
1107                        }
1108                }
1109
1110                /**
1111                 * On vire le champs création du formulaire (ne doit pas être modifié manuellement)
1112                 * Si on n'a pas ce champs rempli, on utilise la date actuelle pour le remplir
1113                 * Logiquement ce champs est rempli automatiquement via pre_insertion pour tous les auteurs
1114                 */
1115                if (isset($config['creation']) and $config['creation'] == 'on') {
1116                        $flux['data'] = preg_replace(
1117                                inscription3_regexp_capturer_balise('class', 'editer editer_creation', true),
1118                                '',
1119                                $flux['data'],
1120                                1
1121                        );
1122                        spip_log(inscription3_regexp_capturer_balise('class', 'editer editer_cextra_creation', true), 'test.'._LOG_ERREUR);
1123                        $flux['data'] = preg_replace(
1124                                inscription3_regexp_capturer_balise('class', 'editer editer_cextra_creation', true),
1125                                '',
1126                                $flux['data'],
1127                                1
1128                        );
1129
1130                        if ($flux['args']['contexte']['creation'] == '0000-00-00 00:00:00') {
1131                                $flux['args']['contexte']['creation'] = date('Y-m-d H:i:s');
1132                        }
1133                        $inserer_saisie .= "<input type='hidden' name='creation' value='".$flux['args']['contexte']['creation']."' />\n";
1134                }
1135
1136                if (!test_espace_prive() and isset($config['logo_fiche_mod']) and $config['logo_fiche_mod'] == 'on') {
1137                        $flux['data'] = preg_replace(
1138                                '/<(form.*[^>])>/Uims',
1139                                '<\\1 enctype=\'multipart/form-data\'>',
1140                                $flux['data'],
1141                                1
1142                        );
1143                        $saisie_logo = recuperer_fond('formulaires/inscription_logo', $flux['args']['contexte']);
1144                        $flux['data'] = preg_replace(
1145                                '/(<!--extra-->)/is',
1146                                '<ul class="champs_extras inscription_logo">'.$saisie_logo.'</ul>'."\n".'$1',
1147                                $flux['data']
1148                        );
1149                }
1150                if (in_array('url_site', $champs_vires) and in_array('nom_site', $champs_vires)) {
1151                        $flux['data'] = preg_replace(
1152                                "/(<(li|div) [^>]*class=[\"']editer_liens.*<\/(li|div)>)/Uims",
1153                                '',
1154                                $flux['data'],
1155                                1
1156                        );
1157                }
1158                if (in_array('pass', $champs_vires) and in_array('login', $champs_vires)) {
1159                        $flux['data'] = preg_replace(
1160                                "/(<(li|div) [^>]*class=[\"']editer_identification.*<\/(li|div)>)/Uims",
1161                                '',
1162                                $flux['data'],
1163                                1
1164                        );
1165                }
1166                if (strlen($inserer_saisie)) {
1167                        $flux['data'] = preg_replace('/(<!-- controles md5 -->)/is', $inserer_saisie."\n".'$1', $flux['data']);
1168                }
1169        }
1170        return $flux;
1171}
1172
1173
1174/**
1175 * Retourne une expression régulière complexe de capture d'une balise spécifique
1176 * ayant un attribut à une certaine valeur.
1177 *
1178 * Cette balise (une div par défaut) au milieu d'un code HTML peut contenir
1179 * d'autres balises à l'intérieur.
1180 *
1181 * @example `inscription3_regexp_capturer_balise('id', 'content')
1182 * @example `inscription3_regexp_capturer_balise('class', 'editer editer_truc', true)
1183 *
1184 * @link http://mac-blog.org.ua/regex-for-div-and-it-content/ pour l'inspiration
1185 * @link http://php.net/manual/fr/regexp.reference.recursive.php#95568
1186 *
1187 * @note
1188 *     Les expressions régulières ne sont pas adaptées pour traiter du html…
1189 *     Mais on tente un miracle.
1190 * @note
1191 *     Mélange adapté entre 3 expressions :
1192 *     ```
1193 *     ",(<div [^>]*class=[\"']editer editer_creation.*<\/div>),Uims"
1194 *     '#<div\s+class="s"[^>]*>((?:(?:(?!<div[^>]*>|</div>).)+|<div[^>]*>[\s\S]*?</div>)*)</div>#six'
1195 *     "/<([\w]+)([^>]*?)(([\s]*\/>)|" . "(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/sm";
1196 *     ```
1197 *
1198 * @param string $attr
1199 *     Attribut à chercher (exemple: class)
1200 * @param string $valeur
1201 *     Valeur à chercher (exemple: editer editer_truc)
1202 * @param bool $flou
1203 *     True si l'attribut peut avoir d'autres éléments avant ou après la valeur cherchée
1204 * @param string $balise
1205 *     La balise qu'on recherche
1206 * @param string $modificateurs
1207 *     Modificateurs de l'expression (pas de modificateur U qui provoquerait un echec).
1208 * @return string Expression régulière
1209**/
1210function inscription3_regexp_capturer_balise($attr, $valeur, $flou = false, $balise = 'div', $modificateurs = 'ims') {
1211        $regexp =
1212                # une balise indiquée avec un attribut ouvrant avec soit " ou ' (info capturée en \1)
1213                '#<' . $balise . ' [^>]*' . $attr . '=(["\'])'
1214                # la valeur cherchée, avec ou sans flou autour
1215                . ($flou ? '(?:(?!\1).)*' . $valeur . '(?:(?!\1).)*': $valeur)
1216                # la fin de guillement de l'attribut trouvé
1217                . '\1'
1218                # juste à la fin de la div ouvrante trouvée
1219                . '[^>]*>'
1220                # autant de couples de balises (dont autofermantes) et commentaires qu'on veut
1221                        // des balises imbriquées ou non
1222                        . '(?<balises>('
1223                                // pas de début de balise
1224                                . '([^<]*?)('
1225                                        // une balise qui s'ouvre
1226                                        . '<(?<tag>[\w]+)([^>]*?)'
1227                                        // et soit
1228                                        . '('
1229                                                // 'une balise autofermante'
1230                                                . '([\s]*\/>)'
1231                                                // 'une fermeture de balise et soit
1232                                                . '|(>(('
1233                                                        . '('
1234                                                                // pas de balise ouvrante
1235                                                                . '[^<]*?'
1236                                                                // ou commentaire html
1237                                                                . '|<\!\-\-.*?\-\->'
1238                                                                // ou script html
1239                                                                . '|<script[^>]*>.*?<\/script>'
1240                                                        .')'
1241                                                        // ou recursion sur balise
1242                                                        . '|(?&balises)'
1243                                                // 0 ou plusieurs fois
1244                                                . ')*)'
1245                                                // et la fin de la balise
1246                                                . '<\/(?&tag)[\s]*>)'
1247                                        . ')'
1248                                . ')'
1249                        . ')*)'
1250                        // pas de début de balise
1251                        . '([^<]*?)'
1252                # la fin de notre balise
1253                . '</' . $balise . '>'
1254                # les modificateurs
1255                . '#' . $modificateurs;
1256
1257        return $regexp;
1258}
1259
1260/**
1261 * Insertion dans le pipeline "notifications_destinataires" (SPIP)
1262 *
1263 * En fonction du type de notification, rempli un tableau d'adresses emails
1264 *
1265 * @param array $flux Le contexte du pipeline
1266 * @return array
1267 */
1268function inscription3_notifications_destinataires($flux) {
1269        $quoi = $flux['args']['quoi'];
1270        $options = $flux['args']['options'];
1271
1272        /**
1273         * Cas de la validation ou invalidation d'un compte d'un utilisateur
1274         * Cas également de l'inscription d'un auteur
1275         * Envoi à l'utilisateur ($options['type'] == 'user')
1276         */
1277        if (($quoi=='instituerauteur' and $options['statut_ancien'] == '8aconfirmer' and $options['type'] == 'user')
1278                or ($quoi=='i3_inscriptionauteur' and $options['type'] == 'user')) {
1279                $id_auteur = $flux['args']['id'];
1280                include_spip('base/abstract_sql');
1281                $mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.intval($id_auteur));
1282                $flux['data'][] = $mail;
1283        } elseif (($quoi=='instituerauteur' and $options['statut_ancien'] == '8aconfirmer'
1284                and $options['type'] == 'admin')
1285                or ($quoi=='i3_inscriptionauteur' and $options['type'] == 'admin')) {
1286                        /**
1287                         * Cas de la validation ou invalidation d'un compte d'un utilisateur
1288                         * Envoi aux administrateurs ($options['type'] == 'admin')
1289                         */
1290                        /**
1291                         * Aller chercher dans la conf les admins à notifier si configuré
1292                         */
1293                        if (is_array(lire_config('inscription3/admin_notifications'))) {
1294                                $id_admins = lire_config('inscription3/admin_notifications');
1295                                $admins = sql_allfetsel(
1296                                        'email',
1297                                        'spip_auteurs',
1298                                        'statut="0minirezo" and ' . sql_in('id_auteur', $id_admins)
1299                                );
1300                        } else {
1301                                $admins = sql_allfetsel('email', 'spip_auteurs', 'statut="0minirezo" and webmestre="oui"');
1302                        }
1303
1304                foreach ($admins as $qui) {
1305                        $flux['data'][] = $qui['email'];
1306                }
1307        }
1308        return $flux;
1309}
1310
1311/**
1312 * Insertion dans le pipeline taches_generales_cron (SPIP)
1313 *
1314 * Vérifie la présence à intervalle régulier d'utilisateurs à valider ou invalider et notifie les admins
1315 *
1316 * @param array $taches_generales Un array des tâches du cron de SPIP
1317 * @return L'array des taches complété
1318 */
1319function inscription3_taches_generales_cron($taches_generales) {
1320        $taches_generales['inscription3_taches_generales'] = 24*60*60;
1321        return $taches_generales;
1322}
1323
1324/**
1325 * Insertion dans le pipeline pre_insertion (SPIP)
1326 *
1327 * Insérer la date d'inscription à la création de l'auteur
1328 * - la date d'inscription ne se met qu'à ce moment là
1329 *
1330 * @param array $flux Le contexte du pipeline
1331 * @return array
1332 */
1333function inscription3_pre_insertion($flux) {
1334        include_spip('inc/config');
1335        if (lire_config('inscription3/creation') == 'on' and $flux['args']['table'] == 'spip_auteurs') {
1336                $flux['data']['creation'] = date('Y-m-d H:i:s');
1337        }
1338        return $flux;
1339}
1340
1341/**
1342 * Insertion dans le pipeline openid_recuperer_identite (OpenID)
1343 * On décrypte les informations fournies par OpenID pour les insérer dans notre formulaire
1344 *
1345 * @param $flux array
1346 *      Le contexte du pipeline
1347 *      Les informations fournies par le compte openid de la personne souhaitant s'inscrire sont dans $flux['args']
1348 * @return $flux
1349 *      Le contexte du pipeline décrypté, on place dans $flux['data'] les informations qui nous intéresse
1350 */
1351function inscription3_openid_recuperer_identite($flux) {
1352        if (isset($flux['args']['dob'])) {
1353                $flux['data']['naissance'] = $flux['args']['dob'];
1354        }
1355
1356        if (isset($flux['args']['country'])) {
1357                $id_pays = sql_getfetsel('id_pays', 'spip_geo_pays', 'code_iso='.sql_quote($flux['args']['country']));
1358                $flux['data']['pays'] = $id_pays;
1359        }
1360        if (isset($flux['args']['postcode'])) {
1361                $flux['data']['code_postal'] = $flux['args']['postcode'];
1362        }
1363
1364        if (isset($flux['args']['gender'])) {
1365                $flux['data']['sexe'] = $flux['args']['gender'];
1366        }
1367
1368        if (isset($flux['args']['fullname'])) {
1369                $noms = explode(' ', $flux['args']['fullname']);
1370                $flux['data']['prenom'] = $noms[0];
1371                array_shift($noms);
1372                $flux['data']['nom_famille'] = implode(' ', $noms);
1373        }
1374        return $flux;
1375}
1376
1377/**
1378 * Insertion dans le pipeline openid_inscrire_redirect (OpenID)
1379 */
1380function inscription3_openid_inscrire_redirect($flux) {
1381
1382        $auteur = $flux['args']['infos_auteur'];
1383
1384        $url = $flux['args']['url'];
1385
1386        $url = parametre_url($url, 'code_postal', $auteur['code_postal']);
1387        $url = parametre_url($url, 'pays', $auteur['pays']);
1388        $url = parametre_url($url, 'naissance', $auteur['naissance']);
1389        $url = parametre_url($url, 'sexe', $auteur['sexe']);
1390        $url = parametre_url($url, 'login', $auteur['login']);
1391        $url = parametre_url($url, 'nom_famille', $auteur['nom_famille']);
1392        $url = parametre_url($url, 'prenom', $auteur['prenom']);
1393        $flux['data'] = $url;
1394        return $flux;
1395}
1396
1397/**
1398 * Insertion dans le pipeline post_edition (SPIP)
1399 *
1400 * Notifier les admins et les users quand ils passent de 8aconfirmer à un statut valide
1401 *
1402 * @param array $flux
1403 *              Le contexte du pipeline
1404 * @return array $flux
1405 *              Le contexte du pipeline modifié
1406 */
1407function inscription3_post_edition($flux) {
1408        if (isset($flux['args']['action'])
1409                and $flux['args']['action'] == 'instituer'
1410                and $flux['args']['table'] == 'spip_auteurs'
1411                and $flux['args']['statut_ancien'] == '8aconfirmer') {
1412                if ($notifications = charger_fonction('notifications', 'inc')) {
1413                        $notifications('i3_inscriptionauteur', $flux['args']['id_objet'],
1414                                array('statut_ancien' => '8aconfirmer', 'statut_nouveau' => $flux['data']['statut'])
1415                        );
1416                }
1417        }
1418        return $flux;
1419}
Note: See TracBrowser for help on using the repository browser.