Changeset 111474 in spip-zone for _plugins_/formidable


Ignore:
Timestamp:
Sep 4, 2018, 6:11:03 PM (3 weeks ago)
Author:
root
Message:

On découpe la fonction d’export de réponses de fomulaire Formidable pour s’y retrouver un peu sur son usage.
Première partie d’une petite évolution pour pouvoir exporter un (gros) formulaire via SPIP-Cli à terme.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/formidable/trunk/formulaires/exporter_formulaire_reponses.php

    r110996 r111474  
    5858 */
    5959function exporter_formulaires_reponses($id_formulaire, $delim = ',', $statut_reponses = 'publie', $date_debut = '', $date_fin = '') {
    60         include_spip('inc/puce_statut');
     60        $exporter_csv = charger_fonction('exporter_csv', 'inc/', true);
     61        if (!$exporter_csv) {
     62                return false;
     63        }
     64
     65        list($formulaire, $reponses) = obtenir_formulaire_reponses($id_formulaire, $statut_reponses, $date_debut, $date_fin);
     66        if (!$formulaire or !$reponses) {
     67                return false;
     68        }
     69
     70        list($reponses_completes, $saisies_fichiers) = preparer_formulaire_reponses($formulaire, $reponses, $statut_reponses);
     71        if (!$reponses_completes) {
     72                return false;
     73        }
     74
     75        // si pas de saisie fichiers, on envoie directement le csv
     76        if (!count($saisies_fichiers)) {
     77                $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim);
     78                exit;
     79        } else {
     80                $fichier_csv = $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim, null, false);
     81                $fichier_zip = sous_repertoire(_DIR_CACHE, 'export') . 'reponses-formulaire-' . $formulaire['identifiant'] . '.zip';
     82                include_spip('inc/formidable_fichiers');
     83                $fichier_zip = formidable_zipper_reponses_formulaire($formulaire['id_formulaire'], $fichier_zip, $fichier_csv, $saisies_fichiers);
     84                // si erreur lors du zippage
     85                if (!$fichier_zip) {
     86                        return false;
     87                } else {
     88                        formidable_retourner_fichier($fichier_zip, basename($fichier_zip));
     89                }
     90        }
     91}
     92
     93
     94function obtenir_formulaire_reponses($id_formulaire, $statut_reponses = 'publie', $date_debut = '', $date_fin = '') {
    6195        // on ne fait des choses seulements si le formulaire existe et qu'il a des enregistrements
    62         if ($id_formulaire > 0
     96        if (
     97                $id_formulaire > 0
    6398                and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . $id_formulaire)
    6499                and $reponses = sql_allfetsel(
     
    66101                        'spip_formulaires_reponses',
    67102                        'id_formulaire = ' . intval($id_formulaire) . ($statut_reponses == 'publie' ? ' and statut = "publie"' : '')
    68                         . (strlen($date_debut) > 0 ? ' and date >= "'. $date_debut. '"' : '')
    69                         . (strlen($date_fin) > 0 ? ' and date <= "'.$date_fin.'"' : '')
     103                        . (strlen($date_debut) > 0 ? ' and date >= "' . $date_debut . '"' : '')
     104                        . (strlen($date_fin) > 0 ? ' and date <= "' . $date_fin . '"' : '')
    70105                )) {
    71 
    72                 include_spip('inc/saisies');
    73                 include_spip('facteur_fonctions');
    74                 include_spip('inc/filtres');
    75                 $reponses_completes = array();
    76 
    77                 // La première ligne des titres
    78                 $titres = array(
    79                         _T('formidable:id_formulaires_reponse'),
    80                         _T('public:date'),
    81                         _T('formidable:reponses_auteur'),
    82                         _T('formidable:reponses_ip'),
     106                return array($formulaire, $reponses);
     107        }
     108        return array(null, null);
     109}
     110
     111
     112function preparer_formulaire_reponses($formulaire, $reponses, $statut_reponses) {
     113        include_spip('inc/puce_statut');
     114        include_spip('inc/saisies');
     115        include_spip('facteur_fonctions');
     116        include_spip('inc/filtres');
     117
     118        $id_formulaire = $formulaire['id_formulaire'];
     119        $reponses_completes = array();
     120        $saisies_fichiers = array();
     121
     122        // La première ligne des titres
     123        $titres = array(
     124                _T('formidable:id_formulaires_reponse'),
     125                _T('public:date'),
     126                _T('formidable:reponses_auteur'),
     127                _T('formidable:reponses_ip'),
     128        );
     129
     130        if ($statut_reponses != 'publie') {
     131                $titres[] = _T('formidable:reponse_statut');
     132        }
     133
     134        $saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false);
     135        foreach ($saisies as $nom => $saisie) {
     136                if ($saisie['saisie'] != 'explication') {    // on exporte tous les champs sauf explications
     137                        $options = $saisie['options'];
     138                        $titres[] = sinon(
     139                                isset($options['label_case']) ? $options['label_case'] : '',
     140                                sinon(
     141                                        isset($options['label']) ? $options['label'] : '',
     142                                        $nom
     143                                )
     144                        );
     145                }
     146        }
     147
     148        // On passe la ligne des titres de colonnes dans un pipeline
     149        $titres = pipeline(
     150                'formidable_exporter_formulaire_reponses_titres',
     151                array(
     152                        'args' => array('id_formulaire' => $id_formulaire, 'formulaire' => $formulaire),
     153                        'data' => $titres,
     154                )
     155        );
     156
     157        $reponses_completes[] = $titres;
     158
     159        // sélectionner tous les auteurs d’un coup. Évite N requetes SQL…
     160        $ids_auteurs = array_filter(array_map('intval', array_column($reponses, 'id_auteur')));
     161        $auteurs = sql_allfetsel('id_auteur, nom', 'spip_auteurs', sql_in('id_auteur', $ids_auteurs));
     162        $auteurs = array_column($auteurs, 'nom', 'id_auteur');
     163
     164        // Sélectionner toutes valeurs des réponses d’un coup. Éviten N requetes SQL...
     165        $ids_reponses = array_column($reponses, 'id_formulaires_reponse');
     166        $_reponses_valeurs = sql_allfetsel(
     167                'id_formulaires_reponse, nom, valeur',
     168                'spip_formulaires_reponses_champs',
     169                array(
     170                        sql_in('id_formulaires_reponse', $ids_reponses),
     171                        //sql_in('nom', array_keys($saisies)) // ralentit la requête, et inutile
     172                ),
     173                '',
     174                'id_formulaires_reponse ASC'
     175        );
     176
     177        // grouper par identifiant de réponse
     178        $reponses_valeurs = array();
     179        foreach ($_reponses_valeurs as $r) {
     180                if (empty($reponses_valeurs[$r['id_formulaires_reponse']])) {
     181                        $reponses_valeurs[$r['id_formulaires_reponse']] = array();
     182                }
     183                $reponses_valeurs[$r['id_formulaires_reponse']][$r['nom']] = $r['valeur'];
     184        }
     185        unset($_reponses_valeurs);
     186
     187        // Ensuite tous les champs
     188        $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/');
     189
     190        // On parcourt chaque réponse
     191        foreach ($reponses as $i => $reponse) {
     192                // Est-ce qu'il y a un auteur avec un nom
     193                $nom_auteur = '';
     194                if ($id_auteur = intval($reponse['id_auteur'])) {
     195                        $nom_auteur = !empty($auteurs[$id_auteur]) ? $auteurs[$id_auteur] : '';
     196                }
     197
     198                // Le début de la réponse avec les infos (date, auteur, etc)
     199                $reponse_complete = array(
     200                        $reponse['id_formulaires_reponse'],
     201                        $reponse['date'],
     202                        $nom_auteur,
     203                        $reponse['ip'],
    83204                );
    84205                if ($statut_reponses != 'publie') {
    85                         $titres[] = _T('formidable:reponse_statut');
    86                 }
    87 
    88                 $saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false);
     206                        $reponse_complete[] = statut_texte_instituer('formulaires_reponse', $reponse['statut']);
     207                }
     208
     209                // Liste de toutes les valeurs
     210                $valeurs = $reponses_valeurs[$reponse['id_formulaires_reponse']];
     211
    89212                foreach ($saisies as $nom => $saisie) {
    90                         if ($saisie['saisie'] != 'explication') {    // on exporte tous les champs sauf explications
    91                                 $options  = $saisie['options'];
    92                                 $titres[] = sinon(
    93                                         isset($options['label_case']) ? $options['label_case'] : '',
    94                                         sinon(
    95                                                 isset($options['label']) ? $options['label'] : '',
    96                                                 $nom
    97                                         )
    98                                 );
    99                         }
    100                 }
    101 
    102                 // On passe la ligne des titres de colonnes dans un pipeline
    103                 $titres = pipeline(
    104                         'formidable_exporter_formulaire_reponses_titres',
    105                         array(
    106                                 'args' => array('id_formulaire' => $id_formulaire, 'formulaire' => $formulaire),
    107                                 'data' => $titres,
    108                         )
    109                 );
    110 
    111                 $reponses_completes[] = $titres;
    112                 $saisies_fichiers = array();
    113 
    114                 // sélectionner tous les auteurs d’un coup. Évite N requetes SQL…
    115                 $ids_auteurs = array_filter(array_map('intval', array_column($reponses, 'id_auteur')));
    116                 $auteurs = sql_allfetsel('id_auteur, nom', 'spip_auteurs', sql_in('id_auteur', $ids_auteurs));
    117                 $auteurs = array_column($auteurs, 'nom', 'id_auteur');
    118 
    119                 // Sélectionner toutes valeurs des réponses d’un coup. Éviten N requetes SQL...
    120                 $ids_reponses = array_column($reponses, 'id_formulaires_reponse');
    121                 $_reponses_valeurs = sql_allfetsel(
    122                         'id_formulaires_reponse, nom, valeur',
    123                         'spip_formulaires_reponses_champs',
    124                         array(
    125                                 sql_in('id_formulaires_reponse', $ids_reponses),
    126                                 //sql_in('nom', array_keys($saisies)) // ralentit la requête, et inutile
    127                         ),
    128                         '',
    129                         'id_formulaires_reponse ASC'
    130                 );
    131 
    132                 // grouper par identifiant de réponse
    133                 $reponses_valeurs = array();
    134                 foreach ($_reponses_valeurs as $r) {
    135                         if (empty($reponses_valeurs[$r['id_formulaires_reponse']])) {
    136                                 $reponses_valeurs[$r['id_formulaires_reponse']] = array();
    137                         }
    138                         $reponses_valeurs[$r['id_formulaires_reponse']][$r['nom']] = $r['valeur'];
    139                 }
    140                 unset($_reponses_valeurs);
    141 
    142                 // Ensuite tous les champs
    143                 $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/');
    144 
    145                 // On parcourt chaque réponse
    146                 foreach ($reponses as $i => $reponse) {
    147                         // Est-ce qu'il y a un auteur avec un nom
    148                         $nom_auteur = '';
    149                         if ($id_auteur = intval($reponse['id_auteur'])) {
    150                                 $nom_auteur = !empty($auteurs[$id_auteur]) ? $auteurs[$id_auteur] : '';
    151                         }
    152 
    153                         // Le début de la réponse avec les infos (date, auteur, etc)
    154                         $reponse_complete = array(
    155                                 $reponse['id_formulaires_reponse'],
    156                                 $reponse['date'],
    157                                 $nom_auteur,
    158                                 $reponse['ip'],
    159                         );
    160                         if ($statut_reponses != 'publie') {
    161                                 $reponse_complete[] = statut_texte_instituer('formulaires_reponse', $reponse['statut']);
    162                         }
    163 
    164                         // Liste de toutes les valeurs
    165                         $valeurs = $reponses_valeurs[$reponse['id_formulaires_reponse']];
    166 
    167                         foreach ($saisies as $nom => $saisie) {
    168                                 if ($saisie['saisie'] != 'explication') {
    169 
    170                                         // Saisie de type fichier ?
    171                                         if ($saisie['saisie'] == 'fichiers') {
    172                                                 $_valeurs = $tenter_unserialize($valeurs[$nom]);
    173                                                 //tester s'il y a des saisies parmi les fichiers
    174                                                 if (is_array($_valeurs) and $_valeurs) {
    175                                                         $chemin = _DIR_FICHIERS_FORMIDABLE . 'formulaire_' . $id_formulaire . '/reponse_' . $reponse['id_formulaires_reponse'];
    176                                                         foreach ($_valeurs as $v) {
    177                                                                 $chemin_fichier = $chemin . '/' . $saisie['options']['nom'] . '/' . $v['nom'];
    178                                                                 if (file_exists($chemin_fichier)) {
    179                                                                         $saisies_fichiers[] = $chemin_fichier;
    180                                                                 }
     213                        if ($saisie['saisie'] != 'explication') {
     214
     215                                // Saisie de type fichier ?
     216                                if ($saisie['saisie'] == 'fichiers') {
     217                                        $_valeurs = $tenter_unserialize($valeurs[$nom]);
     218                                        //tester s'il y a des saisies parmi les fichiers
     219                                        if (is_array($_valeurs) and $_valeurs) {
     220                                                $chemin = _DIR_FICHIERS_FORMIDABLE . 'formulaire_' . $id_formulaire . '/reponse_' . $reponse['id_formulaires_reponse'];
     221                                                foreach ($_valeurs as $v) {
     222                                                        $chemin_fichier = $chemin . '/' . $saisie['options']['nom'] . '/' . $v['nom'];
     223                                                        if (file_exists($chemin_fichier)) {
     224                                                                $saisies_fichiers[] = $chemin_fichier;
    181225                                                        }
    182226                                                }
    183227                                        }
    184 
    185                                         $valeur = isset($valeurs[$nom]) ? $valeurs[$nom] : '';
    186                                         $reponse_complete[] = formidable_generer_valeur_texte_saisie($valeur, $saisie);
    187228                                }
     229
     230                                $valeur = isset($valeurs[$nom]) ? $valeurs[$nom] : '';
     231                                $reponse_complete[] = formidable_generer_valeur_texte_saisie($valeur, $saisie);
    188232                        }
    189 
    190                         // On passe la ligne de réponse dans un pipeline
    191                         $reponse_complete = pipeline(
    192                                 'formidable_exporter_formulaire_reponses_reponse',
    193                                 array(
    194                                         'args' => array(
    195                                                 'id_formulaire' => $id_formulaire,
    196                                                 'formulaire'    => $formulaire,
    197                                                 'reponse'       => $reponse,
    198                                         ),
    199                                         'data' => $reponse_complete,
    200                                 )
    201                         );
    202 
    203                         // On ajoute la ligne à l'ensemble des réponses
    204                         $reponses_completes[] = $reponse_complete;
    205                 }
    206 
    207                 if (!count($saisies_fichiers)) {// si pas de saisie fichiers, on envoie directement le csv
    208                         if ($reponses_completes and $exporter_csv = charger_fonction('exporter_csv', 'inc/', true)) {
    209                                 $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim);
    210                                 exit();
    211                         }
    212                 } else {
    213                         if ($reponses_completes and $exporter_csv = charger_fonction('exporter_csv', 'inc/', true)) {
    214                                 $fichier_csv = $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim, null, false);
    215                                 $fichier_zip = sous_repertoire(_DIR_CACHE, 'export') . 'reponses-formulaire-' . $formulaire['identifiant'] . '.zip';
    216                                 include_spip('inc/formidable_fichiers');
    217                                 $fichier_zip = formidable_zipper_reponses_formulaire($formulaire['id_formulaire'], $fichier_zip, $fichier_csv, $saisies_fichiers);
    218                                 if (!$fichier_zip) {// si erreur lors du zippage
    219                                         return false;
    220                                 } else {
    221                                         formidable_retourner_fichier($fichier_zip, basename($fichier_zip));
    222                                 }
    223                         }
    224                 }
    225         } else {
    226                 return false;
    227         }
    228 }
     233                }
     234
     235                // On passe la ligne de réponse dans un pipeline
     236                $reponse_complete = pipeline(
     237                        'formidable_exporter_formulaire_reponses_reponse',
     238                        array(
     239                                'args' => array(
     240                                        'id_formulaire' => $id_formulaire,
     241                                        'formulaire' => $formulaire,
     242                                        'reponse' => $reponse,
     243                                ),
     244                                'data' => $reponse_complete,
     245                        )
     246                );
     247
     248                // On ajoute la ligne à l'ensemble des réponses
     249                $reponses_completes[] = $reponse_complete;
     250        }
     251
     252        return array($reponses_completes, $saisies_fichiers);
     253}
     254
    229255
    230256/**
Note: See TracChangeset for help on using the changeset viewer.