source: spip-zone/_plugins_/saisies/inc/saisies_lister.php @ 86274

Last change on this file since 86274 was 86274, checked in by nicolas.dorigny@…, 6 years ago

array_merge_recursive est plus simple. Merci RastaPopoulos?

File size: 10.7 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) return;
5
6/*
7 * Prend la description complète du contenu d'un formulaire et retourne
8 * les saisies "à plat" classées par identifiant unique.
9 *
10 * @param array $contenu Le contenu d'un formulaire
11 * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets
12 * @return array Un tableau avec uniquement les saisies
13 */
14function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
15        $saisies = array();
16
17        if (is_array($contenu)){
18                foreach ($contenu as $ligne){
19                        if (is_array($ligne)) {
20                                $enfants_presents = (isset($ligne['saisies']) and is_array($ligne['saisies']));
21                                if (array_key_exists('saisie', $ligne) and (!$enfants_presents or $avec_conteneur)){
22                                        $saisies[$ligne['identifiant']] = $ligne;
23                                }
24                                if ($enfants_presents) {
25                                        $saisies = array_merge($saisies, saisies_lister_par_identifiant($ligne['saisies']));
26                                }
27                        }
28                }
29        }
30       
31        return $saisies;
32}
33
34/*
35 * Prend la description complète du contenu d'un formulaire et retourne
36 * les saisies "à plat" classées par nom.
37 *
38 * @param array $contenu Le contenu d'un formulaire
39 * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
40 * @return array Un tableau avec uniquement les saisies
41 */
42function saisies_lister_par_nom($contenu, $avec_conteneur=true){
43        $saisies = array();
44       
45        if (is_array($contenu)){
46                foreach ($contenu as $ligne){
47                        if (is_array($ligne)){
48                                if (array_key_exists('saisie', $ligne) and (!isset($ligne['saisies']) OR !is_array($ligne['saisies']) or $avec_conteneur)){
49                                        $saisies[$ligne['options']['nom']] = $ligne;
50                                }
51                                if (isset($ligne['saisies']) AND is_array($ligne['saisies'])){
52                                        $saisies = array_merge($saisies, saisies_lister_par_nom($ligne['saisies']));
53                                }
54                        }
55                }
56        }
57       
58        return $saisies;
59}
60
61/*
62 * Liste les saisies ayant une option X
63 * # saisies_lister_avec_option('sql', $saisies);
64 * 
65 *
66 * @param String $option Nom de l'option cherchée
67 * @param Array $saisies Liste de saisies
68 * @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
69 * @return liste de ces saisies triees par nom ayant une option X définie
70 */
71function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
72        $saisies_option = array();
73        // tri par nom si ce n'est pas le cas
74        $s = array_keys($saisies);
75        if (is_int(array_shift($s))) {
76                $trier = 'saisies_lister_par_' . $tri;
77                $saisies = $trier($saisies);
78        }
79        foreach ($saisies as $nom_ou_id => $saisie) {
80                if (isset($saisie['options'][$option]) and $saisie['options'][$option]) {
81                        $saisies_option[$nom_ou_id] = $saisie;
82                }
83        }
84
85        return $saisies_option;
86}
87
88/*
89 * Liste les saisies ayant une definition SQL
90 *
91 * @param Array $saisies liste de saisies
92 * @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
93 * @return liste de ces saisies triees par nom ayant une option sql définie
94 */
95function saisies_lister_avec_sql($saisies, $tri = 'nom') {
96        return saisies_lister_avec_option('sql', $saisies, $tri);
97}
98
99/*
100 * Prend la description complète du contenu d'un formulaire et retourne
101 * les saisies "à plat" classées par type de saisie.
102 * $saisie['input']['input_1'] = $saisie
103 *
104 * @param array $contenu Le contenu d'un formulaire
105 * @return array Un tableau avec uniquement les saisies
106 */
107function saisies_lister_par_type($contenu) {
108        $saisies = array();
109       
110        if (is_array($contenu)){
111                foreach ($contenu as $ligne){
112                        if (is_array($ligne)){
113                                if (array_key_exists('saisie', $ligne) and (!is_array($ligne['saisies']))){
114                                        $saisies[ $ligne['saisie'] ][ $ligne['options']['nom'] ] = $ligne;
115                                }
116                                if (is_array($ligne['saisies'])){
117                                        $saisies = array_merge_recursive($saisies, saisies_lister_par_type($ligne['saisies']));
118                                }
119                        }
120                }
121        }
122       
123        return $saisies;
124}
125
126/*
127 * Prend la description complète du contenu d'un formulaire et retourne
128 * une liste des noms des champs du formulaire.
129 *
130 * @param array $contenu Le contenu d'un formulaire
131 * @return array Un tableau listant les noms des champs
132 */
133function saisies_lister_champs($contenu, $avec_conteneur=true){
134        $saisies = saisies_lister_par_nom($contenu, $avec_conteneur);
135        return array_keys($saisies);
136}
137
138/*
139 * A utiliser dans une fonction charger d'un formulaire CVT,
140 * cette fonction renvoie le tableau de contexte correspondant
141 * de la forme $contexte['nom_champ'] = ''
142 *
143 * @param array $contenu Le contenu d'un formulaire (un tableau de saisies)
144 * @return array Un tableau de contexte
145 */
146function saisies_charger_champs($contenu) {
147        // array_fill_keys est disponible uniquement avec PHP >= 5.2.0
148        // return array_fill_keys(saisies_lister_champs($contenu, false), '');
149        $champs = array();
150        foreach (saisies_lister_champs($contenu, false) as $champ)
151                $champs[$champ] = '';
152        return $champs;
153}
154
155/*
156 * Prend la description complète du contenu d'un formulaire et retourne
157 * une liste des valeurs par défaut des champs du formulaire.
158 *
159 * @param array $contenu Le contenu d'un formulaire
160 * @return array Un tableau renvoyant la valeur par défaut de chaque champs
161 */
162function saisies_lister_valeurs_defaut($contenu){
163        $contenu = saisies_lister_par_nom($contenu, false);
164        $defauts = array();
165        foreach ($contenu as $nom => $saisie){
166                // Si le nom du champ est un tableau indexé, il faut parser !
167                if (preg_match('/([\w]+)((\[[\w]+\])+)/', $nom, $separe)){
168                        $nom = $separe[1];
169                        // Dans ce cas on ne récupère que le nom, la valeur par défaut du tableau devra être renseigné autre part
170                        $defauts[$nom] = array();
171                }
172                else{
173                        $defauts[$nom] = isset($saisie['options']['defaut']) ? $saisie['options']['defaut'] : '';
174                }
175        }
176        return $defauts;
177}
178
179/*
180 * Compare deux tableaux de saisies pour connaitre les différences
181 * @param array $saisies_anciennes Un tableau décrivant des saisies
182 * @param array $saisies_nouvelles Un autre tableau décrivant des saisies
183 * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
184 * @param string $tri Comparer selon quel tri ? 'nom' / 'identifiant'
185 * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
186 */
187function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true, $tri = 'nom') {
188        $trier = "saisies_lister_par_$tri";
189        $saisies_anciennes = $trier($saisies_anciennes, $avec_conteneur);
190        $saisies_nouvelles = $trier($saisies_nouvelles, $avec_conteneur);
191       
192        // Les saisies supprimées sont celles qui restent dans les anciennes quand on a enlevé toutes les nouvelles
193        $saisies_supprimees = array_diff_key($saisies_anciennes, $saisies_nouvelles);
194        // Les saisies ajoutées, c'est le contraire
195        $saisies_ajoutees = array_diff_key($saisies_nouvelles, $saisies_anciennes);
196        // Il reste alors les saisies qui ont le même nom
197        $saisies_restantes = array_intersect_key($saisies_anciennes, $saisies_nouvelles);
198        // Dans celles-ci, celles qui sont modifiées sont celles dont la valeurs est différentes
199        $saisies_modifiees = array_udiff(array_diff_key($saisies_nouvelles, $saisies_ajoutees), $saisies_restantes, 'saisies_comparer_rappel');
200        #$saisies_modifiees = array_udiff($saisies_nouvelles, $saisies_restantes, 'saisies_comparer_rappel');
201        // Et enfin les saisies qui ont le même nom et la même valeur
202        $saisies_identiques = array_diff_key($saisies_restantes, $saisies_modifiees);
203       
204        return array(
205                'supprimees' => $saisies_supprimees,
206                'ajoutees' => $saisies_ajoutees,
207                'modifiees' => $saisies_modifiees,
208                'identiques' => $saisies_identiques
209        );
210}
211
212/*
213 * Compare deux saisies et indique si elles sont égales ou pas
214 */
215function saisies_comparer_rappel($a, $b){
216        if ($a === $b) return 0;
217        else return 1;
218}
219
220/*
221 * Compare deux tableaux de saisies pour connaitre les différences
222 * en s'appuyant sur les identifiants de saisies
223 *
224 * @see saisies_comparer()
225 * @param array $saisies_anciennes Un tableau décrivant des saisies
226 * @param array $saisies_nouvelles Un autre tableau décrivant des saisies
227 * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
228 * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
229 */
230function saisies_comparer_par_identifiant($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true) {
231        return saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur, $tri = 'identifiant');
232}
233
234/*
235 * Liste toutes les saisies configurables (ayant une description)
236 *
237 * @return array Un tableau listant des saisies et leurs options
238 */
239function saisies_lister_disponibles(){
240        static $saisies = null;
241       
242        if (is_null($saisies)){
243                $saisies = array();
244                $liste = find_all_in_path('saisies/', '.+[.]yaml$');
245               
246                if (count($liste)){
247                        foreach ($liste as $fichier=>$chemin){
248                                $type_saisie = preg_replace(',[.]yaml$,i', '', $fichier);
249                                $dossier = str_replace($fichier, '', $chemin);
250                                // On ne garde que les saisies qui ont bien le HTML avec !
251                                if (file_exists("$dossier$type_saisie.html")
252                                        and (
253                                                is_array($saisie = saisies_charger_infos($type_saisie))
254                                        )
255                                ){
256                                        $saisies[$type_saisie] = $saisie;
257                                }
258                        }
259                }
260        }
261       
262        return $saisies;
263}
264
265/*
266 * Lister les saisies existantes ayant une définition SQL
267 *
268 * @return array Un tableau listant des saisies et leurs options
269 */
270function saisies_lister_disponibles_sql() {
271        $saisies = array();
272        $saisies_disponibles = saisies_lister_disponibles();
273        foreach ($saisies_disponibles as $type=>$saisie) {
274                if (isset($saisie['defaut']['options']['sql']) and $saisie['defaut']['options']['sql']) {
275                        $saisies[$type] = $saisie;
276                }
277        }
278        return $saisies;
279}
280
281/*
282 * Charger les informations contenues dans le YAML d'une saisie
283 *
284 * @param string $type_saisie Le type de la saisie
285 * @return array Un tableau contenant le YAML décodé
286 */
287function saisies_charger_infos($type_saisie){
288        if(defined('_DIR_PLUGIN_YAML')){
289                include_spip('inc/yaml');
290                $fichier = find_in_path("saisies/$type_saisie.yaml");
291                $saisie = yaml_decode_file($fichier);
292                if (is_array($saisie)){
293                        $saisie['titre'] = (isset($saisie['titre']) AND $saisie['titre'])
294                                ? _T_ou_typo($saisie['titre']) : $type_saisie;
295                        $saisie['description'] = (isset($saisie['description']) AND $saisie['description'])
296                                ? _T_ou_typo($saisie['description']) : '';
297                        $saisie['icone'] = (isset($saisie['icone']) AND $saisie['icone'])
298                                ? find_in_path($saisie['icone']) : '';
299                }
300        }else
301                $saisie = array();
302        return $saisie;
303}
304
305/*
306 * Quelles sont les saisies qui se débrouillent toutes seules, sans le _base commun
307 *
308 * @return array Retourne un tableau contenant les types de saisies qui ne doivent pas utiliser le _base.html commun
309 */
310function saisies_autonomes(){
311        $saisies_autonomes = pipeline(
312                'saisies_autonomes',
313                array(
314                        'fieldset',
315                        'hidden',
316                        'destinataires', 
317                        'explication'
318                )
319        );
320       
321        return $saisies_autonomes;
322}
323
324?>
Note: See TracBrowser for help on using the repository browser.