array('form' => $form, 'args' => $args), 'data' => $saisies ) ) // Si c'est toujours un tableau après le pipeline and is_array($saisies) ){ return $saisies; } else{ return false; } } /* * Cherche une saisie par son id, son nom ou son chemin et renvoie soit la saisie, soit son chemin * * @param array $saisies Un tableau décrivant les saisies * @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 * @param bool $retourner_chemin Indique si on retourne non pas la saisie mais son chemin * @return array Retourne soit la saisie, soit son chemin, soit null */ function saisies_chercher($saisies, $id_ou_nom_ou_chemin, $retourner_chemin=false){ if (is_array($saisies) and $id_ou_nom_ou_chemin){ if (is_string($id_ou_nom_ou_chemin)){ $nom = $id_ou_nom_ou_chemin; // identifiant ? premier caractere @ $id = ($nom[0] == '@'); foreach($saisies as $cle => $saisie){ $chemin = array($cle); // notre saisie est la bonne ? if ($nom == ($id ? $saisie['identifiant'] : $saisie['options']['nom'])) { return $retourner_chemin ? $chemin : $saisie; // sinon a telle des enfants ? et si c'est le cas, cherchons dedans } elseif (isset($saisie['saisies']) and is_array($saisie['saisies']) and $saisie['saisies'] and ($retour = saisies_chercher($saisie['saisies'], $nom, $retourner_chemin))) { return $retourner_chemin ? array_merge($chemin, array('saisies'), $retour) : $retour; } } } elseif (is_array($id_ou_nom_ou_chemin)){ $chemin = $id_ou_nom_ou_chemin; $saisie = $saisies; // On vérifie l'existence quand même foreach ($chemin as $cle){ if (isset($saisie[$cle])) $saisie = $saisie[$cle]; else return null; } // Si c'est une vraie saisie if ($saisie['saisie'] and $saisie['options']['nom']) return $retourner_chemin ? $chemin : $saisie; } } return null; } /** * Génère un nom unique pour un champ d'un formulaire donné * * @param array $formulaire * Le formulaire à analyser * @param string $type_saisie * Le type de champ dont on veut un identifiant * @return string * Un nom unique par rapport aux autres champs du formulaire */ function saisies_generer_nom($formulaire, $type_saisie){ $champs = saisies_lister_champs($formulaire); // Tant que type_numero existe, on incrémente le compteur $compteur = 1; while (array_search($type_saisie.'_'.$compteur, $champs) !== false) $compteur++; // On a alors un compteur unique pour ce formulaire return $type_saisie.'_'.$compteur; } /* * Crée un identifiant Unique * pour toutes les saisies donnees qui n'en ont pas * * @param Array $saisies Tableau de saisies * @param Bool $regenerer_id Régénère un nouvel identifiant pour toutes les saisies ? * @return Array Tableau de saisies complété des identifiants */ function saisies_identifier($saisies, $regenerer = false) { if (!is_array($saisies)) { return array(); } foreach ($saisies as $k => $saisie) { $saisies[$k] = saisie_identifier($saisie, $regenerer); } return $saisies; } /** * Crée un identifiant Unique * pour la saisie donnee si elle n'en a pas * (et pour ses sous saisies éventuels) * * @param Array $saisie Tableau d'une saisie * @param Bool $regenerer_id Régénère un nouvel identifiant pour la saisie ? * @return Array Tableau de la saisie complété de l'identifiant **/ function saisie_identifier($saisie, $regenerer = false) { if (!isset($saisie['identifiant']) OR !$saisie['identifiant']) { $saisie['identifiant'] = uniqid('@'); } elseif ($regenerer) { $saisie['identifiant'] = uniqid('@'); } if (isset($saisie['saisies']) AND is_array($saisie['saisies'])) { $saisie['saisies'] = saisies_identifier($saisie['saisies'], $regenerer); } return $saisie; } /* * Vérifier tout un formulaire tel que décrit avec les Saisies * * @param array $formulaire Le contenu d'un formulaire décrit dans un tableau de Saisies * @param bool $saisies_masquees_nulles Si TRUE, les saisies masquées selon afficher_si ne seront pas verifiées, leur valeur étant forcée a NULL. Cette valeur NULL est transmise à traiter (via set_request). * @return array Retourne un tableau d'erreurs */ function saisies_verifier($formulaire, $saisies_masquees_nulles=true){ include_spip('inc/verifier'); $erreurs = array(); $verif_fonction = charger_fonction('verifier','inc',true); if ($saisies_masquees_nulles) $formulaire = saisies_verifier_afficher_si($formulaire); $saisies = saisies_lister_par_nom($formulaire); foreach ($saisies as $saisie){ $obligatoire = isset($saisie['options']['obligatoire']) ? $saisie['options']['obligatoire'] : ''; $champ = $saisie['options']['nom']; $file = ($saisie['saisie'] == 'input' and isset($saisie['options']['type']) and $saisie['options']['type'] == 'file'); $verifier = isset($saisie['verifier']) ? $saisie['verifier'] : false; // Si le nom du champ est un tableau indexé, il faut parser ! if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)){ $valeur = _request($separe[1]); preg_match_all('/\[([\w]+)\]/', $separe[2], $index); // On va chercher au fond du tableau foreach($index[1] as $cle){ $valeur = isset($valeur[$cle]) ? $valeur[$cle] : null; } } // Sinon la valeur est juste celle du nom else $valeur = _request($champ); // On regarde d'abord si le champ est obligatoire if ($obligatoire and $obligatoire != 'non' and ( ($file and !$_FILES[$champ]['name']) or (!$file and ( is_null($valeur) or (is_string($valeur) and trim($valeur) == '') or (is_array($valeur) and count($valeur) == 0) )) ) ) { $erreurs[$champ] = (isset($saisie['options']['erreur_obligatoire']) and $saisie['options']['erreur_obligatoire']) ? $saisie['options']['erreur_obligatoire'] : _T('info_obligatoire'); } // On continue seulement si ya pas d'erreur d'obligation et qu'il y a une demande de verif if ((!isset($erreurs[$champ]) or !$erreurs[$champ]) and is_array($verifier) and $verif_fonction){ $normaliser = null; // Si le champ n'est pas valide par rapport au test demandé, on ajoute l'erreur $options = isset($verifier['options']) ? $verifier['options'] : array(); if ($erreur_eventuelle = $verif_fonction($valeur, $verifier['type'], $options, $normaliser)) { $erreurs[$champ] = $erreur_eventuelle; // S'il n'y a pas d'erreur et que la variable de normalisation a été remplie, on l'injecte dans le POST } elseif (!is_null($normaliser)) { set_request($champ, $normaliser); } } } return $erreurs; } /* * Applatie une description tabulaire * @param string $tab, le tableau à aplatir * @return $nouveau_tab */ function saisies_aplatir_tableau($tab){ $nouveau_tab = array(); foreach($tab as $entree=>$contenu){ if (is_array($contenu)){ foreach ($contenu as $cle => $valeur){ $nouveau_tab[$cle] = $valeur; } } else{ $nouveau_tab[$entree] = $contenu; } } return $nouveau_tab; } /* * Applatie une description chaînée, en supprimant les sous-groupes. * @param string $chaine, la chaîne à aplatir * @return $chaine */ function saisies_aplatir_chaine($chaine){ return trim(preg_replace("#(?:^|\n)(\*(?:.*)|/\*)\n#i","\n",$chaine)); } /* * Transforme une chaine en tableau avec comme principe : * - une ligne devient une case * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur * - si la ligne commence par * alors on commence un sous-tableau * - si la ligne est égale à /*, alors on fini le sous-tableau * @param string $chaine Une chaine à transformer * @return array Retourne un tableau PHP */ function saisies_chaine2tableau($chaine, $separateur="\n"){ if ($chaine and is_string($chaine)){ $tableau = array(); $soustab = False; // On découpe d'abord en lignes $lignes = explode($separateur, $chaine); foreach ($lignes as $i=>$ligne){ $ligne = trim(trim($ligne), '|'); // Si ce n'est pas une ligne sans rien if ($ligne !== ''){ // si ca commence par * c'est qu'on va faire un sous tableau if (strpos($ligne,"*")===0){ $soustab=True; $soustab_cle = _T_ou_typo(substr($ligne,1), 'multi'); if (!isset($tableau[$soustab_cle])){ $tableau[$soustab_cle] = array(); } } elseif ($ligne=="/*"){//si on finit sous tableau $soustab=False; } else{//sinon c'est une entrée normale // Si on trouve un découpage dans la ligne on fait cle|valeur if (strpos($ligne, '|') !== false){ list($cle,$valeur) = explode('|', $ligne, 2); // permettre les traductions de valeurs au passage if ($soustab == True){ $tableau[$soustab_cle][$cle] = _T_ou_typo($valeur, 'multi'); } else{ $tableau[$cle] = _T_ou_typo($valeur, 'multi'); } } // Sinon on génère la clé else{ if ($soustab == True){ $tableau[$soustab_cle][$i] = _T_ou_typo($ligne,'multi'); } else{ $tableau[$i] = _T_ou_typo($ligne,'multi'); } } } } } return $tableau; } // Si c'est déjà un tableau on lui applique _T_ou_typo (qui fonctionne de manière récursive avant de le renvoyer elseif (is_array($chaine)){ return _T_ou_typo($chaine, 'multi'); } else{ return array(); } } /* * Transforme un tableau en chaine de caractères avec comme principe : * - une case de vient une ligne de la chaine * - chaque ligne est générée avec la forme cle|valeur * - si une entrée du tableau est elle même un tableau, on met une ligne de la forme *clef * - pour marquer que l'on quitte un sous-tableau, on met une ligne commencant par /*, sauf si on bascule dans un autre sous-tableau. */ function saisies_tableau2chaine($tableau){ if ($tableau and is_array($tableau)){ $chaine = ''; $avant_est_tableau = False; foreach($tableau as $cle=>$valeur){ if (is_array($valeur)){ $avant_est_tableau = True; $ligne=trim("*$cle"); $chaine .= "$ligne\n"; $chaine .= saisies_tableau2chaine($valeur)."\n"; } else{ if ($avant_est_tableau == True){ $avant_est_tableau = False; $chaine.="/*\n"; } $ligne = trim("$cle|$valeur"); $chaine .= "$ligne\n"; } } $chaine = trim($chaine); return $chaine; } // Si c'est déjà une chaine on la renvoie telle quelle elseif (is_string($tableau)){ return $tableau; } else{ return ''; } } /** * Passe une valeur en tableau d'élements si ce n'en est pas une * * entrée : * cle|valeur * cle|valeur * * Sinon : * valeur,valeur * * @param mixed $valeur * @return array Tableau de valeurs **/ function saisies_valeur2tableau($valeur, $sinon_separateur="") { if (is_array($valeur)) { return $valeur; } if (!strlen($valeur)) { return array(); } $t = saisies_chaine2tableau($valeur); if (count($t) > 1) { return $t; } // qu'une seule valeur, c'est qu'elle a peut etre un separateur a virgule // et a donc une cle est 0 dans ce cas la d'ailleurs if (isset($t[0])) { $t = saisies_chaine2tableau($t[0], ','); } return $t; } /* * Génère une page d'aide listant toutes les saisies et leurs options */ function saisies_generer_aide(){ // On a déjà la liste par saisie $saisies = saisies_lister_disponibles(); // On construit une liste par options $options = array(); foreach ($saisies as $type_saisie=>$saisie){ $options_saisie = saisies_lister_par_nom($saisie['options'], false); foreach ($options_saisie as $nom=>$option){ // Si l'option n'existe pas encore if (!isset($options[$nom])){ $options[$nom] = _T_ou_typo($option['options']); } // On ajoute toujours par qui c'est utilisé $options[$nom]['utilisee_par'][] = $type_saisie; } ksort($options_saisie); $saisies[$type_saisie]['options'] = $options_saisie; } ksort($options); return recuperer_fond( 'inclure/saisies_aide', array( 'saisies' => $saisies, 'options' => $options ) ); } /* * Le tableau de saisies a-t-il une option afficher_si ? * * @param array $saisies Un tableau de saisies * @return boolean */ function saisies_afficher_si($saisies) { $saisies = saisies_lister_par_nom($saisies,true); // Dès qu'il y a au moins une option afficher_si, on l'active foreach ($saisies as $saisie) { if (isset($saisie['options']['afficher_si'])) return true; } return false; } /* * Le tableau de saisies a-t-il une option afficher_si_remplissage ? * * @param array $saisies Un tableau de saisies * @return boolean */ function saisies_afficher_si_remplissage($saisies) { $saisies = saisies_lister_par_nom($saisies,true); // Dès qu'il y a au moins une option afficher_si_remplissage, on l'active foreach ($saisies as $saisie) { if (isset($saisie['options']['afficher_si_remplissage'])) return true; } return false; } ?>