source: spip-zone/_plugins_/profils/trunk/profils_pipelines.php @ 114843

Last change on this file since 114843 was 114843, checked in by rastapopoulos@…, 5 months ago

1) On force le mot de passe à non vide, afin d'autoriser les gens à le changer ! 2) On corrige tous les anciens profils avec pass non vide aussi. 3) On ajoute une nouvelle option pour les admins, leur permettant d'envoyer une notification aux gens quand ça créé un nouveau compte, aussi bien par le formulaire unitaire que par l'importation CSV. 4) Au passage on corrige une erreur SQL pour la suppression des coordonnées : seulement quand c'était une existante, pas new… => On passe en 1.5, en plus avec les modifs de tcharlss juste avant sur l'affichage.

File size: 10.7 KB
Line 
1<?php
2/**
3 * Utilisations de pipelines par Profils
4 *
5 * @plugin     Profils
6 * @copyright  2018
7 * @author     Les Développements Durables
8 * @licence    GNU/GPL
9 * @package    SPIP\Profils\Pipelines
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 * Optimiser la base de données
18 *
19 * Supprime les objets à la poubelle.
20 *
21 * @pipeline optimiser_base_disparus
22 * @param  array $flux Données du pipeline
23 * @return array       Données du pipeline
24 */
25function profils_optimiser_base_disparus($flux) {
26        sql_delete('spip_profils', "statut='poubelle' AND maj < " . $flux['args']['date']);
27
28        return $flux;
29}
30
31/**
32 * Liste les saisies à ajouter au formulaire d'inscription
33 *
34 * @pipeline formulaire_saisies
35 * @param  array $flux Données du pipeline
36 * @return array       Données du pipeline
37 */
38function profils_formulaire_saisies($flux) {
39        if ($flux['args']['form'] == 'inscription') {
40                include_spip('inc/profils');
41               
42                // Si on a une info lors de l'appel
43                if (isset($flux['args']['args'][1]['profil'])) {
44                        $id_ou_identifiant_profil = $flux['args']['args'][1]['profil'];
45                }
46                else {
47                        $id_ou_identifiant_profil = '';
48                }
49               
50                if ($saisies = profils_chercher_saisies_profil('inscription', 'new', $id_ou_identifiant_profil)) {
51                        $flux['data'] = $saisies;
52                }
53        }
54       
55        return $flux;
56}
57
58/**
59 * Ajoute les champs au formulaire d'inscription
60 *
61 * @pipeline formulaire_fond
62 * @param  array $flux Données du pipeline
63 * @return array       Données du pipeline
64 */
65function profils_formulaire_fond($flux) {
66        if (
67                $flux['args']['form'] == 'inscription'
68                and $saisies = $flux['args']['contexte']['_saisies']
69        ) {
70                // On commence par virer les champs de départ car on va faire à notre sauce
71                $flux['data'] = preg_replace(
72                        "%<div[^>]*saisie_(nom|mail)_inscription[^>]*>.*?</div>%ims",
73                        '',
74                        $flux['data']
75                );
76               
77                // On génère le HTML des champs
78                $contexte = $flux['args']['contexte'];
79                $contexte['saisies'] = $contexte['_saisies'];
80                unset($contexte['_saisies']);
81                $champs = recuperer_fond('inclure/generer_saisies', $contexte);
82               
83                // On insère
84                $flux['data'] = preg_replace(
85                        "|</fieldset>|Uims",
86                        "\\0" . $champs,
87                        $flux['data'],
88                        1
89                );
90        }
91
92        return $flux;
93}
94
95/**
96 * Remplit les bonnes valeurs pour l'inscription AVANT son traiter
97 *
98 * @pipeline formulaire_verifier
99 * @param  array $flux Données du pipeline
100 * @return array       Données du pipeline
101 */
102function profils_formulaire_verifier($flux) {
103        if ($flux['args']['form'] == 'inscription') {
104                include_spip('inc/profils');
105               
106                $champs_auteur = _request('auteur');
107                $champs_organisation = _request('organisation');
108                $champs_contact = _request('contact');
109                $champs_coordonnees = _request('coordonnees');
110                $email_principal = '';
111                $nom_principal = '';
112               
113                // Si on a une info lors de l'appel
114                if (isset($flux['args']['args'][1]['profil'])) {
115                        $id_ou_identifiant_profil = $flux['args']['args'][1]['profil'];
116                }
117                else {
118                        $id_ou_identifiant_profil = '';
119                }
120               
121                // On cherche le bon profil
122                if ($profil = profils_recuperer_profil($id_ou_identifiant_profil) and $config = $profil['config']) {
123                        // Préparer certaines valeurs magiquement suivant la configuration
124                       
125                        // Email principal
126                        if ($champ_email_principal = profils_chercher_champ_email_principal($config) and is_array($champ_email_principal)) {
127                                $email_principal = _request(array_shift($champ_email_principal));
128                                foreach ($champ_email_principal as $cle) {
129                                        $email_principal = $email_principal[$cle];
130                                }
131                        }
132                       
133                        // Nom principal (peut-être vérifier que le champ est censé être là)
134                        if (
135                                !$nom_principal = $champs_auteur['nom']
136                                and !$nom_principal = $champs_organisation['nom']
137                                and !$nom_principal = trim($champs_contact['prenom'] . ' ' . $champs_contact['nom'])
138                                and $email_principal
139                        ) {
140                                $nom_principal = explode('@', $email_principal);
141                                $nom_principal = array_shift($nom_principal);
142                        }
143                       
144                        // Pseudo et email repris des autres champs
145                        set_request('mail_inscription', $email_principal);
146                        set_request('nom_inscription', $nom_principal);
147                        // Et donc pas d'erreur sur les champs d'origine
148                        unset($flux['data']['mail_inscription']);
149                        unset($flux['data']['nom_inscription']);
150                       
151                        // On enregistre le profil pour ne pas avoir à refaire
152                        set_request('_profil', $profil);
153                }
154        }
155       
156        return $flux;
157}
158
159/**
160 * Traitement supplémentaire après l'inscription
161 *
162 * @pipeline formulaire_traiter
163 * @param  array $flux Données du pipeline
164 * @return array       Données du pipeline
165 */
166function profils_formulaire_traiter($flux) {
167        // Si inscription et qu'on a bien un id_auteur à la fin
168        if ($flux['args']['form'] == 'inscription' and $id_auteur = $flux['data']['id_auteur']) {
169                $retours = array();
170                $champs_auteur = _request('auteur');
171                $champs_organisation = _request('organisation');
172                $champs_contact = _request('contact');
173                $champs_coordonnees = _request('coordonnees');
174                $email_principal = _request('mail_inscription');
175                $nom_principal = _request('nom_inscription');
176                $profil = _request('_profil');
177               
178                // On utilise la redirection si fournie (3ème argument lors de l'appel)
179                if (isset($flux['args']['args'][2])) {
180                        $retour = $flux['args']['args'][2];
181                }
182               
183                if ($profil and $config = $profil['config']) {
184                        include_spip('inc/editer');
185                       
186                        // Récupérer les objets liés au profil utilisateur
187                        extract(profils_chercher_ids_profil($id_auteur, $profil['id_profil']));
188                       
189                        // On met en request racine les champs trouvés pour l'auteur
190                        profils_traiter_peupler_request('inscription', $champs_auteur, $config['auteur']);
191                        // S'il y a un email principal, on l'ajoute
192                        if ($email_principal) {
193                                set_request('email', $email_principal);
194                        }
195                        // S'il y a un nom principal, on l'ajoute
196                        if ($nom_principal) {
197                                set_request('nom', $nom_principal);
198                        }
199                       
200                        $retours_auteur = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, '');
201                        $retours = array_merge($retours, $retours_auteur);
202                        //~ $auteur = sql_fetsel('id_auteur, nom, email', 'spip_auteurs', 'id_auteur = '.$id_auteur);
203                       
204                        // On voit si on doit placer dans un annuaire
205                        if (defined('_DIR_PLUGIN_CONTACTS') and lire_config('contacts_et_organisations/utiliser_annuaires')) {
206                                // On teste s'il faut créer un nouvel annuaire
207                                if (
208                                        // S'il n'y a pas d'annuaire configuré
209                                        !isset($config['id_annuaire'])
210                                        or !$id_annuaire = intval($config['id_annuaire'])
211                                        // Ou s'il n'existe plus
212                                        or !sql_getfetsel('id_annuaire', 'spip_annuaires', 'id_annuaire='.$id_annuaire)
213                                ) {
214                                        // On cherche s'il existe un annuaire du même identifiant que le profil
215                                        if (!$id_annuaire = sql_getfetsel('id_annuaire', 'spip_annuaires', 'identifiant='.sql_quote($profil['identifiant']))) {
216                                                // Alors on en crée un nouveau
217                                                $id_annuaire = objet_inserer(
218                                                        'annuaire',
219                                                        null,
220                                                        array('titre'=>$profil['titre'], 'identifiant'=>$profil['identifiant'])
221                                                );
222                                        }
223                                }
224                               
225                                // On le met en requête
226                                set_request('id_annuaire', $id_annuaire);
227                        }
228                       
229                        // Si la fiche principale est une organisation
230                        set_request('id_auteur', $id_auteur);
231                        if ($config['activer_organisation'] and $id_organisation) {
232                                profils_traiter_peupler_request('inscription', $champs_organisation, $config['organisation']);
233                                $retours_organisation = formulaires_editer_objet_traiter('organisation', $id_organisation, 0, 0, $retour, '');
234                                $retours = array_merge($retours, $retours_organisation);
235                                $id_organisation = $retours['id_organisation'];
236                               
237                                // Si on a aussi un contact en plus
238                                if ($config['activer_contact'] and $id_contact) {
239                                        // On précise l'organisation parente
240                                        set_request('id_parent', $id_organisation);
241                                        profils_traiter_peupler_request('inscription', $champs_contact, $config['contact']);
242                                        $retours_contact = formulaires_editer_objet_traiter('contact', $id_contact, $id_organisation, 0, $retour, '');
243                                        $retours = array_merge($retours_contact, $retours);
244                                        $id_contact = $retours['id_contact'];
245                                }
246                        }
247                        // Sinon si la fiche principale est un contact
248                        elseif ($config['activer_contact'] and $id_contact) {
249                                profils_traiter_peupler_request('inscription', $champs_contact, $config['contact']);
250                                $retours_contact = formulaires_editer_objet_traiter('contact', $id_contact, 0, 0, $retour, '');
251                                $retours = array_merge($retours, $retours_contact);
252                                $id_contact = $retours['id_contact'];
253                        }
254                       
255                        // Et maintenant on s'occupe des coordonnées
256                        // Les tests ont déjà été fait pendant la récup des ids, donc si c'est rempli c'est que c'est bon
257                        if (is_array($coordonnees)) {
258                                foreach ($coordonnees as $objet => $coordonnees_types) {
259                                        $cle_objet = id_table_objet($objet);
260                                       
261                                        if (intval(${$cle_objet})) {
262                                                set_request('objet', $objet);
263                                                set_request('id_objet', ${$cle_objet});
264                                               
265                                                foreach ($coordonnees_types as $coordonnee => $types) {
266                                                        foreach ($types as $type => $id_coordonnee) {
267                                                                // Si on le trouve bien dans ce qui a été envoyé du formulaire
268                                                                if ($champs_coordonnees[$objet][$coordonnee][$type ? $type : 0]) {
269                                                                        // On met en request racine les champs de cette coordonnée
270                                                                        $coordonnee_remplie = false;
271                                                                        foreach ($champs_coordonnees[$objet][$coordonnee][$type ? $type : 0] as $champ=>$valeur) {
272                                                                                // S'il y a au moins un champ rempli, la coordonnée est à remplir
273                                                                                if ($valeur) {
274                                                                                        $coordonnee_remplie = true;
275                                                                                        set_request($champ, $valeur);
276                                                                                }
277                                                                        }
278                                                                       
279                                                                        // Si la coordonnée est à remplir on la traite
280                                                                        if ($coordonnee_remplie) {
281                                                                                set_request('type', $type);
282                                                                                // Enfin on traite la coordonnée
283                                                                                $retours_coordonnee = formulaires_editer_objet_traiter(objet_type($coordonnee), $id_coordonnee, 0, 0, $retour, '');
284                                                                                $retours = array_merge($retours_coordonnee, $retours);
285                                                                        }
286                                                                        // Sinon, tous les champs sont vides, on peut la supprimer pour faire du ménage, si c'est une coordonnée existante
287                                                                        elseif ($id_coordonnee = intval($id_coordonnee)) {
288                                                                                sql_delete(table_objet_sql($coordonnee), id_table_objet($coordonnee) . '=' . $id_coordonnee);
289                                                                                sql_delete(table_objet_sql($coordonnee) . '_liens', id_table_objet($coordonnee) . '=' . $id_coordonnee);
290                                                                        }
291                                                                }
292                                                        }
293                                                }
294                                        }
295                                }
296                        }
297                }
298               
299                if ($retours) {
300                        $flux['data'] = array_merge($flux['data'], $retours);
301                }
302        }
303       
304        return $flux;
305}
306
307/**
308 * Ajouter la liste des comptes d'un profil
309 *
310 * @pipeline affiche_enfants
311 * @param  array $flux Données du pipeline
312 * @return array       Données du pipeline
313 */
314function profils_afficher_config_objet($flux) {
315        if (
316                $flux['args']['type'] == 'profil'
317                and isset($flux['args']['id'])
318                and $id_profil = $flux['args']['id']
319        ) {
320                $importer = recuperer_fond('prive/squelettes/inclure/profil_importer', array('id_profil'=>$id_profil));
321                $flux['data'] .= $importer;
322        }
323       
324        return $flux;
325}
Note: See TracBrowser for help on using the repository browser.