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

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

On ne pouvait pas modifier les saisies enfants d'un fieldset par exemple. Là on ne prend les enfants de la saisie d'origine que si la modif n'en contient pas elle-même.

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