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

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

On supprime les champs d'origine car nous on va rajouter les notre, y compris possiblement le pseudo et l'email de la table spip_auteurs OU PAS forcément. Pour l'instant si on utilise mot de passe à l'inscription aussi, ça se met après le choix du mot de passe, à voir c'est quoi le plus logique…

File size: 9.8 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/profils');
20
21/**
22 * Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
23 *
24 * @param int|string $id_auteur
25 *     Identifiant du compte utilistateur. 'new' pour une création.
26 * @param int|string $id_ou_identifiant_profil
27 *     ID SQL ou identifiant textuel du profil voulu
28 * @return string
29 *     Hash du formulaire
30 */
31function formulaires_profil_identifier_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '') {
32        return serialize(array(intval($id_auteur)));
33}
34
35/**
36 * Saisies du formulaire de profil
37 *
38 * Déclarer les saisies utilisées pour générer le formulaire.
39 *
40 * @param int|string $id_auteur
41 *     Identifiant du compte utilistateur. 'new' pour une création.
42 * @param int|string $id_ou_identifiant_profil
43 *     ID SQL ou identifiant textuel du profil voulu
44 * @return array
45 *     Environnement du formulaire
46 */
47function formulaires_profil_saisies_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '') {
48        $saisies = profils_chercher_saisies_profil('edition', $id_auteur, $id_ou_identifiant_profil);
49       
50        return $saisies;
51}
52
53/**
54 * Chargement du formulaire de profil
55 *
56 * Déclarer les champs postés et y intégrer les valeurs par défaut
57 *
58 * @param int|string $id_auteur
59 *     Identifiant du compte utilistateur. 'new' pour une création.
60 * @param int|string $id_ou_identifiant_profil
61 *     ID SQL ou identifiant textuel du profil voulu
62 * @return array
63 *     Environnement du formulaire
64 */
65function formulaires_profil_charger_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '') {
66        include_spip('inc/autoriser');
67        $contexte = array();
68       
69        // Si pas d'id_auteur on prend celui connecté actuellement
70        if (!intval($id_auteur)) {
71                $id_auteur = session_get('id_auteur');
72        }
73       
74        // On vérifie que l'auteur existe et qu'on a le droit de le modifier
75        if (
76                !$auteur = sql_fetsel('id_auteur,nom,email', 'spip_auteurs', 'id_auteur = '.intval($id_auteur))
77                or !$id_auteur = intval($auteur['id_auteur'])
78                or (!($id_auteur == session_get('id_auteur')) and !autoriser('modifier', 'auteur', $id_auteur))
79        ) {
80                return array(
81                        'editable' => false,
82                        'message_erreur' => _T('profils:erreur_autoriser_profil'),
83                );
84        }
85       
86        // Récupérer toutes les infos possibles déjà existantes
87        $infos = profils_recuperer_infos($id_auteur, $id_ou_identifiant_profil);
88       
89        // On remplit le contexte avec ces informations (et un préfixe pour le contact)
90        $contexte = array_merge($contexte, $infos);
91       
92        return $contexte;
93}
94
95/**
96 * Vérifications du formulaire de profil
97 *
98 * Vérifier les champs postés et signaler d'éventuelles erreurs
99 *
100 * @uses formulaires_editer_objet_verifier()
101 *
102 * @param int|string $id_auteur
103 *     Identifiant du compte utilistateur. 'new' pour une création.
104 * @param int|string $id_ou_identifiant_profil
105 *     ID SQL ou identifiant textuel du profil voulu
106 * @return array
107 *     Tableau des erreurs
108 */
109function formulaires_profil_verifier_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '') {
110        $erreurs = array();
111       
112        return $erreurs;
113}
114
115/**
116 * Traitement du formulaire de profil
117 *
118 * Traiter les champs postés
119 *
120 * @uses formulaires_editer_objet_traiter()
121 *
122 * @param int|string $id_auteur
123 *     Identifiant du compte utilistateur. 'new' pour une création.
124 * @param int|string $id_ou_identifiant_profil
125 *     ID SQL ou identifiant textuel du profil voulu
126 * @return array
127 *     Retours des traitements
128 */
129function formulaires_profil_traiter_dist($id_auteur = 'new', $id_ou_identifiant_profil = '', $retour = '') {
130        if ($retour) {
131                refuser_traiter_formulaire_ajax();
132        }
133        $retours = array();
134        $champs_auteur = _request('auteur');
135        $champs_organisation = _request('organisation');
136        $champs_contact = _request('contact');
137        $champs_coordonnees = _request('coordonnees');
138        $email_principal = '';
139        $nom_principal = '';
140       
141        // Récupérer les objets liés au profil utilisateur
142        extract(profils_chercher_ids_profil($id_auteur, $id_ou_identifiant_profil));
143       
144        // On cherche le bon profil
145        $id_ou_identifiant_profil = profils_selectionner_profil($id_ou_identifiant_profil, $ids['id_auteur']);
146        if ($profil = profils_recuperer_profil($id_ou_identifiant_profil) and $config = $profil['config']) {
147                // Préparer certaines valeurs magiquement suivant la configuration
148               
149                // Email principal
150                if ($champ_email_principal = profils_chercher_champ_email_principal($config) and is_array($champ_email_principal)) {
151                        $email_principal = _request(array_shift($champ_email_principal));
152                        foreach ($champ_email_principal as $cle) {
153                                $email_principal = $email_principal[$cle];
154                        }
155                }
156               
157                // Nom principal (peut-être vérifier que le champ est censé être là)
158                if (
159                        !$nom_principal = $champs_auteur['nom']
160                        and !$nom_principal = $champs_organisation['nom']
161                        and !$nom_principal = trim($champs_contact['prenom'] . ' ' . $champs_contact['nom'])
162                        and $email_principal
163                ) {
164                        $nom_principal = explode('@', $email_principal);
165                        $nom_principal = array_shift($nom_principal);
166                }
167               
168                // S'il faut inscrire pour avoir un nouvel utilisateur (à ne pas forcément utiliser pour l'instant)
169                if (!$id_auteur or $id_auteur=='new') {
170                        // Pseudo et email repris des autres champs
171                        set_request('mail_inscription', $email_principal);
172                        set_request('nom_inscription', $nom_principal);
173                        // Inscription en visiteur public
174                        $inscription_dist = charger_fonction('traiter', 'formulaires/inscription');
175                        $retours_inscription = $inscription_dist('6forum','');
176                        $retours = array_merge($retours, $retours_inscription);
177                       
178                        // On récupère l'auteur qui vient d'être créé
179                        $auteur = sql_fetsel('*', 'spip_auteurs', 'email = '.sql_quote($email_principal));
180                        $id_auteur = intval($auteur['id_auteur']);
181                        // On connecte le nouvel utilisateur directement !
182                        include_spip('inc/auth');
183                        auth_loger($auteur);
184                }
185               
186                // Si on a un utilisateur déjà connecté, on modifie déjà l'auteur existant
187                if ($id_auteur > 0) {
188                        // On met en request racine les champs trouvés pour l'auteur
189                        profils_traiter_peupler_request('edition', $champs_auteur, $config['auteur']);
190                        // S'il y a un email principal, on l'ajoute
191                        if ($email_principal) {
192                                set_request('email', $email_principal);
193                        }
194                        // S'il y a un nom principal, on l'ajoute
195                        if ($nom_principal) {
196                                set_request('nom', $nom_principal);
197                        }
198                       
199                        $retours_auteur = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, '');
200                        $retours = array_merge($retours, $retours_auteur);
201                        //~ $auteur = sql_fetsel('id_auteur, nom, email', 'spip_auteurs', 'id_auteur = '.$id_auteur);
202                       
203                        // Si la fiche principale est une organisation
204                        set_request('id_auteur', $id_auteur);
205                        if ($config['activer_organisation'] and $id_organisation) {
206                                profils_traiter_peupler_request('edition', $champs_organisation, $config['organisation']);
207                                $retours_organisation = formulaires_editer_objet_traiter('organisation', $id_organisation, 0, 0, $retour, '');
208                                $retours = array_merge($retours, $retours_organisation);
209                                $id_organisation = $retours['id_organisation'];
210                               
211                                // Si on a aussi un contact en plus
212                                if ($config['activer_contact'] and $id_contact) {
213                                        // On précise l'organisation parente
214                                        set_request('id_parent', $id_organisation);
215                                        profils_traiter_peupler_request('edition', $champs_contact, $config['contact']);
216                                        $retours_contact = formulaires_editer_objet_traiter('contact', $id_contact, $id_organisation, 0, $retour, '');
217                                        $retours = array_merge($retours_contact, $retours);
218                                }
219                        }
220                        // Sinon si la fiche principale est un contact
221                        elseif ($config['activer_contact'] and $id_contact) {
222                                profils_traiter_peupler_request('edition', $champs_contact, $config['contact']);
223                                $retours_contact = formulaires_editer_objet_traiter('contact', $id_contact, 0, 0, $retour, '');
224                                $retours = array_merge($retours, $retours_contact);
225                                $id_contact = $retours['id_contact'];
226                        }
227                       
228                        // Et maintenant on s'occupe des coordonnées
229                        // Les tests ont déjà été fait pendant la récup des ids, donc si c'est rempli c'est que c'est bon
230                        if (is_array($coordonnees)) {
231                                foreach ($coordonnees as $objet => $coordonnees_types) {
232                                        $cle_objet = id_table_objet($objet);
233                                       
234                                        if (${$cle_objet}) {
235                                                set_request('objet', $objet);
236                                                set_request('id_objet', ${$cle_objet});
237                                               
238                                                foreach ($coordonnees_types as $coordonnee => $types) {
239                                                        foreach ($types as $type => $id_coordonnee) {
240                                                                // Si on le trouve bien dans ce qui a été envoyé du formulaire
241                                                                if ($champs_coordonnees[$objet][$coordonnee][$type ? $type : 0]) {
242                                                                        // On met en request racine les champs de cette coordonnée
243                                                                        foreach ($champs_coordonnees[$objet][$coordonnee][$type ? $type : 0] as $champ=>$valeur) {
244                                                                                set_request($champ, $valeur);
245                                                                        }
246                                                                        set_request('type', $type);
247                                                                        // Enfin on traite la coordonnée
248                                                                        $retours_coordonnee = formulaires_editer_objet_traiter(objet_type($coordonnee), $id_coordonnee, 0, 0, $retour, '');
249                                                                        $retours = array_merge($retours_coordonnee, $retours);
250                                                                }
251                                                        }
252                                                }
253                                        }
254                                }
255                        }
256                }
257        }
258       
259        // On vérifie pour le redirect
260        if (!$retours['redirect'] and $retour) {
261                $retours['redirect'] = $retour;
262        }
263       
264        return $retours;
265}
266
267function profils_traiter_peupler_request($form, $champs_objet, $config_objet) {
268        if (is_array($champs_objet) and $config_objet) {
269                foreach ($champs_objet as $champ => $valeur) {
270                        // Si ce champ faisait vraiment partie des choses à envoyer
271                        if ($config_objet[$champ] and in_array($form, $config_objet[$champ])) {
272                                set_request($champ, $valeur);
273                        }
274                }
275        }
276}
Note: See TracBrowser for help on using the repository browser.