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

Last change on this file since 111199 was 111199, checked in by tcharlss@…, 2 years ago

Petite précision dans le form d'édition de profil : il faut au moins une coordonnée de cochée afin d'en ajouter d'autres.

File size: 15.2 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                                        'caption_explication' => _T('profil:champ_config_coordonnees_explication'),
212                                ),
213                        );
214                }
215                // On ajoute le groupe au formulaire
216                $saisies[] = $groupe_organisation;
217               
218                // Le contact
219                $groupe_contact = array(
220                        'saisie' => 'fieldset',
221                        'options' => array(
222                                'nom' => 'groupe_contact',
223                                'label' => _T('profil:champ_groupe_contact_label'),
224                        ),
225                        'saisies' => array(),
226                );
227                // La case pour activer le contact
228                $groupe_contact['saisies'][] = array(
229                        'saisie' => 'case',
230                        'options' => array(
231                                'nom' => 'config[activer_contact]',
232                                'conteneur_class' => 'pleine_largeur',
233                                'label_case' => _T('profil:champ_config_activer_contact_label_case'),
234                        ),
235                );
236                $groupe_contact['saisies'][] = array(
237                        'saisie' => 'explication',
238                        'options' => array(
239                                'nom' => 'config[activer_contact_explication]',
240                                'texte' => _T('profil:champ_config_activer_contact_explication_texte'),
241                                'afficher_si' => '@config[activer_organisation]@ == "on"',
242                        ),
243                );
244                // Le champ libre pour donner une légende de groupe de champs
245                $groupe_contact['saisies'][] = array(
246                        'saisie' => 'input',
247                        'options' => array(
248                                'nom' => 'config[activer_groupe_contact]',
249                                'label' => _T('profil:champ_config_activer_groupe_contact_label'),
250                                'explication' => _T('profil:champ_config_activer_groupe_explication'),
251                                'afficher_si' => '@config[activer_contact]@ == "on"',
252                        ),
253                );
254                // On récupère les champs de contact, que les noms
255                $saisies_contact = profils_chercher_saisies_objet('contact');
256                $data_rows_contact = saisies_lister_labels($saisies_contact);
257                $groupe_contact['saisies'][] = array(
258                        'saisie' => 'choix_grille',
259                        'options' => array(
260                                'nom' => 'config[contact]',
261                                'caption' => _T('profil:champ_config_contact_caption'),
262                                'conteneur_class' => 'pleine_largeur',
263                                'multiple' => 'oui',
264                                'data_cols' => $data_cols,
265                                'data_rows' => $data_rows_contact,
266                                'afficher_si' => '@config[activer_contact]@ == "on"',
267                        ),
268                );
269                // Coordoonnées pour le contact si plugin idoine
270                if (defined('_DIR_PLUGIN_COORDONNEES')) {
271                        $groupe_contact['saisies'][] = array(
272                                'saisie' => 'case',
273                                'options' => array(
274                                        'nom' => 'config[activer_coordonnees_contact]',
275                                        'label_case' => _T('profil:champ_config_activer_coordonnees_contact_label_case'),
276                                        'conteneur_class' => 'pleine_largeur',
277                                        'afficher_si' => '@config[activer_contact]@ == "on"',
278                                ),
279                        );
280                        $groupe_contact['saisies'][] = array(
281                                'saisie' => 'profil_coordonnees',
282                                'options' => array(
283                                        'nom' => 'config[coordonnees][contact]',
284                                        'conteneur_class' => 'pleine_largeur',
285                                        'caption' => _T('profil:champ_config_coordonnees_contact_caption'),
286                                        'afficher_si' => '@config[activer_contact]@ == "on" && @config[activer_coordonnees_contact]@ == "on"',
287                                        'caption_explication' => _T('profil:champ_config_coordonnees_explication'),
288                                ),
289                        );
290                }
291                // On ajoute le groupe au formulaire
292                $saisies[] = $groupe_contact;
293               
294                // S'il y a l'option pour utiliser plusieurs annuaires
295                if (lire_config('contacts_et_organisations/utiliser_annuaires')) {
296                        $saisies[] = array(
297                                'saisie' => 'fieldset',
298                                'options' => array(
299                                        'label' => _T('contacts:annuaire'),
300                                        'nom' => 'groupe_annuaire',
301                                        'afficher_si' => '@config[activer_organisation]@ == "on" || @config[activer_contact]@ == "on"',
302                                ),
303                                'saisies' => array(
304                                        array(
305                                                'saisie' => 'annuaires',
306                                                'options' => array(
307                                                        'nom' => 'config[id_annuaire]',
308                                                        'label' => _T('profil:champ_config_id_annuaire_label'),
309                                                        'explication' => _T('profil:champ_config_id_annuaire_explication'),
310                                                ),
311                                        ),
312                                ),
313                        );
314                }
315        }
316       
317        return $saisies;
318}
319
320/**
321 * Chargement du formulaire d'édition de profil
322 *
323 * Déclarer les champs postés et y intégrer les valeurs par défaut
324 *
325 * @uses formulaires_editer_objet_charger()
326 *
327 * @param int|string $id_profil
328 *     Identifiant du profil. 'new' pour un nouveau profil.
329 * @param string $retour
330 *     URL de redirection après le traitement
331 * @param int $lier_trad
332 *     Identifiant éventuel d'un profil source d'une traduction
333 * @param string $config_fonc
334 *     Nom de la fonction ajoutant des configurations particulières au formulaire
335 * @param array $row
336 *     Valeurs de la ligne SQL du profil, si connu
337 * @param string $hidden
338 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
339 * @return array
340 *     Environnement du formulaire
341 */
342function formulaires_editer_profil_charger_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
343        $valeurs = formulaires_editer_objet_charger('profil', $id_profil, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
344        $valeurs['config'] = unserialize($valeurs['config']);
345       
346        return $valeurs;
347}
348
349/**
350 * Vérifications du formulaire d'édition de profil
351 *
352 * Vérifier les champs postés et signaler d'éventuelles erreurs
353 *
354 * @uses formulaires_editer_objet_verifier()
355 *
356 * @param int|string $id_profil
357 *     Identifiant du profil. 'new' pour un nouveau profil.
358 * @param string $retour
359 *     URL de redirection après le traitement
360 * @param int $lier_trad
361 *     Identifiant éventuel d'un profil source d'une traduction
362 * @param string $config_fonc
363 *     Nom de la fonction ajoutant des configurations particulières au formulaire
364 * @param array $row
365 *     Valeurs de la ligne SQL du profil, si connu
366 * @param string $hidden
367 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
368 * @return array
369 *     Tableau des erreurs
370 */
371function formulaires_editer_profil_verifier_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
372        $erreurs = array();
373        $config = _request('config');
374       
375        // On teste l'identifiant, ne doit pas exister
376        if (
377                $identifiant = _request('identifiant')
378                and sql_getfetsel('id_profil', 'spip_profils', array('identifiant = '.sql_quote($identifiant), 'id_profil != '.intval($id_profil)))
379        ) {
380                $erreurs['identifiant'] = _T('profil:erreur_identifiant_existant');
381        }
382       
383        // On teste si on a bien un email obligatoire
384        if (!profils_chercher_champ_email_principal($config)) {
385                $erreurs['message_erreur'] = _T('profil:erreur_email_obligatoire');
386        }
387       
388        // On normalise certaines choses dans les coordonnées
389        $config = formulaires_editer_profil_traiter_coordonnees($config);
390        set_request('config', $config);
391       
392        return $erreurs;
393}
394
395/**
396 * Traitement du formulaire d'édition de profil
397 *
398 * Traiter les champs postés
399 *
400 * @uses formulaires_editer_objet_traiter()
401 *
402 * @param int|string $id_profil
403 *     Identifiant du profil. 'new' pour un nouveau profil.
404 * @param string $retour
405 *     URL de redirection après le traitement
406 * @param int $lier_trad
407 *     Identifiant éventuel d'un profil source d'une traduction
408 * @param string $config_fonc
409 *     Nom de la fonction ajoutant des configurations particulières au formulaire
410 * @param array $row
411 *     Valeurs de la ligne SQL du profil, si connu
412 * @param string $hidden
413 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
414 * @return array
415 *     Retours des traitements
416 */
417function formulaires_editer_profil_traiter_dist($id_profil = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
418        set_request('config', serialize(_request('config')));
419       
420        $retours = formulaires_editer_objet_traiter('profil', $id_profil, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
421       
422        return $retours;
423}
424
425/**
426 * Nettoie les coordonnées non utilisées dans le tableau de config du profil
427 *
428 * @param array $config
429 *              Tableau de configuration d'un profil
430 * @return array
431 *              Retourne le tableau de config nettoyé
432 */
433function formulaires_editer_profil_traiter_coordonnees($config) {
434        foreach (array('auteur', 'organisation', 'contact') as $objet) {
435                if (!isset($config["activer_coordonnees_$objet"]) or !$config["activer_coordonnees_$objet"]) {
436                        unset($config['coordonnees'][$objet]);
437                }
438                else {
439                        foreach($config['coordonnees'][$objet] as $coordonnee => $champs) {
440                                // Pour chacun des champs
441                                foreach ($champs as $cle => $champ) {
442                                        // S'il n'y a ni inscription, ni édition, on supprime le champ de la liste
443                                        if (!isset($champ['inscription']) and !isset($champ['edition'])) {
444                                                unset($config['coordonnees'][$objet][$coordonnee][$cle]);
445                                        }
446                                }
447                                // On refait l'ordre
448                                $config['coordonnees'][$objet][$coordonnee] = array_values($config['coordonnees'][$objet][$coordonnee]);
449                        }
450                }
451        }
452       
453        return $config;
454}
Note: See TracBrowser for help on using the repository browser.