4 if (!defined('_ECRIRE_INC_VERSION')) return;
7 * Une librairie pour manipuler ou obtenir des infos sur un tableau de saisies
9 * saisies_lister_par_nom()
10 * saisies_lister_champs()
11 * saisies_lister_valeurs_defaut()
12 * saisies_charger_champs()
20 * saisies_generer_html()
21 * saisies_generer_vue()
22 * saisies_generer_nom()
23 * saisies_inserer_html()
24 * saisies_lister_disponibles()
28 // Différentes méthodes pour trouver les saisies
29 include_spip('inc/saisies_lister');
31 // Différentes méthodes pour manipuler une liste de saisies
32 include_spip('inc/saisies_manipuler');
34 // Les outils pour afficher les saisies et leur vue
35 include_spip('inc/saisies_afficher');
38 * Cherche la description des saisies d'un formulaire CVT dont on donne le nom
40 * @param string $form Nom du formulaire dont on cherche les saisies
41 * @return array Retourne les saisies du formulaire sinon false
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(
51 'args' => array('form' => $form, 'args' => $args),
55 // Si c'est toujours un tableau après le pipeline
56 and is_array($saisies)
66 * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin
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
73 function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin=false){
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] == '@');
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;
91 elseif (is_array($id_ou_nom_ou_chemin)){
92 $chemin = $id_ou_nom_ou_chemin;
94 // On vérifie l'existence quand même
95 foreach ($chemin as $cle){
96 if (isset($saisie[$cle])) $saisie = $saisie[$cle];
99 // Si c'est une vraie saisie
100 if ($saisie['saisie'] and $saisie['options']['nom'])
101 return $retourner_chemin ?
$chemin : $saisie;
109 * Génère un nom unique pour un champ d'un formulaire donné
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
115 function saisies_generer_nom($formulaire, $type_saisie){
116 $champs = saisies_lister_champs($formulaire);
118 // Tant que type_numero existe, on incrémente le compteur
120 while (array_search($type_saisie.'_'.$compteur, $champs) !== false)
123 // On a alors un compteur unique pour ce formulaire
124 return $type_saisie.'_'.$compteur;
128 * Crée un identifiant Unique
129 * pour toutes les saisies donnees qui n'en ont pas
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
135 function saisies_identifier($saisies, $regenerer = false) {
136 if (!is_array($saisies)) {
139 foreach ($saisies as $k => $saisie) {
140 $saisies[$k] = saisie_identifier($saisie, $regenerer);
146 * Crée un identifiant Unique
147 * pour la saisie donnee si elle n'en a pas
148 * (et pour ses sous saisies éventuels)
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
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('@');
160 if (isset($saisie['saisies']) AND is_array($saisie['saisies'])) {
161 $saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer);
167 * Vérifier tout un formulaire tel que décrit avec les Saisies
169 * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies
170 * @return array Retourne un tableau d'erreurs
172 function saisies_verifier($formulaire){
173 include_spip('inc/verifier');
175 $verif_fonction = charger_fonction('verifier','inc',true);
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'];
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];
193 // Sinon la valeur est juste celle du nom
195 $valeur = _request($champ);
197 // On regarde d'abord si le champ est obligatoire
199 and $obligatoire != 'non'
201 ($file and !$_FILES[$champ]['name'])
204 or (is_string($valeur) and trim($valeur) == '')
205 or (is_array($valeur) and count($valeur) == 0)
209 $erreurs[$champ] = _T('info_obligatoire');
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;
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
227 * @param string $chaine Une chaine à transformer
228 * @return array Retourne un tableau PHP
230 function saisies_chaine2tableau($chaine, $separateur="\n"){
231 if ($chaine and is_string($chaine)){
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
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;
244 // Sinon on génère la clé
246 $tableau[$i] = $ligne;
252 // Si c'est déjà un tableau on le renvoie tel quel
253 elseif (is_array($chaine)){
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
266 function saisies_tableau2chaine($tableau){
267 if ($tableau and is_array($tableau)){
270 foreach($tableau as $cle=>$valeur){
271 $ligne = trim("$cle|$valeur");
272 $chaine .= "$ligne\n";
274 $chaine = trim($chaine);
278 // Si c'est déjà une chaine on la renvoie telle quelle
279 elseif (is_string($tableau)){
291 * Passe une valeur en tableau d'élements si ce n'en est pas une
300 * @param mixed $valeur
301 * @return array Tableau de valeurs
303 function saisies_valeur2tableau($valeur, $sinon_separateur="") {
304 if (is_array($valeur)) {
308 if (!strlen($valeur)) {
312 $t = saisies_chaine2tableau($valeur);
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
320 $t = saisies_chaine2tableau($t[0], ',');
330 * Génère une page d'aide listant toutes les saisies et leurs options
332 function saisies_generer_aide(){
333 // On a déjà la liste par saisie
334 $saisies = saisies_lister_disponibles();
336 // On construit une liste par options
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']);
345 // On ajoute toujours par qui c'est utilisé
346 $options[$nom]['utilisee_par'][] = $type_saisie;
348 ksort($options_saisie);
349 $saisies[$type_saisie]['options'] = $options_saisie;
353 return recuperer_fond(
354 'inclure/saisies_aide',
356 'saisies' => $saisies,
357 'options' => $options
363 * Le tableau de saisies a-t-il une option afficher_si ?
365 * @param array $saisies Un tableau de saisies
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']))