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

Last change on this file was 114512, checked in by root, 2 months ago

Coquille, lien de doc, explication sur les coordonnées auteurs comme pour les deux autres, stable.

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