source: spip-zone/_plugins_/saisies/trunk/inc/saisies_manipuler.php @ 107775

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

Après discussion on renomme en 'options' par cohérence avec le nom donné pour les saisies, et puis ce sont aussi des options d'affichage, mais pour le form complet

File size: 10.8 KB
Line 
1<?php
2
3/**
4 * Gestion de l'affichage des saisies.
5 *
6 * @return SPIP\Saisies\Manipuler
7 **/
8
9// Sécurité
10if (!defined('_ECRIRE_INC_VERSION')) {
11        return;
12}
13
14/**
15 * Supprimer une saisie dont on donne l'identifiant, le nom ou le chemin.
16 *
17 * @param array        $saisies             Tableau des descriptions de saisies
18 * @param string|array $id_ou_nom_ou_chemin
19 *     L'identifiant unique
20 *     ou le nom de la saisie à supprimer
21 *     ou son chemin sous forme d'une liste de clés
22 *
23 * @return array
24 *               Tableau modifié décrivant les saisies
25 */
26function saisies_supprimer($saisies, $id_ou_nom_ou_chemin) {
27        // On enlève les options générales avant de manipuler
28        if (isset($saisies['options'])) {
29                $options_generales = $saisies['options'];
30                unset($saisies['options']);
31        }
32       
33        // Si la saisie n'existe pas, on ne fait rien
34        if ($chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true)) {
35                // La position finale de la saisie
36                $position = array_pop($chemin);
37
38                // On va chercher le parent par référence pour pouvoir le modifier
39                $parent = &$saisies;
40                foreach ($chemin as $cle) {
41                        $parent = &$parent[$cle];
42                }
43
44                // On supprime et réordonne
45                unset($parent[$position]);
46                $parent = array_values($parent);
47        }
48       
49        // On remet les options générales après avoir manipulé
50        if (isset($options_generales)) {
51                $saisies['options'] = $options_generales;
52        }
53
54        return $saisies;
55}
56
57/**
58 * Insère une saisie à une position donnée.
59 *
60 * @param array $saisies     Tableau des descriptions de saisies
61 * @param array $saisie     Description de la saisie à insérer
62 * @param array $chemin
63 *     Position complète où insérer la saisie.
64 *     En absence, insère la saisie à la fin.
65 *
66 * @return array
67 *     Tableau des saisies complété de la saisie insérée
68 */
69function saisies_inserer($saisies, $saisie, $chemin = array()) {
70        // On enlève les options générales avant de manipuler
71        if (isset($saisies['options'])) {
72                $options_generales = $saisies['options'];
73                unset($saisies['options']);
74        }
75       
76        // On vérifie quand même que ce qu'on veut insérer est correct
77        if ($saisie['saisie'] and $saisie['options']['nom']) {
78                // ajouter un identifiant
79                $saisie = saisie_identifier($saisie);
80
81                // Par défaut le parent c'est la racine
82                $parent = &$saisies;
83                // S'il n'y a pas de position, on va insérer à la fin du formulaire
84                if (!$chemin) {
85                        $position = count($parent);
86                } elseif (is_array($chemin)) {
87                        $position = array_pop($chemin);
88                        foreach ($chemin as $cle) {
89                                // Si la clé est un conteneur de saisies "saisies" et qu'elle n'existe pas encore, on la crée
90                                if ($cle == 'saisies' and !isset($parent[$cle])) {
91                                        $parent[$cle] = array();
92                                }
93                                $parent = &$parent[$cle];
94                        }
95                        // On vérifie maintenant que la position est cohérente avec le parent
96                        if ($position < 0) {
97                                $position = 0;
98                        } elseif ($position > count($parent)) {
99                                $position = count($parent);
100                        }
101                }
102                // Et enfin on insère
103                array_splice($parent, $position, 0, array($saisie));
104        }
105       
106        // On remet les options générales après avoir manipulé
107        if (isset($options_generales)) {
108                $saisies['options'] = $options_generales;
109        }
110       
111        return $saisies;
112}
113
114/**
115 * Duplique une saisie (ou groupe de saisies)
116 * en placant la copie à la suite de la saisie d'origine.
117 * Modifie automatiquement les identifiants des saisies.
118 *
119 * @param array        $saisies             Un tableau décrivant les saisies
120 * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie a dupliquer
121 *
122 * @return array Retourne le tableau modifié des saisies
123 */
124function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin) {
125        // On récupère le contenu de la saisie à déplacer
126        $saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
127        if ($saisie) {
128                list($clone) = saisies_transformer_noms_auto($saisies, array($saisie));
129                // insertion apres quoi ?
130                $chemin_validation = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
131                // 1 de plus pour mettre APRES le champ trouve
132                ++$chemin_validation[count($chemin_validation) - 1];
133                // On ajoute "copie" après le label du champs
134                $clone['options']['label'] .= ' '._T('saisies:construire_action_dupliquer_copie');
135
136                // Création de nouveau identifiants pour le clone
137                $clone = saisie_identifier($clone, true);
138
139                $saisies = saisies_inserer($saisies, $clone, $chemin_validation);
140        }
141
142        return $saisies;
143}
144
145/**
146 * Déplace une saisie existante autre part.
147 *
148 * @param array        $saisies             Un tableau décrivant les saisies
149 * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer
150 * @param string       $ou                  Le nom de la saisie devant laquelle on déplacera OU le nom d'un conteneur entre crochets [conteneur]
151 *
152 * @return array Retourne le tableau modifié des saisies
153 */
154function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou) {
155        // On récupère le contenu de la saisie à déplacer
156        $saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
157
158        // Si on l'a bien trouvé
159        if ($saisie) {
160                // On cherche l'endroit où la déplacer
161                // Si $ou est vide, c'est à la fin de la racine
162                if (!$ou) {
163                        $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
164                        $chemin = array(count($saisies));
165                } elseif (preg_match('/^\[(@?[\w]*)\]$/', $ou, $match)) {
166                        // Si l'endroit est entre crochet, c'est un conteneur
167                        $parent = $match[1];
168                        // Si dans les crochets il n'y a rien, on met à la fin du formulaire
169                        if (!$parent) {
170                                $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
171                                $chemin = array(count($saisies));
172                        } elseif (saisies_chercher($saisies, $parent, true)) {
173                                // Sinon on vérifie que ce conteneur existe
174                                // S'il existe on supprime la saisie et on recherche la nouvelle position
175                                $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
176                                $parent = saisies_chercher($saisies, $parent, true);
177                                $chemin = array_merge($parent, array('saisies', 1000000));
178                        } else {
179                                $chemin = false;
180                        }
181                } else {
182                        // Sinon ça sera devant un champ
183                        // On vérifie que le champ existe
184                        if (saisies_chercher($saisies, $ou, true)) {
185                                // S'il existe on supprime la saisie
186                                $saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
187                                // Et on recherche la nouvelle position qui n'est plus forcément la même maintenant qu'on a supprimé une saisie
188                                $chemin = saisies_chercher($saisies, $ou, true);
189                        } else {
190                                $chemin = false;
191                        }
192                }
193
194                // Si seulement on a bien trouvé un nouvel endroit où la placer, alors on déplace
195                if ($chemin) {
196                        $saisies = saisies_inserer($saisies, $saisie, $chemin);
197                }
198        }
199
200        return $saisies;
201}
202
203/**
204 * Modifie une saisie.
205 *
206 * @param array        $saisies             Un tableau décrivant les saisies
207 * @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à modifier
208 * @param array        $modifs              Le tableau des modifications à apporter à la saisie
209 *
210 * @return Retourne le tableau décrivant les saisies, mais modifié
211 */
212function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs) {
213        $chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
214        $position = array_pop($chemin);
215        $parent = &$saisies;
216        foreach ($chemin as $cle) {
217                $parent = &$parent[$cle];
218        }
219
220        // On récupère le type tel quel
221        $modifs['saisie'] = $parent[$position]['saisie'];
222        // On récupère le nom s'il n'y est pas
223        if (!isset($modifs['options']['nom'])) {
224                $modifs['options']['nom'] = $parent[$position]['options']['nom'];
225        }
226        // On récupère les enfants tels quels s'il n'y a pas des enfants dans la modif
227        if (!isset($modifs['saisies'])
228                and isset($parent[$position]['saisies'])
229                and is_array($parent[$position]['saisies'])
230        ) {
231                $modifs['saisies'] = $parent[$position]['saisies'];
232        }
233
234        // Si une option 'nouveau_type_saisie' est donnee, c'est que l'on souhaite
235        // peut être changer le type de saisie !
236        if (isset($modifs['options']['nouveau_type_saisie']) and $type = $modifs['options']['nouveau_type_saisie']) {
237                $modifs['saisie'] = $type;
238                unset($modifs['options']['nouveau_type_saisie']);
239        }
240
241        // On remplace tout
242        $parent[$position] = $modifs;
243
244        // Cette méthode ne marche pas trop
245        //$parent[$position] = array_replace_recursive($parent[$position], $modifs);
246
247        return $saisies;
248}
249
250/**
251 * Transforme tous les noms du formulaire avec un preg_replace.
252 *
253 * @param array  $saisies      Un tableau décrivant les saisies
254 * @param string $masque       Ce que l'on doit chercher dans le nom
255 * @param string $remplacement Ce par quoi on doit remplacer
256 *
257 * @return array               Retourne le tableau modifié des saisies
258 */
259function saisies_transformer_noms($saisies, $masque, $remplacement) {
260        if (is_array($saisies)) {
261                foreach ($saisies as $cle => $saisie) {
262                        $saisies[$cle]['options']['nom'] = preg_replace($masque, $remplacement, $saisie['options']['nom']);
263                        if (isset($saisie['saisies']) and is_array($saisie['saisies'])) {
264                                $saisies[$cle]['saisies'] = saisies_transformer_noms($saisie['saisies'], $masque, $remplacement);
265                        }
266                }
267        }
268
269        return $saisies;
270}
271
272/**
273 * Transforme les noms d'une liste de saisies pour qu'ils soient
274 * uniques dans le formulaire donné.
275 *
276 * @param array $formulaire  Le formulaire à analyser
277 * @param array $saisies     Un tableau décrivant les saisies.
278 *
279 * @return array
280 *     Retourne le tableau modifié des saisies
281 */
282function saisies_transformer_noms_auto($formulaire, $saisies) {
283        if (is_array($saisies)) {
284                foreach ($saisies as $cle => $saisie) {
285                        $saisies[$cle]['options']['nom'] = saisies_generer_nom($formulaire, $saisie['saisie']);
286                        // il faut prendre en compte dans $formulaire les saisies modifiees
287                        // sinon on aurait potentiellement 2 champs successifs avec le meme nom.
288                        // on n'ajoute pas les saisies dont les noms ne sont pas encore calculees.
289                        $new = $saisies[$cle];
290                        unset($new['saisies']);
291                        $formulaire[] = $new;
292
293                        if (isset($saisie['saisies']) and is_array($saisie['saisies'])) {
294                                $saisies[$cle]['saisies'] = saisies_transformer_noms_auto($formulaire, $saisie['saisies']);
295                        }
296                }
297        }
298
299        return $saisies;
300}
301
302/**
303 * Insère du HTML au début ou à la fin d'une saisie.
304 *
305 * @param array  $saisie    La description d'une seule saisie
306 * @param string $insertion Du code HTML à insérer dans la saisie
307 * @param string $ou        L'endroit où insérer le HTML : "debut" ou "fin"
308 *
309 * @return array            Retourne la description de la saisie modifiée
310 */
311function saisies_inserer_html($saisie, $insertion, $ou = 'fin') {
312        if (!in_array($ou, array('debut', 'fin'))) {
313                $ou = 'fin';
314        }
315
316        if ($ou == 'debut') {
317                $saisie['options']['inserer_debut'] =
318                        $insertion.(isset($saisie['options']['inserer_debut']) ? $saisie['options']['inserer_debut'] : '');
319        } elseif ($ou == 'fin') {
320                $saisie['options']['inserer_fin'] =
321                        (isset($saisie['options']['inserer_fin']) ? $saisie['options']['inserer_fin'] : '').$insertion;
322        }
323
324        return $saisie;
325}
Note: See TracBrowser for help on using the repository browser.