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

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

Notice PHP en moins lorsqu'on duplique un champ.

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