source: spip-zone/_plugins_/profils/trunk/formulaires/profil.php @ 112249

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

Lors d'une création en mode admin pour un autre, si l'email existe déjà avec un compte qui a déjà le même profil uniquement ou s'il n'y a PAS d'email (normalement pas possible en formulaire CVT mais par contre possible en CSV) et qu'il y a un compte avec pile le même nom et qui n'a pas d'email et là aussi déjà le même profil lié : alors on utilise cet utilisateur déjà existant et ces objets liés potentiels (orga, coord etc), et donc on met à jour plutôt que de créer. Du coup cet ajout permet désormais d'importer un CSV autant de fois qu'on veut, et de mettre à jour des dizaines ou centaines de profils, avec l'email comme pivot

File size: 14.0 KB
Line 
1<?php
2/**
3 * Gestion du formulaire de profil des utilisateurs
4 *
5 * @plugin     Profils
6 * @copyright  2018
7 * @author     Les Développements Durables
8 * @licence    GNU/GPL
9 * @package    SPIP\Profils\Formulaires
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16include_spip('base/objets');
17include_spip('inc/actions');
18include_spip('inc/editer');
19include_spip('inc/session');
20include_spip('inc/config');
21include_spip('inc/profils');
22
23/**
24 * Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
25 *
26 * @param int|string $id_auteur
27 *     Identifiant du compte utilistateur. 'new' pour une création.
28 * @param int|string $id_ou_identifiant_profil
29 *     ID SQL ou identifiant textuel du profil voulu
30 * @param string $retour
31 *              URL de redirection une fois terminé
32 * @return string
33 *     Hash du formulaire
34 */
35function formulaires_profil_identifier_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '', $forcer_admin=false) {
36        return serialize(array(intval($id_auteur)));
37}
38
39/**
40 * Saisies du formulaire de profil
41 *
42 * Déclarer les saisies utilisées pour générer le formulaire.
43 *
44 * @param int|string $id_auteur
45 *     Identifiant du compte utilistateur. 'new' pour une création.
46 * @param int|string $id_ou_identifiant_profil
47 *     ID SQL ou identifiant textuel du profil voulu
48 * @param string $retour
49 *              URL de redirection une fois terminé
50 * @return array
51 *     Tableau des saisies
52 */
53function formulaires_profil_saisies_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '', $forcer_admin=false) {
54        $saisies = profils_chercher_saisies_profil('edition', $id_auteur, $id_ou_identifiant_profil);
55       
56        return $saisies;
57}
58
59/**
60 * Chargement du formulaire de profil
61 *
62 * Déclarer les champs postés et y intégrer les valeurs par défaut
63 *
64 * @param int|string $id_auteur
65 *     Identifiant du compte utilistateur. 'new' pour une création.
66 * @param int|string $id_ou_identifiant_profil
67 *     ID SQL ou identifiant textuel du profil voulu
68 * @param string $retour
69 *              URL de redirection une fois terminé
70 * @return array
71 *     Environnement du formulaire
72 */
73function formulaires_profil_charger_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '', $forcer_admin=false) {
74        include_spip('inc/autoriser');
75        $contexte = array();
76       
77        // Non, si pas d'id_auteur, on en crée un nouveau
78        //~ // Si pas d'id_auteur on prend celui connecté actuellement
79        //~ if (!intval($id_auteur)) {
80                //~ $id_auteur = session_get('id_auteur');
81        //~ }
82       
83        // On vérifie que l'auteur existe et qu'on a le droit de le modifier
84        $id_auteur = intval($id_auteur);
85        if (
86                // Si demande de création mais pas le droit
87                (!$id_auteur and !autoriser('creer', 'auteur'))
88                or
89                (
90                        // Ou s'il y a un id_auteur mais qu'il n'existe pas ou pas le droit de le modifier
91                        $id_auteur
92                        and (
93                                !$auteur = sql_fetsel('id_auteur,nom,email', 'spip_auteurs', 'id_auteur = '.$id_auteur)
94                                or (!($id_auteur == session_get('id_auteur')) and !autoriser('modifier', 'auteur', $id_auteur))
95                        )
96                )
97        ) {
98                return array(
99                        'editable' => false,
100                        'message_erreur' => _T('profils:erreur_autoriser_profil'),
101                );
102        }
103       
104        // Récupérer toutes les infos possibles déjà existantes
105        $infos = profils_recuperer_infos($id_auteur, $id_ou_identifiant_profil);
106       
107        // On remplit le contexte avec ces informations (et un préfixe pour le contact)
108        $contexte = array_merge($contexte, $infos);
109       
110        return $contexte;
111}
112
113/**
114 * Vérifications du formulaire de profil
115 *
116 * Vérifier les champs postés et signaler d'éventuelles erreurs
117 *
118 * @uses formulaires_editer_objet_verifier()
119 *
120 * @param int|string $id_auteur
121 *     Identifiant du compte utilistateur. 'new' pour une création.
122 * @param int|string $id_ou_identifiant_profil
123 *     ID SQL ou identifiant textuel du profil voulu
124 * @param string $retour
125 *              URL de redirection une fois terminé
126 * @return array
127 *     Tableau des erreurs
128 */
129function formulaires_profil_verifier_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '', $forcer_admin=false) {
130        $erreurs = array();
131       
132        return $erreurs;
133}
134
135/**
136 * Traitement du formulaire de profil
137 *
138 * Traiter les champs postés
139 *
140 * @uses formulaires_editer_objet_traiter()
141 *
142 * @param int|string $id_auteur
143 *     Identifiant du compte utilistateur. 'new' pour une création.
144 * @param int|string $id_ou_identifiant_profil
145 *     ID SQL ou identifiant textuel du profil voulu
146 * @param string $retour
147 *              URL de redirection une fois terminé
148 * @return array
149 *     Retours des traitements
150 */
151function formulaires_profil_traiter_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '', $forcer_admin=false) {
152        if ($retour) {
153                refuser_traiter_formulaire_ajax();
154        }
155        $retours = array();
156        $champs_auteur = _request('auteur');
157        $champs_organisation = _request('organisation');
158        $champs_contact = _request('contact');
159        $champs_coordonnees = _request('coordonnees');
160        $email_principal = '';
161        $nom_principal = '';
162       
163        // Récupérer les objets liés au profil utilisateur
164        extract(profils_chercher_ids_profil($id_auteur, $id_ou_identifiant_profil));
165       
166        // On cherche le bon profil
167        $id_ou_identifiant_profil = profils_selectionner_profil($id_ou_identifiant_profil, $id_auteur);
168        if ($profil = profils_recuperer_profil($id_ou_identifiant_profil) and $config = $profil['config']) {
169                // Préparer certaines valeurs magiquement suivant la configuration
170               
171                // Email principal
172                if ($champ_email_principal = profils_chercher_champ_email_principal($config) and is_array($champ_email_principal)) {
173                        $email_principal = _request(array_shift($champ_email_principal));
174                        foreach ($champ_email_principal as $cle) {
175                                $email_principal = $email_principal[$cle];
176                        }
177                }
178               
179                // Nom principal (peut-être vérifier que le champ est censé être là)
180                if (
181                        !$nom_principal = $champs_auteur['nom']
182                        and !$nom_principal = $champs_organisation['nom']
183                        and !$nom_principal = trim($champs_contact['prenom'] . ' ' . $champs_contact['nom'])
184                        and $email_principal
185                ) {
186                        $nom_principal = explode('@', $email_principal);
187                        $nom_principal = array_shift($nom_principal);
188                }
189               
190                // Si c'est une demande de création, deux cas possibles
191                if (!$id_auteur or $id_auteur=='new') {
192                        // Si on n'a pas forcé en mode admin ou que personne n'est connecté, c'est alors une inscription de la personne qui a validé
193                        if (!$forcer_admin and !session_get('id_auteur')) {
194                                // Pseudo et email repris des autres champs
195                                set_request('mail_inscription', $email_principal);
196                                set_request('nom_inscription', $nom_principal);
197                                // Inscription en visiteur public
198                                $inscription_dist = charger_fonction('traiter', 'formulaires/inscription');
199                                $retours_inscription = $inscription_dist('6forum','');
200                                $retours = array_merge($retours, $retours_inscription);
201                               
202                                // On récupère l'auteur qui vient d'être créé
203                                $auteur = sql_fetsel('*', 'spip_auteurs', 'email = '.sql_quote($email_principal));
204                                $id_auteur = intval($auteur['id_auteur']);
205                                // On connecte le nouvel utilisateur directement !
206                                include_spip('inc/auth');
207                                auth_loger($auteur);
208                        }
209                        // Sinon c'est qu'une personne crée un profil pour une autre, donc édition classique
210                        else {
211                                // MAIS AVANT on cherche si cette personne existe déjà, identifiée par son email ou son nom et avec le même profil
212                                if (
213                                        (
214                                                $email_principal
215                                                and $auteur = sql_fetsel(
216                                                        'id_auteur',
217                                                        'spip_auteurs',
218                                                        // même email et même profil
219                                                        array('email='.sql_quote($email_principal), 'id_profil='.$profil['id_profil'])
220                                                )
221                                        )
222                                        or (
223                                                !$email_principal
224                                                and $nom_principal
225                                                and $auteur = sql_fetsel(
226                                                        'id_auteur',
227                                                        'spip_auteurs',
228                                                        // même nom exactement et même profil et email VIDE
229                                                        array('nom='.sql_quote($nom_principal), 'email=""', 'id_profil='.$profil['id_profil'])
230                                                )
231                                        )
232                                ) {
233                                        $id_auteur = $auteur['id_auteur'];
234                                       
235                                        // Vu que c'était pas prévu, on va refaire la recherche de tous les objets possibles à partir de cet id_auteur là
236                                        extract(profils_chercher_ids_profil($id_auteur, $id_ou_identifiant_profil));
237                                }
238                                // Sinon on crée juste l'auteur vide, les champs seront ajoutés après
239                                else {
240                                        include_spip('action/editer_objet');
241                                        $id_auteur = objet_inserer('auteur', null, array('statut' => '6forum'));
242                                }
243                        }
244                       
245                        // Pour une création, on assigne le profil principal
246                        set_request('id_profil', $profil['id_profil']);
247                }
248               
249                // Si on a un auteur, on modifie déjà l'auteur existant
250                if ($id_auteur > 0) {
251                        // On met en request racine les champs trouvés pour l'auteur
252                        profils_traiter_peupler_request('edition', $champs_auteur, $config['auteur']);
253                        // S'il y a un email principal, on l'ajoute
254                        if ($email_principal) {
255                                set_request('email', $email_principal);
256                        }
257                        // S'il y a un nom principal, on l'ajoute
258                        if ($nom_principal) {
259                                set_request('nom', $nom_principal);
260                        }
261                       
262                        $retours_auteur = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, '');
263                        $retours = array_merge($retours, $retours_auteur);
264                        //~ $auteur = sql_fetsel('id_auteur, nom, email', 'spip_auteurs', 'id_auteur = '.$id_auteur);
265                       
266                        // On voit si on doit placer dans un annuaire
267                        if (defined('_DIR_PLUGIN_CONTACTS') and lire_config('contacts_et_organisations/utiliser_annuaires')) {
268                                // On teste s'il faut créer un nouvel annuaire
269                                if (
270                                        // S'il n'y a pas d'annuaire configuré
271                                        !isset($config['id_annuaire'])
272                                        or !$id_annuaire = intval($config['id_annuaire'])
273                                        // Ou s'il n'existe plus
274                                        or !sql_getfetsel('id_annuaire', 'spip_annuaires', 'id_annuaire='.$id_annuaire)
275                                ) {
276                                        // On cherche s'il existe un annuaire du même identifiant que le profil
277                                        if (!$id_annuaire = sql_getfetsel('id_annuaire', 'spip_annuaires', 'identifiant='.sql_quote($profil['identifiant']))) {
278                                                // Alors on en crée un nouveau
279                                                $id_annuaire = objet_inserer(
280                                                        'annuaire',
281                                                        null,
282                                                        array('titre'=>$profil['titre'], 'identifiant'=>$profil['identifiant'])
283                                                );
284                                        }
285                                }
286                               
287                                // On le met en requête
288                                set_request('id_annuaire', $id_annuaire);
289                        }
290                       
291                        // Si la fiche principale est une organisation
292                        set_request('id_auteur', $id_auteur);
293                        if ($config['activer_organisation'] and $id_organisation) {
294                                // Si on ne trouve pas un nom d'organisation, on le remplit avec le nom principal comme pour l'auteur
295                                if (!isset($champs_organisation['nom']) or !$champs_organisation['nom']) {
296                                        $champs_organisation['nom'] = $nom_principal;
297                                }
298                                // On remplit le request avec les champs de l'organisation
299                                profils_traiter_peupler_request('edition', $champs_organisation, $config['organisation']);
300                                // On appelle le traitement d'édition de l'organisation
301                                $retours_organisation = formulaires_editer_objet_traiter('organisation', $id_organisation, 0, 0, $retour, '');
302                                $retours = array_merge($retours, $retours_organisation);
303                                $id_organisation = $retours['id_organisation'];
304                               
305                                // Si on a aussi un contact en plus
306                                if ($config['activer_contact'] and $id_contact) {
307                                        // On enlève l'id_auteur
308                                        set_request('id_auteur', null);
309                                        // On précise l'organisation parente
310                                        set_request('id_parent', $id_organisation);
311                                        // On remplit le request avec les champs du contact
312                                        profils_traiter_peupler_request('edition', $champs_contact, $config['contact']);
313                                        // On appelle le traitement d'édition du contact
314                                        $retours_contact = formulaires_editer_objet_traiter('contact', $id_contact, $id_organisation, 0, $retour, '');
315                                        $retours = array_merge($retours_contact, $retours);
316                                        $id_contact = $retours['id_contact'];
317                                }
318                        }
319                        // Sinon si la fiche principale est un contact
320                        elseif ($config['activer_contact'] and $id_contact) {
321                                // On remplit le request avec les champs du contact
322                                profils_traiter_peupler_request('edition', $champs_contact, $config['contact']);
323                                // On appelle le traitement d'édition du contact
324                                $retours_contact = formulaires_editer_objet_traiter('contact', $id_contact, 0, 0, $retour, '');
325                                $retours = array_merge($retours, $retours_contact);
326                                $id_contact = $retours['id_contact'];
327                        }
328                       
329                        // Et maintenant on s'occupe des coordonnées
330                        // Les tests ont déjà été fait pendant la récup des ids, donc si c'est rempli c'est que c'est bon
331                        if (is_array($coordonnees)) {
332                                foreach ($coordonnees as $objet => $coordonnees_types) {
333                                        $cle_objet = id_table_objet($objet);
334                                       
335                                        if (intval(${$cle_objet})) {
336                                                set_request('objet', $objet);
337                                                set_request('id_objet', ${$cle_objet});
338                                               
339                                                foreach ($coordonnees_types as $coordonnee => $types) {
340                                                        foreach ($types as $type => $id_coordonnee) {
341                                                                // Si on le trouve bien dans ce qui a été envoyé du formulaire
342                                                                if ($champs_coordonnees[$objet][$coordonnee][$type ? $type : 0]) {
343                                                                        // On met en request racine les champs de cette coordonnée
344                                                                        $coordonnee_remplie = false;
345                                                                        foreach ($champs_coordonnees[$objet][$coordonnee][$type ? $type : 0] as $champ=>$valeur) {
346                                                                                // S'il y a au moins un champ rempli, la coordonnée est à remplir
347                                                                                if ($valeur) {
348                                                                                        $coordonnee_remplie = true;
349                                                                                        set_request($champ, $valeur);
350                                                                                }
351                                                                        }
352                                                                       
353                                                                        // Si la coordonnée est à remplir on la traite
354                                                                        if ($coordonnee_remplie) {
355                                                                                set_request('type', $type);
356                                                                                // Enfin on traite la coordonnée
357                                                                                $retours_coordonnee = formulaires_editer_objet_traiter(objet_type($coordonnee), $id_coordonnee, 0, 0, $retour, '');
358                                                                                $retours = array_merge($retours_coordonnee, $retours);
359                                                                        }
360                                                                        // Sinon, tous les champs sont vides, on peut la supprimer pour faire du ménage
361                                                                        else {
362                                                                                sql_delete(table_objet_sql($coordonnee), id_table_objet($coordonnee) . '=' . $id_coordonnee);
363                                                                                sql_delete(table_objet_sql($coordonnee) . '_liens', id_table_objet($coordonnee) . '=' . $id_coordonnee);
364                                                                        }
365                                                                }
366                                                        }
367                                                }
368                                        }
369                                }
370                        }
371                }
372        }
373       
374        // On vérifie pour le redirect
375        if (!$retours['redirect'] and $retour) {
376                $retours['redirect'] = $retour;
377        }
378       
379        // On peut toujours continuer d'éditer après envoi
380        $retours['editable'] = true;
381       
382        return $retours;
383}
Note: See TracBrowser for help on using the repository browser.