X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fplugins%2Fauto%2Fsaisies%2Finc%2Fsaisies_lister.php;fp=www%2Fplugins%2Fauto%2Fsaisies%2Finc%2Fsaisies_lister.php;h=71d0238b3fe6b5f646dccd3407ad1cd03e19360b;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/plugins/auto/saisies/inc/saisies_lister.php b/www/plugins/auto/saisies/inc/saisies_lister.php new file mode 100644 index 0000000..71d0238 --- /dev/null +++ b/www/plugins/auto/saisies/inc/saisies_lister.php @@ -0,0 +1,316 @@ + $saisie) { + if (isset($saisie['options'][$option]) and $saisie['options'][$option]) { + $saisies_option[$nom_ou_id] = $saisie; + } + } + + return $saisies_option; +} + +/* + * Liste les saisies ayant une definition SQL + * + * @param Array $saisies liste de saisies + * @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant') + * @return liste de ces saisies triees par nom ayant une option sql définie + */ +function saisies_lister_avec_sql($saisies, $tri = 'nom') { + return saisies_lister_avec_option('sql', $saisies, $tri); +} + +/* + * Prend la description complète du contenu d'un formulaire et retourne + * les saisies "à plat" classées par type de saisie. + * $saisie['input']['input_1'] = $saisie + * + * @param array $contenu Le contenu d'un formulaire + * @return array Un tableau avec uniquement les saisies + */ +function saisies_lister_par_type($contenu) { + $saisies = array(); + + if (is_array($contenu)){ + foreach ($contenu as $ligne){ + if (is_array($ligne)){ + if (array_key_exists('saisie', $ligne) and (!is_array($ligne['saisies']))){ + $saisies[ $ligne['saisie'] ][ $ligne['options']['nom'] ] = $ligne; + } + if (is_array($ligne['saisies'])){ + $saisies = array_merge($saisies, saisies_lister_par_type($ligne['saisies'])); + } + } + } + } + + return $saisies; +} + +/* + * Prend la description complète du contenu d'un formulaire et retourne + * une liste des noms des champs du formulaire. + * + * @param array $contenu Le contenu d'un formulaire + * @return array Un tableau listant les noms des champs + */ +function saisies_lister_champs($contenu, $avec_conteneur=true){ + $saisies = saisies_lister_par_nom($contenu, $avec_conteneur); + return array_keys($saisies); +} + +/* + * A utiliser dans une fonction charger d'un formulaire CVT, + * cette fonction renvoie le tableau de contexte correspondant + * de la forme $contexte['nom_champ'] = '' + * + * @param array $contenu Le contenu d'un formulaire (un tableau de saisies) + * @return array Un tableau de contexte + */ +function saisies_charger_champs($contenu) { + // array_fill_keys est disponible uniquement avec PHP >= 5.2.0 + // return array_fill_keys(saisies_lister_champs($contenu, false), ''); + $champs = array(); + foreach (saisies_lister_champs($contenu, false) as $champ) + $champs[$champ] = ''; + return $champs; +} + +/* + * Prend la description complète du contenu d'un formulaire et retourne + * une liste des valeurs par défaut des champs du formulaire. + * + * @param array $contenu Le contenu d'un formulaire + * @return array Un tableau renvoyant la valeur par défaut de chaque champs + */ +function saisies_lister_valeurs_defaut($contenu){ + $contenu = saisies_lister_par_nom($contenu, false); + $defauts = array(); + foreach ($contenu as $nom => $saisie){ + // Si le nom du champ est un tableau indexé, il faut parser ! + if (preg_match('/([\w]+)((\[[\w]+\])+)/', $nom, $separe)){ + $nom = $separe[1]; + // Dans ce cas on ne récupère que le nom, la valeur par défaut du tableau devra être renseigné autre part + $defauts[$nom] = array(); + } + else{ + $defauts[$nom] = isset($saisie['options']['defaut']) ? $saisie['options']['defaut'] : ''; + } + } + return $defauts; +} + +/* + * Compare deux tableaux de saisies pour connaitre les différences + * @param array $saisies_anciennes Un tableau décrivant des saisies + * @param array $saisies_nouvelles Un autre tableau décrivant des saisies + * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets + * @param string $tri Comparer selon quel tri ? 'nom' / 'identifiant' + * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées + */ +function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true, $tri = 'nom') { + $trier = "saisies_lister_par_$tri"; + $saisies_anciennes = $trier($saisies_anciennes, $avec_conteneur); + $saisies_nouvelles = $trier($saisies_nouvelles, $avec_conteneur); + + // Les saisies supprimées sont celles qui restent dans les anciennes quand on a enlevé toutes les nouvelles + $saisies_supprimees = array_diff_key($saisies_anciennes, $saisies_nouvelles); + // Les saisies ajoutées, c'est le contraire + $saisies_ajoutees = array_diff_key($saisies_nouvelles, $saisies_anciennes); + // Il reste alors les saisies qui ont le même nom + $saisies_restantes = array_intersect_key($saisies_anciennes, $saisies_nouvelles); + // Dans celles-ci, celles qui sont modifiées sont celles dont la valeurs est différentes + $saisies_modifiees = array_udiff(array_diff_key($saisies_nouvelles, $saisies_ajoutees), $saisies_restantes, 'saisies_comparer_rappel'); + #$saisies_modifiees = array_udiff($saisies_nouvelles, $saisies_restantes, 'saisies_comparer_rappel'); + // Et enfin les saisies qui ont le même nom et la même valeur + $saisies_identiques = array_diff_key($saisies_restantes, $saisies_modifiees); + + return array( + 'supprimees' => $saisies_supprimees, + 'ajoutees' => $saisies_ajoutees, + 'modifiees' => $saisies_modifiees, + 'identiques' => $saisies_identiques + ); +} + +/* + * Compare deux saisies et indique si elles sont égales ou pas + */ +function saisies_comparer_rappel($a, $b){ + if ($a === $b) return 0; + else return 1; +} + +/* + * Compare deux tableaux de saisies pour connaitre les différences + * en s'appuyant sur les identifiants de saisies + * + * @see saisies_comparer() + * @param array $saisies_anciennes Un tableau décrivant des saisies + * @param array $saisies_nouvelles Un autre tableau décrivant des saisies + * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets + * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées + */ +function saisies_comparer_par_identifiant($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true) { + return saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur, $tri = 'identifiant'); +} + +/* + * Liste toutes les saisies configurables (ayant une description) + * + * @return array Un tableau listant des saisies et leurs options + */ +function saisies_lister_disponibles(){ + static $saisies = null; + + if (is_null($saisies)){ + $saisies = array(); + $liste = find_all_in_path('saisies/', '.+[.]yaml$'); + + if (count($liste)){ + foreach ($liste as $fichier=>$chemin){ + $type_saisie = preg_replace(',[.]yaml$,i', '', $fichier); + $dossier = str_replace($fichier, '', $chemin); + // On ne garde que les saisies qui ont bien le HTML avec ! + if (file_exists("$dossier$type_saisie.html") + and ( + is_array($saisie = saisies_charger_infos($type_saisie)) + ) + ){ + $saisies[$type_saisie] = $saisie; + } + } + } + } + + return $saisies; +} + +/* + * Lister les saisies existantes ayant une définition SQL + * + * @return array Un tableau listant des saisies et leurs options + */ +function saisies_lister_disponibles_sql() { + $saisies = array(); + $saisies_disponibles = saisies_lister_disponibles(); + foreach ($saisies_disponibles as $type=>$saisie) { + if (isset($saisie['defaut']['options']['sql']) and $saisie['defaut']['options']['sql']) { + $saisies[$type] = $saisie; + } + } + return $saisies; +} + +/* + * Charger les informations contenues dans le YAML d'une saisie + * + * @param string $type_saisie Le type de la saisie + * @return array Un tableau contenant le YAML décodé + */ +function saisies_charger_infos($type_saisie){ + include_spip('inc/yaml'); + $fichier = find_in_path("saisies/$type_saisie.yaml"); + $saisie = yaml_decode_file($fichier); + if (is_array($saisie)){ + $saisie['titre'] = $saisie['titre'] ? _T_ou_typo($saisie['titre']) : $type_saisie; + $saisie['description'] = $saisie['description'] ? _T_ou_typo($saisie['description']) : ''; + $saisie['icone'] = $saisie['icone'] ? find_in_path($saisie['icone']) : ''; + } + return $saisie; +} + +/* + * Quelles sont les saisies qui se débrouillent toutes seules, sans le _base commun + * + * @return array Retourne un tableau contenant les types de saisies qui ne doivent pas utiliser le _base.html commun + */ +function saisies_autonomes(){ + $saisies_autonomes = pipeline( + 'saisies_autonomes', + array( + 'fieldset', + 'hidden', + 'destinataires', + 'explication' + ) + ); + + return $saisies_autonomes; +} + +?>