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

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