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

Last change on this file since 65744 was 65744, checked in by marcimat@…, 9 years ago

Ajout d'un plugin nommé « Éléments »

L'idée un peu derrière est un peu un mélange entre le Noizetier et Composition.

On peut ici définir des éléments (sorte de noiZettes qui ont très peu de configurations - 0 ou 1 champ) qui pourront être liées sur les objets éditoriaux, au choix, mais au cas par cas : ce n'est pas «tous les articles» (comme le noizetier) mais sur cet article précis (comme composition).

Les éléments choisis sont sauvés dans une table spip_elements (objet, id_objet,bloc, elements) où le bloc (pour l'instant uniquement 'extra') pourrait être un nom de bloc Zpip, et 'elements' contient la sérialisation des informations des éléments actifs et de l'environnement à leur transmettre.

L'idée est que pour un site précis, un admin puisse choisir des blocs à ajouter sur certains articles. Par exemple ajouter un sondage particulier dans une colonne de l'article (c'est au webmestre actuellement d'ajouter l'inclusion 'inclure/elements' dans le squelette mais on pourrait imaginer que si Zpip est présent que ça le fasse tout seul)

Il n'y a volontairement qu'un élément dans le plugin (l'élément texte) pour être le plus simple possible. Cependant, c'est dans la configuration du plugin que l'on indique, parmis la liste des éléments disponibles (stockés dans le répertoire elements/) lesquels on autorise sur le site. De ce fait, même si un plugin fournit 54 éléments, le webmestre peut décider lesquels il autorise sur son site.

Par souci de compatibilité, le yaml décrivant un élément est exactement le même que celui décrivant une noiZette. Cela dit, une fois de plus, l'objectif n'est pas de fournir une liste de noizettes hautements configurables mais justement plutôt des blocs touts faits à ne pas configurer (hormis par exemple un identifiant d'objet à choisir).

File size: 5.2 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                $index = explode('/', $elem);
99                $index = end($index);
100                unset($elements[$index]);
101                $elements = array_values($elements);
102                // on les fiche dans l'environnement...
103                set_request('elements', $elements);
104                // indiquer qu'on a pris en compte l'element
105                $erreurs['message_info'] = _T("elements:message_element_moins")
106                        . '<br />' . _T("elements:message_element_enregistrer");
107        }
108
109        return $erreurs;
110}
111
112
113
114/**
115 * Traitements du formulaire de choix d'éléments.
116 *
117 * Pour chaque champ posté, effectue les vérifications demandées par
118 * les saisies et retourne éventuellement les erreurs de saisie.
119 *
120 * @param string $objet
121 *     Type d'objet réceptionnant les éléments
122 * @param int $id_objet
123 *     Identifiant de l'objet
124 * @param string $bloc
125 *     Nom du bloc qui utilisera les éléments
126 *
127 * @return array
128 *     Tableau des erreurs
129**/
130function formulaires_choisir_elements_traiter($objet, $id_objet, $bloc='extra') {
131        $res = array();
132        $res['editable'] = true;
133
134        $elements = _request('elements');
135
136        // pas d'élément, on supprime la ligne SQL
137        if (!$elements) {
138                sql_delete('spip_elements', array(
139                        'objet=' . sql_quote($objet),
140                        'id_objet=' . sql_quote($id_objet),
141                        'bloc=' . sql_quote($bloc)
142                        ));
143        } else {
144                $elements = serialize($elements);
145
146                $old = sql_getfetsel('id_element', 'spip_elements', array(
147                        'objet=' . sql_quote($objet),
148                        'id_objet=' . sql_quote($id_objet),
149                        'bloc=' . sql_quote($bloc)
150                ));
151
152                if ($old) {
153                        sql_updateq('spip_elements', array('elements' => $elements),
154                            array('id_element='. sql_quote($old)));
155                } else {
156                        sql_insertq('spip_elements', array(
157                                'objet'    => $objet,
158                                'id_objet' => $id_objet,
159                                'bloc'     => $bloc,
160                                'elements' => $elements
161                        ));
162                }
163        }
164        $res['message_ok'] = _T("elements:elements_sauvegardes");
165
166        return $res;
167}
168
169
170/**
171 * Créer les saisies de configuration d'un élément
172 *
173 * - Ajoute un hidden du nom de l'élément
174 * - Définit les name des saisies
175 *
176 * Change les noms de saisies tel que 'bidule' en
177 * @param array $element
178 *     Tableau de descriptions l'un élément
179 * @param int $index
180 *     Numéro de l'élément dans la liste
181 * @return array
182 *     Tableau de descriptions des saisies
183**/
184function elements_saisies_preparer($element, $index) {
185
186        $saisies = $element['parametres'];
187        $saisies = saisies_transformer_noms($saisies, '~^(.*)$~', 'elements['.$index.'][contexte][$1]'); 
188        $saisies = saisies_inserer($saisies, array(
189                'saisie' => 'hidden',
190                'options' => array(
191                        'nom' => "elements[$index][element]",
192                        'valeur' => $element['element'],
193                        'defaut' => $element['element'],
194                )
195        ));
196
197        return $saisies;
198}
Note: See TracBrowser for help on using the repository browser.