[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / saisies / inc / saisies_lister.php
diff --git a/www/plugins/auto/saisies/inc/saisies_lister.php b/www/plugins/auto/saisies/inc/saisies_lister.php
new file mode 100644 (file)
index 0000000..71d0238
--- /dev/null
@@ -0,0 +1,316 @@
+<?php
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+/*
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par identifiant unique.
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
+       $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']) or $avec_conteneur)){
+                                       $saisies[$ligne['identifiant']] = $ligne;
+                               }
+                               if (is_array($ligne['saisies'])){
+                                       $saisies = array_merge($saisies, saisies_lister_par_identifiant($ligne['saisies']));
+                               }
+                       }
+               }
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Prend la description complète du contenu d'un formulaire et retourne
+ * les saisies "à plat" classées par nom.
+ *
+ * @param array $contenu Le contenu d'un formulaire
+ * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
+ * @return array Un tableau avec uniquement les saisies
+ */
+function saisies_lister_par_nom($contenu, $avec_conteneur=true){
+       $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']) or $avec_conteneur)){
+                                       $saisies[$ligne['options']['nom']] = $ligne;
+                               }
+                               if (is_array($ligne['saisies'])){
+                                       $saisies = array_merge($saisies, saisies_lister_par_nom($ligne['saisies']));
+                               }
+                       }
+               }
+       }
+       
+       return $saisies;
+}
+
+/*
+ * Liste les saisies ayant une option X
+ * # saisies_lister_avec_option('sql', $saisies);
+ *  
+ *
+ * @param String $option Nom de l'option cherchée
+ * @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 X définie
+ */
+function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
+       $saisies_option = array();
+       // tri par nom si ce n'est pas le cas
+       if (is_int(array_shift(array_keys($saisies)))) {
+               $trier = 'saisies_lister_par_' . $tri;
+               $saisies = $trier($saisies);
+       }
+       foreach ($saisies as $nom_ou_id => $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;
+}
+
+?>