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