[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / saisies / inc / saisies.php
1 <?php
2
3 // Sécurité
4 if (!defined('_ECRIRE_INC_VERSION')) return;
5
6 /*
7 * Une librairie pour manipuler ou obtenir des infos sur un tableau de saisies
8 *
9 * saisies_lister_par_nom()
10 * saisies_lister_champs()
11 * saisies_lister_valeurs_defaut()
12 * saisies_charger_champs()
13 * saisies_chercher()
14 * saisies_supprimer()
15 * saisies_inserer()
16 * saisies_deplacer()
17 * saisies_modifier()
18 * saisies_verifier()
19 * saisies_comparer()
20 * saisies_generer_html()
21 * saisies_generer_vue()
22 * saisies_generer_nom()
23 * saisies_inserer_html()
24 * saisies_lister_disponibles()
25 * saisies_autonomes()
26 */
27
28 // Différentes méthodes pour trouver les saisies
29 include_spip('inc/saisies_lister');
30
31 // Différentes méthodes pour manipuler une liste de saisies
32 include_spip('inc/saisies_manipuler');
33
34 // Les outils pour afficher les saisies et leur vue
35 include_spip('inc/saisies_afficher');
36
37 /*
38 * Cherche la description des saisies d'un formulaire CVT dont on donne le nom
39 *
40 * @param string $form Nom du formulaire dont on cherche les saisies
41 * @return array Retourne les saisies du formulaire sinon false
42 */
43 function saisies_chercher_formulaire($form, $args){
44 if ($fonction_saisies = charger_fonction('saisies', 'formulaires/'.$form, true)
45 and $saisies = call_user_func_array($fonction_saisies, $args)
46 and is_array($saisies)
47 // On passe les saisies dans un pipeline normé comme pour CVT
48 and $saisies = pipeline(
49 'formulaire_saisies',
50 array(
51 'args' => array('form' => $form, 'args' => $args),
52 'data' => $saisies
53 )
54 )
55 // Si c'est toujours un tableau après le pipeline
56 and is_array($saisies)
57 ){
58 return $saisies;
59 }
60 else{
61 return false;
62 }
63 }
64
65 /*
66 * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin
67 *
68 * @param array $saisies Un tableau décrivant les saisies
69 * @param unknown_type $id_ou_nom_ou_chemin L'identifiant ou le nom de la saisie à chercher ou le chemin sous forme d'une liste de clés
70 * @param bool $retourner_chemin Indique si on retourne non pas la saisie mais son chemin
71 * @return array Retourne soit la saisie, soit son chemin, soit null
72 */
73 function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin=false){
74
75 if (is_array($saisies) and $id_ou_nom_ou_chemin){
76 if (is_string($id_ou_nom_ou_chemin)){
77 $nom = $id_ou_nom_ou_chemin;
78 // identifiant ? premier caractere @
79 $id = ($nom[0] == '@');
80
81 foreach($saisies as $cle => $saisie){
82 $chemin = array($cle);
83 if ($nom == ($id ? $saisie['identifiant'] : $saisie['options']['nom'])) {
84 return $retourner_chemin ? $chemin : $saisie;
85 } elseif ($saisie['saisies'] and is_array($saisie['saisies']) and ($retour = saisies_chercher($saisie['saisies'], $nom, $retourner_chemin))) {
86 return $retourner_chemin ? array_merge($chemin, array('saisies'), $retour) : $retour;
87 }
88
89 }
90 }
91 elseif (is_array($id_ou_nom_ou_chemin)){
92 $chemin = $id_ou_nom_ou_chemin;
93 $saisie = $saisies;
94 // On vérifie l'existence quand même
95 foreach ($chemin as $cle){
96 if (isset($saisie[$cle])) $saisie = $saisie[$cle];
97 else return null;
98 }
99 // Si c'est une vraie saisie
100 if ($saisie['saisie'] and $saisie['options']['nom'])
101 return $retourner_chemin ? $chemin : $saisie;
102 }
103 }
104
105 return null;
106 }
107
108 /*
109 * Génère un nom unique pour un champ d'un formulaire donné
110 *
111 * @param array $formulaire Le formulaire à analyser
112 * @param string $type_saisie Le type de champ dont on veut un identifiant
113 * @return string Un nom unique par rapport aux autres champs du formulaire
114 */
115 function saisies_generer_nom($formulaire, $type_saisie){
116 $champs = saisies_lister_champs($formulaire);
117
118 // Tant que type_numero existe, on incrémente le compteur
119 $compteur = 1;
120 while (array_search($type_saisie.'_'.$compteur, $champs) !== false)
121 $compteur++;
122
123 // On a alors un compteur unique pour ce formulaire
124 return $type_saisie.'_'.$compteur;
125 }
126
127 /*
128 * Crée un identifiant Unique
129 * pour toutes les saisies donnees qui n'en ont pas
130 *
131 * @param Array $saisies Tableau de saisies
132 * @param Bool $regenerer_id Régénère un nouvel identifiant pour toutes les saisies ?
133 * @return Array Tableau de saisies complété des identifiants
134 */
135 function saisies_identifier($saisies, $regenerer = false) {
136 if (!is_array($saisies)) {
137 return array();
138 }
139 foreach ($saisies as $k => $saisie) {
140 $saisies[$k] = saisie_identifier($saisie, $regenerer);
141 }
142 return $saisies;
143 }
144
145 /**
146 * Crée un identifiant Unique
147 * pour la saisie donnee si elle n'en a pas
148 * (et pour ses sous saisies éventuels)
149 *
150 * @param Array $saisie Tableau d'une saisie
151 * @param Bool $regenerer_id Régénère un nouvel identifiant pour la saisie ?
152 * @return Array Tableau de la saisie complété de l'identifiant
153 **/
154 function saisie_identifier($saisie, $regenerer = false) {
155 if (!isset($saisie['identifiant']) OR !$saisie['identifiant']) {
156 $saisie['identifiant'] = uniqid('@');
157 } elseif ($regenerer) {
158 $saisie['identifiant'] = uniqid('@');
159 }
160 if (isset($saisie['saisies']) AND is_array($saisie['saisies'])) {
161 $saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer);
162 }
163 return $saisie;
164 }
165
166 /*
167 * Vérifier tout un formulaire tel que décrit avec les Saisies
168 *
169 * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies
170 * @return array Retourne un tableau d'erreurs
171 */
172 function saisies_verifier($formulaire){
173 include_spip('inc/verifier');
174 $erreurs = array();
175 $verif_fonction = charger_fonction('verifier','inc',true);
176
177 $saisies = saisies_lister_par_nom($formulaire);
178 foreach ($saisies as $saisie){
179 $obligatoire = $saisie['options']['obligatoire'];
180 $champ = $saisie['options']['nom'];
181 $file = ($saisie['saisie'] == 'input' and $saisie['options']['type'] == 'file');
182 $verifier = $saisie['verifier'];
183
184 // Si le nom du champ est un tableau indexé, il faut parser !
185 if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)){
186 $valeur = _request($separe[1]);
187 preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
188 // On va chercher au fond du tableau
189 foreach($index[1] as $cle){
190 $valeur = $valeur[$cle];
191 }
192 }
193 // Sinon la valeur est juste celle du nom
194 else
195 $valeur = _request($champ);
196
197 // On regarde d'abord si le champ est obligatoire
198 if ($obligatoire
199 and $obligatoire != 'non'
200 and (
201 ($file and !$_FILES[$champ]['name'])
202 or (!$file and (
203 is_null($valeur)
204 or (is_string($valeur) and trim($valeur) == '')
205 or (is_array($valeur) and count($valeur) == 0)
206 ))
207 )
208 )
209 $erreurs[$champ] = _T('info_obligatoire');
210
211 // On continue seulement si ya pas d'erreur d'obligation et qu'il y a une demande de verif
212 if (!$erreurs[$champ] and is_array($verifier) and $verif_fonction){
213 // Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur
214 if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $verifier['options']))
215 $erreurs[$champ] = $erreur_eventuelle;
216 }
217 }
218
219 return $erreurs;
220 }
221
222 /*
223 * Transforme une chaine en tableau avec comme principe :
224 * - une ligne devient une case
225 * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur
226 *
227 * @param string $chaine Une chaine à transformer
228 * @return array Retourne un tableau PHP
229 */
230 function saisies_chaine2tableau($chaine, $separateur="\n"){
231 if ($chaine and is_string($chaine)){
232 $tableau = array();
233 // On découpe d'abord en lignes
234 $lignes = explode($separateur, $chaine);
235 foreach ($lignes as $i=>$ligne){
236 $ligne = trim(trim($ligne), '|');
237 // Si ce n'est pas une ligne sans rien
238 if ($ligne !== ''){
239 // Si on trouve un découpage dans la ligne on fait cle|valeur
240 if (strpos($ligne, '|') !== false){
241 list($cle,$valeur) = explode('|', $ligne, 2);
242 $tableau[$cle] = $valeur;
243 }
244 // Sinon on génère la clé
245 else{
246 $tableau[$i] = $ligne;
247 }
248 }
249 }
250 return $tableau;
251 }
252 // Si c'est déjà un tableau on le renvoie tel quel
253 elseif (is_array($chaine)){
254 return $chaine;
255 }
256 else{
257 return array();
258 }
259 }
260
261 /*
262 * Transforme un tableau en chaine de caractères avec comme principe :
263 * - une case de vient une ligne de la chaine
264 * - chaque ligne est générée avec la forme cle|valeur
265 */
266 function saisies_tableau2chaine($tableau){
267 if ($tableau and is_array($tableau)){
268 $chaine = '';
269
270 foreach($tableau as $cle=>$valeur){
271 $ligne = trim("$cle|$valeur");
272 $chaine .= "$ligne\n";
273 }
274 $chaine = trim($chaine);
275
276 return $chaine;
277 }
278 // Si c'est déjà une chaine on la renvoie telle quelle
279 elseif (is_string($tableau)){
280 return $tableau;
281 }
282 else{
283 return '';
284 }
285 }
286
287
288
289
290 /**
291 * Passe une valeur en tableau d'élements si ce n'en est pas une
292 *
293 * entrée :
294 * cle|valeur
295 * cle|valeur
296 *
297 * Sinon :
298 * valeur,valeur
299 *
300 * @param mixed $valeur
301 * @return array Tableau de valeurs
302 **/
303 function saisies_valeur2tableau($valeur, $sinon_separateur="") {
304 if (is_array($valeur)) {
305 return $valeur;
306 }
307
308 if (!strlen($valeur)) {
309 return array();
310 }
311
312 $t = saisies_chaine2tableau($valeur);
313 if (count($t) > 1) {
314 return $t;
315 }
316
317 // qu'une seule valeur, c'est qu'elle a peut etre un separateur a virgule
318 // et a donc une cle est 0 dans ce cas la d'ailleurs
319 if (isset($t[0])) {
320 $t = saisies_chaine2tableau($t[0], ',');
321 }
322
323 return $t;
324 }
325
326
327
328
329 /*
330 * Génère une page d'aide listant toutes les saisies et leurs options
331 */
332 function saisies_generer_aide(){
333 // On a déjà la liste par saisie
334 $saisies = saisies_lister_disponibles();
335
336 // On construit une liste par options
337 $options = array();
338 foreach ($saisies as $type_saisie=>$saisie){
339 $options_saisie = saisies_lister_par_nom($saisie['options'], false);
340 foreach ($options_saisie as $nom=>$option){
341 // Si l'option n'existe pas encore
342 if (!isset($options[$nom])){
343 $options[$nom] = _T_ou_typo($option['options']);
344 }
345 // On ajoute toujours par qui c'est utilisé
346 $options[$nom]['utilisee_par'][] = $type_saisie;
347 }
348 ksort($options_saisie);
349 $saisies[$type_saisie]['options'] = $options_saisie;
350 }
351 ksort($options);
352
353 return recuperer_fond(
354 'inclure/saisies_aide',
355 array(
356 'saisies' => $saisies,
357 'options' => $options
358 )
359 );
360 }
361
362 /*
363 * Le tableau de saisies a-t-il une option afficher_si ?
364 *
365 * @param array $saisies Un tableau de saisies
366 * @return boolean
367 */
368
369 function saisies_afficher_si($saisies) {
370 $saisies = saisies_lister_par_nom($saisies,true);
371 // Dès qu'il y a au moins une option afficher_si, on l'active
372 foreach ($saisies as $saisie) {
373 if (isset($saisie['options']['afficher_si']))
374 return true;
375 }
376 return false;
377 }
378
379 ?>