source: spip-zone/_plugins_/profils/trunk/formulaires/editer_profil.php @ 110955

Last change on this file since 110955 was 110955, checked in by rastapopoulos@…, 3 years ago

De nombreuses corrections de bugs, et la possibilité si on avait activé les annuaires, de choisir dans quel annuaire mettre organisation et contact.

File size: 15.1 KB
Line 
1<?php
2/**
3 * Gestion du formulaire de d'édition de profil
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('inc/config');
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_profil
25 *     Identifiant du profil. 'new' pour un nouveau profil.
26 * @param string $retour
27 *     URL de redirection après le traitement
28 * @param int $lier_trad
29 *     Identifiant éventuel d'un profil source d'une traduction
30 * @param string $config_fonc
31 *     Nom de la fonction ajoutant des configurations particulières au formulaire
32 * @param array $row
33 *     Valeurs de la ligne SQL du profil, si connu
34 * @param string $hidden
35 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
36 * @return string
37 *     Hash du formulaire
38 */
39function formulaires_editer_profil_identifier_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
40        return serialize(array(intval($id_profil)));
41}
42
43/**
44 * Saisies du formulaire d'édition de profil
45 *
46 * Déclarer les saisies utilisées pour générer le formulaire.
47 *
48 * @param int|string $id_profil
49 *     Identifiant du profil. 'new' pour un nouveau profil.
50 * @param string $retour
51 *     URL de redirection après le traitement
52 * @param int $lier_trad
53 *     Identifiant éventuel d'un profil source d'une traduction
54 * @param string $config_fonc
55 *     Nom de la fonction ajoutant des configurations particulières au formulaire
56 * @param array $row
57 *     Valeurs de la ligne SQL du profil, si connu
58 * @param string $hidden
59 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
60 * @return array
61 *     Environnement du formulaire
62 */
63function formulaires_editer_profil_saisies_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
64        // Les colonnes à cocher
65        $data_cols = array(
66                'inscription' => _T('profil:champ_config_colonne_inscription_label'),
67                'edition' => _T('profil:champ_config_colonne_edition_label'),
68                'obligatoire' => _T('profil:champ_config_colonne_obligatoire_label'),
69        );
70       
71        // Les saisies des auteurs
72        $saisies_auteur = profils_chercher_saisies_objet('auteur');
73        $data_rows_auteur = saisies_lister_labels($saisies_auteur);
74       
75        // Récupérer les types de coordonnées
76        if (defined('_DIR_PLUGIN_COORDONNEES')) {
77                $coordonnees_types_numeros = coordonnees_lister_types_coordonnees('numero');
78        }
79       
80        $saisies = array(
81                array(
82                        'saisie' => 'input',
83                        'options' => array(
84                                'nom' => 'id_profil',
85                                'type' => 'hidden',
86                        ),
87                ),
88                array(
89                        'saisie' => 'input',
90                        'options' => array(
91                                'nom' => 'titre',
92                                'label' => _T('profil:champ_titre_label'),
93                                'obligatoire' => 'oui',
94                        ),
95                ),
96                array(
97                        'saisie' => 'input',
98                        'options' => array(
99                                'nom' => 'identifiant',
100                                'label' => _T('profil:champ_identifiant_label'),
101                                'obligatoire' => 'oui',
102                        ),
103                ),
104        );
105        $groupe_auteur = array(
106                'saisie' => 'fieldset',
107                'options' => array(
108                        'nom' => 'groupe_auteur',
109                        'label' => _T('profil:champ_groupe_auteur_label'),
110                ),
111                'saisies' => array(
112                        array(
113                                'saisie' => 'choix_grille',
114                                'options' => array(
115                                        'nom' => 'config[auteur]',
116                                        'caption' => _T('profil:champ_config_auteur_caption'),
117                                        'conteneur_class' => 'pleine_largeur',
118                                        'multiple' => 'oui',
119                                        'data_cols' => $data_cols,
120                                        'data_rows' => $data_rows_auteur,
121                                ),
122                        ),
123                ),
124        );
125        // Coordoonnées pour l'auteur si plugin idoine
126        if (defined('_DIR_PLUGIN_COORDONNEES')) {
127                $groupe_auteur['saisies'][] = array(
128                        'saisie' => 'case',
129                        'options' => array(
130                                'nom' => 'config[activer_coordonnees_auteur]',
131                                'label_case' => _T('profil:champ_config_activer_coordonnees_auteur_label_case'),
132                                'conteneur_class' => 'pleine_largeur',
133                        ),
134                );
135                $groupe_auteur['saisies'][] = array(
136                        'saisie' => 'profil_coordonnees',
137                        'options' => array(
138                                'nom' => 'config[coordonnees][auteur]',
139                                'conteneur_class' => 'pleine_largeur',
140                                'caption' => _T('profil:champ_config_coordonnees_auteur_caption'),
141                                'afficher_si' => '@config[activer_coordonnees_auteur]@ == "on"',
142                        ),
143                );
144        }
145        // On ajoute le groupe au formulaire
146        $saisies[] = $groupe_auteur;
147       
148        // Si le plugin C&O est là
149        if (defined('_DIR_PLUGIN_CONTACTS')) {
150                // L'organisation
151                $groupe_organisation = array(
152                        'saisie' => 'fieldset',
153                        'options' => array(
154                                'nom' => 'groupe_organisation',
155                                'label' => _T('profil:champ_groupe_organisation_label'),
156                        ),
157                        'saisies' => array(),
158                );
159                // La case pour activer l’organisation
160                $groupe_organisation['saisies'][] = array(
161                        'saisie' => 'case',
162                        'options' => array(
163                                'nom' => 'config[activer_organisation]',
164                                'conteneur_class' => 'pleine_largeur',
165                                'label_case' => _T('profil:champ_config_activer_organisation_label_case'),
166                        ),
167                );
168                // Le champ libre pour donner une légende de groupe de champs
169                $groupe_organisation['saisies'][] = array(
170                        'saisie' => 'input',
171                        'options' => array(
172                                'nom' => 'config[activer_groupe_organisation]',
173                                'label' => _T('profil:champ_config_activer_groupe_organisation_label'),
174                                'explication' => _T('profil:champ_config_activer_groupe_explication'),
175                                'afficher_si' => '@config[activer_organisation]@ == "on"',
176                        ),
177                );
178                // On récupère les champs d'orga, que les noms
179                $saisies_organisation = profils_chercher_saisies_objet('organisation');
180                $data_rows_organisation = saisies_lister_labels($saisies_organisation);
181                $groupe_organisation['saisies'][] = array(
182                        'saisie' => 'choix_grille',
183                        'options' => array(
184                                'nom' => 'config[organisation]',
185                                'caption' => _T('profil:champ_config_organisation_caption'),
186                                'conteneur_class' => 'pleine_largeur',
187                                'multiple' => 'oui',
188                                'data_cols' => $data_cols,
189                                'data_rows' => $data_rows_organisation,
190                                'afficher_si' => '@config[activer_organisation]@ == "on"',
191                        ),
192                );
193                // Coordoonnées pour l'organisation si plugin idoine
194                if (defined('_DIR_PLUGIN_COORDONNEES')) {
195                        $groupe_organisation['saisies'][] = array(
196                                'saisie' => 'case',
197                                'options' => array(
198                                        'nom' => 'config[activer_coordonnees_organisation]',
199                                        'label_case' => _T('profil:champ_config_activer_coordonnees_organisation_label_case'),
200                                        'conteneur_class' => 'pleine_largeur',
201                                        'afficher_si' => '@config[activer_organisation]@ == "on"',
202                                ),
203                        );
204                        $groupe_organisation['saisies'][] = array(
205                                'saisie' => 'profil_coordonnees',
206                                'options' => array(
207                                        'nom' => 'config[coordonnees][organisation]',
208                                        'conteneur_class' => 'pleine_largeur',
209                                        'caption' => _T('profil:champ_config_coordonnees_organisation_caption'),
210                                        'afficher_si' => '@config[activer_organisation]@ == "on" && @config[activer_coordonnees_organisation]@ == "on"',
211                                ),
212                        );
213                }
214                // On ajoute le groupe au formulaire
215                $saisies[] = $groupe_organisation;
216               
217                // Le contact
218                $groupe_contact = array(
219                        'saisie' => 'fieldset',
220                        'options' => array(
221                                'nom' => 'groupe_contact',
222                                'label' => _T('profil:champ_groupe_contact_label'),
223                        ),
224                        'saisies' => array(),
225                );
226                // La case pour activer le contact
227                $groupe_contact['saisies'][] = array(
228                        'saisie' => 'case',
229                        'options' => array(
230                                'nom' => 'config[activer_contact]',
231                                'conteneur_class' => 'pleine_largeur',
232                                'label_case' => _T('profil:champ_config_activer_contact_label_case'),
233                        ),
234                );
235                $groupe_contact['saisies'][] = array(
236                        'saisie' => 'explication',
237                        'options' => array(
238                                'nom' => 'config[activer_contact_explication]',
239                                'texte' => _T('profil:champ_config_activer_contact_explication_texte'),
240                                'afficher_si' => '@config[activer_organisation]@ == "on"',
241                        ),
242                );
243                // Le champ libre pour donner une légende de groupe de champs
244                $groupe_contact['saisies'][] = array(
245                        'saisie' => 'input',
246                        'options' => array(
247                                'nom' => 'config[activer_groupe_contact]',
248                                'label' => _T('profil:champ_config_activer_groupe_contact_label'),
249                                'explication' => _T('profil:champ_config_activer_groupe_explication'),
250                                'afficher_si' => '@config[activer_contact]@ == "on"',
251                        ),
252                );
253                // On récupère les champs de contact, que les noms
254                $saisies_contact = profils_chercher_saisies_objet('contact');
255                $data_rows_contact = saisies_lister_labels($saisies_contact);
256                $groupe_contact['saisies'][] = array(
257                        'saisie' => 'choix_grille',
258                        'options' => array(
259                                'nom' => 'config[contact]',
260                                'caption' => _T('profil:champ_config_contact_caption'),
261                                'conteneur_class' => 'pleine_largeur',
262                                'multiple' => 'oui',
263                                'data_cols' => $data_cols,
264                                'data_rows' => $data_rows_contact,
265                                'afficher_si' => '@config[activer_contact]@ == "on"',
266                        ),
267                );
268                // Coordoonnées pour le contact si plugin idoine
269                if (defined('_DIR_PLUGIN_COORDONNEES')) {
270                        $groupe_contact['saisies'][] = array(
271                                'saisie' => 'case',
272                                'options' => array(
273                                        'nom' => 'config[activer_coordonnees_contact]',
274                                        'label_case' => _T('profil:champ_config_activer_coordonnees_contact_label_case'),
275                                        'conteneur_class' => 'pleine_largeur',
276                                        'afficher_si' => '@config[activer_contact]@ == "on"',
277                                ),
278                        );
279                        $groupe_contact['saisies'][] = array(
280                                'saisie' => 'profil_coordonnees',
281                                'options' => array(
282                                        'nom' => 'config[coordonnees][contact]',
283                                        'conteneur_class' => 'pleine_largeur',
284                                        'caption' => _T('profil:champ_config_coordonnees_contact_caption'),
285                                        'afficher_si' => '@config[activer_contact]@ == "on" && @config[activer_coordonnees_contact]@ == "on"',
286                                ),
287                        );
288                }
289                // On ajoute le groupe au formulaire
290                $saisies[] = $groupe_contact;
291               
292                // S'il y a l'option pour utiliser plusieurs annuaires
293                if (lire_config('contacts_et_organisations/utiliser_annuaires')) {
294                        $saisies[] = array(
295                                'saisie' => 'fieldset',
296                                'options' => array(
297                                        'label' => _T('contacts:annuaire'),
298                                        'nom' => 'groupe_annuaire',
299                                        'afficher_si' => '@config[activer_organisation]@ == "on" || @config[activer_contact]@ == "on"',
300                                ),
301                                'saisies' => array(
302                                        array(
303                                                'saisie' => 'annuaires',
304                                                'options' => array(
305                                                        'nom' => 'config[id_annuaire]',
306                                                        'label' => _T('profil:champ_config_id_annuaire_label'),
307                                                        'explication' => _T('profil:champ_config_id_annuaire_explication'),
308                                                ),
309                                        ),
310                                ),
311                        );
312                }
313        }
314       
315        return $saisies;
316}
317
318/**
319 * Chargement du formulaire d'édition de profil
320 *
321 * Déclarer les champs postés et y intégrer les valeurs par défaut
322 *
323 * @uses formulaires_editer_objet_charger()
324 *
325 * @param int|string $id_profil
326 *     Identifiant du profil. 'new' pour un nouveau profil.
327 * @param string $retour
328 *     URL de redirection après le traitement
329 * @param int $lier_trad
330 *     Identifiant éventuel d'un profil source d'une traduction
331 * @param string $config_fonc
332 *     Nom de la fonction ajoutant des configurations particulières au formulaire
333 * @param array $row
334 *     Valeurs de la ligne SQL du profil, si connu
335 * @param string $hidden
336 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
337 * @return array
338 *     Environnement du formulaire
339 */
340function formulaires_editer_profil_charger_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
341        $valeurs = formulaires_editer_objet_charger('profil', $id_profil, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
342        $valeurs['config'] = unserialize($valeurs['config']);
343       
344        return $valeurs;
345}
346
347/**
348 * Vérifications du formulaire d'édition de profil
349 *
350 * Vérifier les champs postés et signaler d'éventuelles erreurs
351 *
352 * @uses formulaires_editer_objet_verifier()
353 *
354 * @param int|string $id_profil
355 *     Identifiant du profil. 'new' pour un nouveau profil.
356 * @param string $retour
357 *     URL de redirection après le traitement
358 * @param int $lier_trad
359 *     Identifiant éventuel d'un profil source d'une traduction
360 * @param string $config_fonc
361 *     Nom de la fonction ajoutant des configurations particulières au formulaire
362 * @param array $row
363 *     Valeurs de la ligne SQL du profil, si connu
364 * @param string $hidden
365 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
366 * @return array
367 *     Tableau des erreurs
368 */
369function formulaires_editer_profil_verifier_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
370        $erreurs = array();
371        $config = _request('config');
372       
373        // On teste l'identifiant, ne doit pas exister
374        if (
375                $identifiant = _request('identifiant')
376                and sql_getfetsel('id_profil', 'spip_profils', array('identifiant = '.sql_quote($identifiant), 'id_profil != '.intval($id_profil)))
377        ) {
378                $erreurs['identifiant'] = _T('profil:erreur_identifiant_existant');
379        }
380       
381        // On teste si on a bien un email obligatoire
382        if (!profils_chercher_champ_email_principal($config)) {
383                $erreurs['message_erreur'] = _T('profil:erreur_email_obligatoire');
384        }
385       
386        // On normalise certaines choses dans les coordonnées
387        $config = formulaires_editer_profil_traiter_coordonnees($config);
388        set_request('config', $config);
389       
390        return $erreurs;
391}
392
393/**
394 * Traitement du formulaire d'édition de profil
395 *
396 * Traiter les champs postés
397 *
398 * @uses formulaires_editer_objet_traiter()
399 *
400 * @param int|string $id_profil
401 *     Identifiant du profil. 'new' pour un nouveau profil.
402 * @param string $retour
403 *     URL de redirection après le traitement
404 * @param int $lier_trad
405 *     Identifiant éventuel d'un profil source d'une traduction
406 * @param string $config_fonc
407 *     Nom de la fonction ajoutant des configurations particulières au formulaire
408 * @param array $row
409 *     Valeurs de la ligne SQL du profil, si connu
410 * @param string $hidden
411 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
412 * @return array
413 *     Retours des traitements
414 */
415function formulaires_editer_profil_traiter_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
416        set_request('config', serialize(_request('config')));
417       
418        $retours = formulaires_editer_objet_traiter('profil', $id_profil, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
419       
420        return $retours;
421}
422
423/**
424 * Nettoie les coordonnées non utilisées dans le tableau de config du profil
425 *
426 * @param array $config
427 *              Tableau de configuration d'un profil
428 * @return array
429 *              Retourne le tableau de config nettoyé
430 */
431function formulaires_editer_profil_traiter_coordonnees($config) {
432        foreach (array('auteur', 'organisation', 'contact') as $objet) {
433                if (!isset($config["activer_coordonnees_$objet"]) or !$config["activer_coordonnees_$objet"]) {
434                        unset($config['coordonnees'][$objet]);
435                }
436                else {
437                        foreach($config['coordonnees'][$objet] as $coordonnee => $champs) {
438                                // Pour chacun des champs
439                                foreach ($champs as $cle => $champ) {
440                                        // S'il n'y a ni inscription, ni édition, on supprime le champ de la liste
441                                        if (!isset($champ['inscription']) and !isset($champ['edition'])) {
442                                                unset($config['coordonnees'][$objet][$coordonnee][$cle]);
443                                        }
444                                }
445                                // On refait l'ordre
446                                $config['coordonnees'][$objet][$coordonnee] = array_values($config['coordonnees'][$objet][$coordonnee]);
447                        }
448                }
449        }
450       
451        return $config;
452}
Note: See TracBrowser for help on using the repository browser.