source: spip-zone/_plugins_/profils/trunk/inc/profils.php @ 115707

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

Si on demande un profil précis explicitement, c'est prioritaire au profil principal du compte utilisateur

File size: 17.5 KB
Line 
1<?php
2/**
3 * Fonctions utilitaires pour les profils
4 *
5 * @plugin     Profils
6 * @copyright  2018
7 * @author     Les Développements Durables
8 * @licence    GNU/GPL
9 * @package    SPIP\Profils\Utils
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16include_spip('base/objets');
17include_spip('base/abstract_sql');
18include_spip('action/editer_liens');
19
20/**
21 * Trouver quel profil utiliser suivant s'il y a un auteur ou pas et s'il a déjà un profil
22 *
23 * @param int|string $id_ou_identifiant_profil
24 * @param int $id_auteur
25 * @return int|string
26 *              Retourne un identifiant entier ou texte d'un profil
27 */
28function profils_selectionner_profil($id_ou_identifiant_profil='', $id_auteur=0) {
29        $id_auteur = intval($id_auteur);
30       
31        // S'il y a un utilisateur et qu'il a déjà un profil sélectionné
32        // c'est prioritaire au profil par défaut donc si pas d'autre profil demandé explicitement
33        if (!$id_ou_identifiant_profil and $id_auteur > 0 and $id_profil = sql_getfetsel('id_profil', 'spip_auteurs', 'id_auteur = '.$id_auteur)) {
34                $id_ou_identifiant_profil = $id_profil;
35        }
36       
37        return $id_ou_identifiant_profil;
38}
39
40/**
41 * Cherche le profil suivant un id SQL ou un identifiant textuel
42 *
43 * @param int|string $id_ou_identifiant_profil
44 *              ID SQL ou identifiant textuel du profil
45 * @return array|bool
46 *              Retourne le profil demandé ou false
47 */
48function profils_recuperer_profil($id_ou_identifiant_profil) {
49        static $profils = array();
50        $profil = false;
51       
52        // Si on l'a déjà trouvé avant
53        if (isset($profils[$id_ou_identifiant_profil])) {
54                return $profils[$id_ou_identifiant_profil];
55        }
56        // Sinon on cherche
57        else {
58                // Si pas d'id on va chercher le premier
59                if (!$id_ou_identifiant_profil) {
60                        $profil = sql_fetsel('*', 'spip_profils', '', '', 'id_profil asc', '0,1');
61                }
62                // Si c'est un identifiant numérique
63                elseif (is_numeric($id_ou_identifiant_profil)) {
64                        $profil = sql_fetsel('*', 'spip_profils', 'id_profil = '.intval($id_ou_identifiant_profil));
65                }
66                // Si c'est un identifiant textuel
67                else {
68                        $profil = sql_fetsel('*', 'spip_profils', 'identifiant = '.sql_quote($id_ou_identifiant_profil));
69                }
70        }
71       
72        if ($profil) {
73                $profil['config'] = unserialize($profil['config']);
74        }
75       
76        $profils[$id_ou_identifiant_profil] = $profil;
77        return $profil;
78}
79
80
81/**
82 * Cherche dans une config s'il y a bien un champ email obligatoire et si oui lequel
83 *
84 * La fonction cherche l'email obligatoire *le plus proche* du compte utilisateur
85 *
86 * @param array $config
87 *              Le tableau de configuration d'un profil
88 * @return
89 *              Retourne le champ d'email principal
90 */
91function profils_chercher_champ_email_principal($config) {
92        $champ = false;
93       
94        foreach (array('auteur', 'organisation', 'contact') as $objet) {
95                if ($objet == 'auteur' or (defined('_DIR_PLUGIN_CONTACTS') and $config["activer_$objet"])) {
96                        // On cherche dans les champs de l'objet
97                        if (
98                                !$champ
99                                and $config[$objet]['email'] 
100                                and in_array('inscription', $config[$objet]['email'])
101                                and in_array('obligatoire', $config[$objet]['email'])
102                        ) {
103                                $champ = array($objet, 'email');
104                        }
105                        // Sinon on cherche dans les coordonnées emails
106                        elseif (
107                                !$champ
108                                and defined('_DIR_PLUGIN_COORDONNEES')
109                                and $config["activer_coordonnees_$objet"]
110                                and $config['coordonnees'][$objet]['emails']
111                        ) {
112                                // On parcourt les emails configurés
113                                foreach ($config['coordonnees'][$objet]['emails'] as $champ_email) {
114                                        if ($champ_email['inscription'] and $champ_email['obligatoire']) {
115                                                $type = $champ_email['type'] ? $champ_email['type'] : 0;
116                                                $champ = array('coordonnees', $objet, 'emails', $type, 'email');
117                                        }
118                                }
119                        }
120                }
121        }
122       
123        return $champ;
124}
125
126/**
127 * Cherche les saisies d'édition d'un objet ET des champs extras ajoutés
128 *
129 * @param string $objet
130 *              Nom de l'objet dont on cherche les saisies
131 * @return array
132 *              Retoure un tableau de saisies
133 *
134 */
135function profils_chercher_saisies_objet($objet) {
136        static $saisies = array();
137        $objet = objet_type($objet);
138       
139        if (isset($saisies[$objet])) {
140                return $saisies[$objet];
141        }
142        else {
143                $saisies[$objet] = array();
144               
145                // Les saisies de base
146                if ($saisies_objet = saisies_chercher_formulaire("editer_$objet", array())) {
147                        $saisies[$objet] = array_merge($saisies[$objet], $saisies_objet);
148                }
149               
150                // Les saisies des champs extras
151                if (defined('_DIR_PLUGIN_CEXTRAS')) {
152                        include_spip('cextras_pipelines');
153                       
154                        if ($saisies_extra = champs_extras_objet(table_objet_sql($objet))) {
155                                $saisies[$objet] = array_merge($saisies[$objet], $saisies_extra);
156                        }
157                }
158        }
159       
160        return $saisies[$objet];
161}
162
163/**
164 * Cherche les saisies configurées pour un profil et pour tel formulaire (inscription ou édition)
165 *
166 * @param string $form
167 *              Quel formulaire : "inscription" ou "edition"
168 * @param $id_auteur
169 *              Identifiant du compte utilisateur dont on cherche les saisies
170 * @param $id_ou_identifiant_profil
171 *              Identifiant du profil, notamment si c'est une création
172 * @return array
173 *              Retourne le tableau des saisies du profil
174 */
175function profils_chercher_saisies_profil($form, $id_auteur=0, $id_ou_identifiant_profil='') {
176        $saisies = array();
177       
178        // On cherche le bon profil
179        $id_ou_identifiant_profil = profils_selectionner_profil($id_ou_identifiant_profil, $id_auteur);
180       
181        // On ne continue que si on a un profil sous la main
182        if ($profil = profils_recuperer_profil($id_ou_identifiant_profil) and $config = $profil['config']) {
183                foreach (array('auteur', 'organisation', 'contact') as $objet) {
184                        // Si c'est autre chose que l'utilisateur, faut le plugin qui va avec et que ce soit activé
185                        if ($objet == 'auteur' or (defined('_DIR_PLUGIN_CONTACTS') and $config["activer_$objet"])) {
186                                // On récupère les champs pour cet objet ET ses champs extras s'il y a
187                                $saisies_objet = profils_chercher_saisies_objet($objet);
188                                $saisies_a_utiliser = array();
189                               
190                                // Pour chaque chaque champ vraiment configuré
191                                if ($config[$objet]) {
192                                        foreach ($config[$objet] as $champ => $config_champ) {
193                                                // On cherche la saisie pour ce champ SI c'est pour le form demandé
194                                                if (in_array($form, $config_champ) and $saisie = saisies_chercher($saisies_objet, $champ)) {
195                                                        // On modifie son nom
196                                                        $saisie['options']['nom'] = $objet . '[' . $saisie['options']['nom'] . ']';
197                                                        // On modifie son obligatoire suivant la config
198                                                        $saisie['options']['obligatoire'] = in_array('obligatoire', $config_champ) ? 'oui' : false;
199                                                        // On ajoute la saisie
200                                                        $saisies_a_utiliser[] = $saisie;
201                                                }
202                                        }
203                                }
204                               
205                                // On cherche des coordonnées pour cet objet
206                                if (
207                                        defined('_DIR_PLUGIN_COORDONNEES')
208                                        and $config["activer_coordonnees_$objet"]
209                                        and $coordonnees = $config['coordonnees'][$objet]
210                                ) {
211                                        // Pour chaque type de coordonnéees (num, email, adresse)
212                                        foreach ($coordonnees as $coordonnee => $champs) {
213                                                // Pour chaque champ ajouté
214                                                foreach ($champs as $cle => $champ) {
215                                                        // Si ce cette coordonnées est configurée pour le form demandé
216                                                        if ($champ[$form]) {
217                                                                // Attention, si pas de type, on transforme ici en ZÉRO
218                                                                if (!$champ['type']) {
219                                                                        $champ['type'] = 0;
220                                                                }
221                                                                // On va chercher les saisies de ce type de coordonnées
222                                                                $saisies_coordonnee = profils_chercher_saisies_objet($coordonnee);
223                                                                // On vire le titre libre
224                                                                $saisies_coordonnee = saisies_supprimer($saisies_coordonnee, 'titre');
225                                                                // On change le nom de chacun des champs
226                                                                $saisies_coordonnee =  saisies_transformer_noms(
227                                                                        $saisies_coordonnee,
228                                                                        '/^\w+$/',
229                                                                        "coordonnees[$objet][$coordonnee][${champ['type']}][\$0]"
230                                                                );
231                                                                // On reconstitue le label
232                                                                $label = $champ['label'] ? $champ['label'] : _T(objet_info(table_objet_sql($coordonnee), 'texte_objet'));
233                                                                if ($champ['type'] and !$champ['label']) {
234                                                                        $label .= ' (' . coordonnees_lister_types_coordonnees(objet_type($coordonnee), $champ['type']) . ')';
235                                                                }
236                                                                // Si c'est un numéro ou un email on change peut-être le label du champ lui-même et le obligatoire
237                                                                if (in_array($coordonnee, array('numeros', 'emails'))) {
238                                                                        $saisies_coordonnee = saisies_modifier(
239                                                                                $saisies_coordonnee,
240                                                                                "coordonnees[$objet][$coordonnee][${champ['type']}][" . objet_type($coordonnee) . ']',
241                                                                                array(
242                                                                                        'options' => array(
243                                                                                                'label' => $label,
244                                                                                                'obligatoire' => $champ['obligatoire'] ? 'oui' : false,
245                                                                                        ),
246                                                                                )
247                                                                        );
248                                                                        // On ajoute enfin
249                                                                        $saisies_a_utiliser     = array_merge($saisies_a_utiliser, $saisies_coordonnee);
250                                                                }
251                                                                // Alors que si c'est une adresse on l'utilise pour le groupe de champs
252                                                                else {
253                                                                        $saisies_a_utiliser[] = array(
254                                                                                'saisie' => 'fieldset',
255                                                                                'options' => array(
256                                                                                        'nom' => "groupe_${coordonnee}_$cle",
257                                                                                        'label' => $label,
258                                                                                ),
259                                                                                'saisies' => $saisies_coordonnee,
260                                                                        );
261                                                                }
262                                                        }
263                                                }
264                                        }
265                                }
266                               
267                                // On teste s'il faut un groupe de champs ou pas pour cet objet
268                                if ($saisies_a_utiliser and $legend = $config["activer_groupe_$objet"]) {
269                                        $saisies[] = array(
270                                                'saisie' => 'fieldset',
271                                                'options' => array(
272                                                        'nom' => "groupe_$objet",
273                                                        'label' => $legend,
274                                                ),
275                                                'saisies' => $saisies_a_utiliser,
276                                        );
277                                }
278                                // Sinon on les ajoute directement
279                                else {
280                                        $saisies = array_merge($saisies, $saisies_a_utiliser);
281                                }
282                        }
283                }
284        }
285               
286        return $saisies;
287}
288
289/**
290 * Récupérer tous les identifiants des objets liés au profil d'un compte utilisateur
291 *
292 * @param int $id_auteur=0
293 *              Identifiant d'un auteur précis, sinon visiteur en cours
294 * @return array
295 *              Retourne un tableau de tous les identifiants
296 */
297function profils_chercher_ids_profil($id_auteur=0, $id_ou_identifiant_profil='') {
298        $ids = array();
299        $ids['id_auteur'] = intval($id_auteur);
300        $coordonnees_liees = array();
301       
302        // On cherche le bon profil
303        $id_ou_identifiant_profil = profils_selectionner_profil($id_ou_identifiant_profil, $ids['id_auteur']);
304       
305        // Si pas d'utilisateur, il faut en créer un
306        if (!$ids['id_auteur']) {
307                $ids['id_auteur'] = 'new';
308        }
309       
310        // Maintenant on ne continue que si on a trouvé un profil
311        if ($profil = profils_recuperer_profil($id_ou_identifiant_profil) and $config = $profil['config']) {
312                // Si le plugin est toujours là
313                if (defined('_DIR_PLUGIN_CONTACTS')) {
314                        // Est-ce qu'il y a une orga en fiche principale ?
315                        if ($config['activer_organisation']) {
316                                // Cherchons une organisation
317                                if (
318                                        !intval($ids['id_auteur'])
319                                        or !$ids['id_organisation'] = intval(sql_getfetsel('id_organisation', 'spip_organisations', 'id_auteur = '.$ids['id_auteur']))
320                                ) {
321                                        $ids['id_organisation'] = 'new';
322                                }
323                               
324                                // Il peut aussi y avoir un contact physique *lié à l'orga*
325                                if (
326                                        !intval($ids['id_organisation'])
327                                        or !$liens = objet_trouver_liens(array('organisation'=>$ids['id_organisation']), array('contact'=>'*'))
328                                        or !$contact = $liens[0]
329                                        or !$ids['id_contact'] = intval($contact['id_objet'])
330                                ) {
331                                        $ids['id_contact'] = 'new';
332                                }
333                        }
334                        elseif ($config['activer_contact']) {
335                                // Cherchons un contact physique
336                                if (
337                                        !intval($ids['id_auteur'])
338                                        or !$ids['id_contact'] = intval(sql_getfetsel('id_contact', 'spip_contacts', 'id_auteur = '.$ids['id_auteur']))
339                                ) {
340                                        $ids['id_contact'] = 'new';
341                                }
342                        }
343                }
344               
345                // Si on doit chercher des coordonnées
346                if (defined('_DIR_PLUGIN_COORDONNEES')) {
347                        foreach (array('auteur', 'organisation', 'contact') as $objet) {
348                                // S'il y a des coordonnées activées pour cet objet
349                                if ($config["activer_coordonnees_$objet"] and $coordonnees = $config['coordonnees'][$objet]) {
350                                        $cle_objet = id_table_objet($objet);
351                                       
352                                        foreach ($coordonnees as $coordonnee => $champs) {
353                                                $cle_coordonnee = id_table_objet($coordonnee);
354                                               
355                                                foreach ($champs as $cle => $champ) {
356                                                        // On cherche s'il y a une liaison sinon new
357                                                        if (
358                                                                !$id_objet = $ids[$cle_objet]
359                                                                or !$liens = objet_trouver_liens(
360                                                                        array(objet_type($coordonnee) => '*'),
361                                                                        array($objet => $id_objet),
362                                                                        array('type = '.sql_quote($champ['type']))
363                                                                )
364                                                                or !$liaison = $liens[0]
365                                                                or !$coordonnees_liees[$objet][$coordonnee][$champ['type']] = $liaison[$cle_coordonnee]
366                                                        ) {
367                                                                $coordonnees_liees[$objet][$coordonnee][$champ['type']] = 'new';
368                                                        }
369                                                }
370                                        }
371                                }
372                        }
373                       
374                        // S'il y a des coordonnées on ajoute
375                        if ($coordonnees_liees) {
376                                $ids['coordonnees'] = $coordonnees_liees;
377                        }
378                }
379        }
380       
381        return $ids;
382}
383
384/**
385 * Récupérer les informations complètes d'un compte de profil
386 *
387 * Renvoie un tableau multidimensionnel avec l'ensemble des valeurs
388 * chargées par les formulaires d'édition des objets du profil,
389 * chaque objet dans une clé (organisation, contact, etc.)
390 *
391 * @param int $id_auteur=0
392 *              Identifiant d'un auteur précis, sinon visiteur en cours
393 * @return array
394 *              Informations d'un profil, chaque objet SPIP dans une clé (organisation, contact, telephone, etc).
395 */
396function profils_recuperer_infos($id_auteur=0, $id_ou_identifiant_profil='') {
397        include_spip('inc/editer');
398        $retour = '';
399        $infos = array();
400       
401        // Récupérer les objets liés au profil utilisateur
402        extract(profils_chercher_ids_profil($id_auteur, $id_ou_identifiant_profil));
403       
404        // On charge les infos du compte SPIP
405        $infos['auteur'] = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, '');
406       
407        // On charge les infos de l'organisation
408        if ($id_organisation) {
409                $infos['organisation'] = formulaires_editer_objet_charger('organisation', $id_organisation, 0, 0, $retour, '');
410                unset($infos['organisation']['_pipeline']);
411        }
412       
413        // On charge les infos du contact
414        if ($id_contact) {
415                $infos['contact'] = formulaires_editer_objet_charger('contact', $id_contact, intval($id_organisation), 0, $retour, '');
416        }
417       
418        // S'il y a des coordonnées
419        if ($coordonnees and is_array($coordonnees)) {
420                foreach ($coordonnees as $objet => $coordonnees_objet) {
421                        foreach ($coordonnees_objet as $coordonnee => $champs) {
422                                foreach ($champs as $type => $id) {
423                                        // Attention, si pas de type, on transforme ici en ZÉRO
424                                        if (!$type) {
425                                                $type = 0;
426                                        }
427                                        $infos['coordonnees'][$objet][$coordonnee][$type] = formulaires_editer_objet_charger(objet_type($coordonnee), $id, 0, 0, $retour, '');
428                                }
429                        }
430                }
431        }
432       
433        return $infos;
434}
435
436/**
437 * Récupérer les informations résumées d'un compte de profil
438 *
439 * Renvoie un tableau simple avec toutes les valeurs du profil,
440 * les champs configurés pour l'édition uniquement.
441 *
442 * @uses profils_recuperer_profil()
443 * @uses profils_recuperer_infos()
444 *
445 * @param int $id_auteur=0
446 *              Identifiant d'un auteur précis, sinon visiteur en cours
447 * @return array
448 *              Informations d'un profil sous forme de tableau associatif
449 */
450function profils_recuperer_infos_simples($id_auteur=0, $id_ou_identifiant_profil='') {
451        $ligne = array();
452
453        if (
454                $infos = profils_recuperer_infos($id_auteur, $id_ou_identifiant_profil)
455                and $profil = profils_recuperer_profil($id_ou_identifiant_profil)
456                and $config = $profil['config']
457        ) {
458                $ligne = array();
459
460                // Les objets dans un ordre précis
461                foreach (array('auteur', 'organisation', 'contact') as $objet) {
462                        // Si c'est autre chose que l'utilisateur, faut le plugin qui va avec et que ce soit activé
463                        if ($objet == 'auteur' or (defined('_DIR_PLUGIN_CONTACTS') and $config["activer_$objet"])) {
464                                // Pour chaque chaque champ vraiment configuré
465                                if ($config[$objet]) {
466                                        foreach ($config[$objet] as $champ => $config_champ) {
467                                                // On prend les champs d'édition de profil uniquement
468                                                if (in_array('edition', $config_champ)) {
469                                                        $cle = $objet.'_'.$champ;;
470                                                        $ligne[$cle] = $infos[$objet][$champ];
471                                                }
472                                        }
473                                }
474                               
475                                // On cherche des coordonnées pour cet objet
476                                if (
477                                        defined('_DIR_PLUGIN_COORDONNEES')
478                                        and $config["activer_coordonnees_$objet"]
479                                        and $coordonnees = $config['coordonnees'][$objet]
480                                ) {
481                                        // Pour chaque type de coordonnéees (num, email, adresse)
482                                        foreach ($coordonnees as $coordonnee => $champs) {
483                                                // Pour chaque champ ajouté
484                                                foreach ($champs as $cle => $champ) {
485                                                        // Si ce cette coordonnées est configurée pour le form demandé
486                                                        if ($champ['edition']) {
487                                                                // Attention, si pas de type, on transforme ici en ZÉRO
488                                                                if (!$champ['type']) {
489                                                                        $champ['type'] = 0;
490                                                                }
491                                                                // On va chercher les saisies de ce type de coordonnées
492                                                                $saisies_coordonnee = profils_chercher_saisies_objet($coordonnee);
493                                                                // On vire le titre libre
494                                                                $saisies_coordonnee = saisies_supprimer($saisies_coordonnee, 'titre');
495                                                                // On cherche uniquement le nom des champs
496                                                                $saisies_noms = saisies_lister_champs($saisies_coordonnee);
497                                                               
498                                                                // On ajoute aux colonnes
499                                                                foreach ($saisies_noms as $nom) {
500                                                                        $cle = $objet.'_'.$coordonnee.'_'.$champ['type'].'_'.$nom;
501                                                                        $ligne[$cle] = $infos['coordonnees'][$objet][$coordonnee][$champ['type']][$nom];
502                                                                }
503                                                        }
504                                                }
505                                        }
506                                }
507                        }
508                }
509        }
510
511        return $ligne;
512}
513
514function profils_traiter_peupler_request($form, $champs_objet, $config_objet) {
515        if (is_array($champs_objet) and $config_objet) {
516                foreach ($config_objet as $champ => $config_champ) {
517                        // Si c'est configuré pour ce formulaire
518                        if (in_array($form, $config_champ)) {
519                                set_request('cextra_'.$champ, 1); // pour que champs extras le gère dans pre_edition ensuite
520                               
521                                if (isset($champs_objet[$champ])) {
522                                        set_request($champ, $champs_objet[$champ]);
523                                }
524                        }
525                }
526        }
527}
528
529/**
530 * @brief
531 * @param $id_auteur
532 * @param $id_ou_identifiant_profil
533 * @returns
534 */
535function profils_enregistrer_profil($id_auteur, $id_ou_identifiant_profil='') {
536       
537}
Note: See TracBrowser for help on using the repository browser.