source: spip-zone/_plugins_/elements/formulaires/choisir_elements.php @ 65749

Last change on this file since 65749 was 65749, checked in by marcimat@…, 7 years ago
  • Ajout de l'affichage d'un extrait de l'élément dans le privé (en fait un titre), calculé par le squelette elements/{element}_titre.html s'il est présent
  • Permettre de déplacer sommairement les éléments
File size: 6.0 KB
Line 
1<?php
2
3/**
4 * Gestion des éléments choisis sur un objet / id_objet, pour un bloc donné
5 *
6 * @package SPIP\Elements\Formulaires
7**/
8
9// Sécurité
10if (!defined("_ECRIRE_INC_VERSION")) return;
11
12/**
13 * Chargement du formulaire de choix d'éléments.
14 *
15 * Affiche le éléments choisis et leur configuration et permet
16 * de les ordonner, de les supprimer ou d'ajouter de nouveaux éléments
17 *
18 * @param string $objet
19 *     Type d'objet réceptionnant les éléments
20 * @param int $id_objet
21 *     Identifiant de l'objet
22 * @param string $bloc
23 *     Nom du bloc qui utilisera les éléments
24 *
25 * @return array
26 *     Contexte envoyé au squelette HTML du formulaire.
27**/
28function formulaires_choisir_elements_charger($objet, $id_objet, $bloc='extra') {
29        if (!$objet OR !$id_objet OR !$bloc) {
30                return null;
31        }
32
33        $contexte = array();
34
35        // elements déjà là
36        $table = table_objet_sql($objet);
37        $choix = sql_getfetsel('elements', 'spip_elements', array(
38                'objet=' . sql_quote($objet),
39                'id_objet=' . sql_quote($id_objet),
40                'bloc=' . sql_quote($bloc)
41        ));
42        if (!$choix) $choix = array();
43        else $choix = unserialize($choix);
44
45        $contexte['elements'] = $choix;
46
47        return $contexte;
48}
49
50
51/**
52 * Vérification du formulaire de choix d'éléments.
53 *
54 * Pour chaque champ posté, effectue les vérifications demandées par
55 * les saisies et retourne éventuellement les erreurs de saisie.
56 *
57 * @param string $objet
58 *     Type d'objet réceptionnant les éléments
59 * @param int $id_objet
60 *     Identifiant de l'objet
61 * @param string $bloc
62 *     Nom du bloc qui utilisera les éléments
63 *
64 * @return array
65 *     Tableau des erreurs
66**/
67function formulaires_choisir_elements_verifier($objet, $id_objet, $bloc='extra') {
68        $erreurs = array();
69
70        // tous les éléments sélectionnés
71        $elements = _request('elements');
72        if (!$elements) $elements = array();
73
74        // ajout d'un élément à la liste
75        if ($elem = _request('ajouter_element')) {
76
77                if ($desc = lister_elements_par_nom($elem)) {
78                        // indiquer qu'on a pris en compte l'element
79                        $erreurs['message_info'] = _T("elements:message_element_plus")
80                                . '<br />' . _T("elements:message_element_enregistrer");
81
82                        // ajout de l'élément aux éléments sélectionnés
83                        $elements[ count($elements) ] = array(
84                                'element' => $elem,   // nom de l'élément
85                                'contexte' => array() // contexte qui sera transmis au squelette de l'élément
86                        );
87                        // on les fiche dans l'environnement...
88                        set_request('elements', $elements);
89                } else {
90                        // bah c'est une drole d'erreur !
91                        $erreurs['message_erreur'] = _T("elements:element_type_introuvable");
92                }
93        }
94
95        // supprimer un élément de la liste
96        if ($elem = _request('supprimer_element')) {
97                // element/3
98                list(,$index) = explode('/', $elem);
99                unset($elements[$index]);
100                $elements = array_values($elements);
101                // on les fiche dans l'environnement...
102                set_request('elements', $elements);
103                // indiquer qu'on a pris en compte l'element
104                $erreurs['message_info'] = _T("elements:message_element_moins")
105                        . '<br />' . _T("elements:message_element_enregistrer");
106        }
107
108        // déplace un élément d'un cran vers le bas ou vers le haut
109        if ($elem = _request('deplacer_element')) {
110                // element/3/-1
111                list(,$index,$pos) = explode('/', $elem);
112                $deplace = $elements[$index];
113                unset($elements[$index]);
114                $elements = array_values($elements);
115                // nouvel index
116                if ($pos[0] == '-') {
117                        $index = $index - substr($pos,1);
118                        if ($index < 0) $index = 0;
119                } else {
120                        $index = $index + $pos;
121                        if ($index > count($elements)) $index = count($elements);
122                }
123
124                array_splice($elements, $index, 0, array($deplace));
125
126                // on les fiche dans l'environnement...
127                set_request('elements', $elements);
128                // indiquer qu'on a pris en compte l'element
129                $erreurs['message_info'] = _T("elements:message_element_deplace")
130                        . '<br />' . _T("elements:message_element_enregistrer");
131        }
132
133        return $erreurs;
134}
135
136
137
138/**
139 * Traitements du formulaire de choix d'éléments.
140 *
141 * Pour chaque champ posté, effectue les vérifications demandées par
142 * les saisies et retourne éventuellement les erreurs de saisie.
143 *
144 * @param string $objet
145 *     Type d'objet réceptionnant les éléments
146 * @param int $id_objet
147 *     Identifiant de l'objet
148 * @param string $bloc
149 *     Nom du bloc qui utilisera les éléments
150 *
151 * @return array
152 *     Tableau des erreurs
153**/
154function formulaires_choisir_elements_traiter($objet, $id_objet, $bloc='extra') {
155        $res = array();
156        $res['editable'] = true;
157
158        $elements = _request('elements');
159
160        // pas d'élément, on supprime la ligne SQL
161        if (!$elements) {
162                sql_delete('spip_elements', array(
163                        'objet=' . sql_quote($objet),
164                        'id_objet=' . sql_quote($id_objet),
165                        'bloc=' . sql_quote($bloc)
166                        ));
167        } else {
168                $elements = serialize($elements);
169
170                $old = sql_getfetsel('id_element', 'spip_elements', array(
171                        'objet=' . sql_quote($objet),
172                        'id_objet=' . sql_quote($id_objet),
173                        'bloc=' . sql_quote($bloc)
174                ));
175
176                if ($old) {
177                        sql_updateq('spip_elements', array('elements' => $elements),
178                            array('id_element='. sql_quote($old)));
179                } else {
180                        sql_insertq('spip_elements', array(
181                                'objet'    => $objet,
182                                'id_objet' => $id_objet,
183                                'bloc'     => $bloc,
184                                'elements' => $elements
185                        ));
186                }
187        }
188        $res['message_ok'] = _T("elements:elements_sauvegardes");
189
190        return $res;
191}
192
193
194/**
195 * Créer les saisies de configuration d'un élément
196 *
197 * - Ajoute un hidden du nom de l'élément
198 * - Définit les name des saisies
199 *
200 * Change les noms de saisies tel que 'bidule' en
201 * @param array $element
202 *     Tableau de descriptions l'un élément
203 * @param int $index
204 *     Numéro de l'élément dans la liste
205 * @return array
206 *     Tableau de descriptions des saisies
207**/
208function elements_saisies_preparer($element, $index) {
209
210        $saisies = $element['parametres'];
211        $saisies = saisies_transformer_noms($saisies, '~^(.*)$~', 'elements['.$index.'][contexte][$1]'); 
212        $saisies = saisies_inserer($saisies, array(
213                'saisie' => 'hidden',
214                'options' => array(
215                        'nom' => "elements[$index][element]",
216                        'valeur' => $element['element'],
217                        'defaut' => $element['element'],
218                )
219        ));
220
221        return $saisies;
222}
Note: See TracBrowser for help on using the repository browser.