}
include_spip('inc/formidable');
+include_spip('inc/formidable_fichiers');
include_spip('inc/config');
function formulaires_exporter_formulaire_reponses_charger($id_formulaire = 0) {
function formulaires_exporter_formulaire_reponses_verifier($id_formulaire = 0) {
$erreurs = array();
+ if (_request('date_debut') && _request('date_fin')) {
+ // Vérifions que la date debut soit < date de fin
+ if (strtotime(str_replace('/', '-', _request('date_debut'))) > strtotime(str_replace('/', '-', _request('date_fin')))) {
+ $erreurs['message_erreur'] = _T('formidable:exporter_formulaire_date_erreur');
+ }
+ }
+
return $erreurs;
}
function formulaires_exporter_formulaire_reponses_traiter($id_formulaire = 0) {
- $retours = array();
- $statut_reponses = _request('statut_reponses');
+ $retours = array();
+ $statut_reponses = _request('statut_reponses');
+ // Normaliser la date
+ $verifier = charger_fonction('verifier', 'inc/');
+ $verifier(_request('date_debut'), 'date', array('normaliser' => 'datetime'), $date_debut);
+ $verifier(_request('date_fin'), 'date', array('normaliser' => 'datetime'), $date_fin);
if (_request('type_export') == 'csv') {
- $ok = exporter_formulaires_reponses($id_formulaire, ',', $statut_reponses);
+ $ok = exporter_formulaires_reponses($id_formulaire, ',', $statut_reponses, $date_debut, $date_fin);
} elseif (_request('type_export') == 'xls') {
- $ok = exporter_formulaires_reponses($id_formulaire, 'TAB', $statut_reponses);
+ $ok = exporter_formulaires_reponses($id_formulaire, 'TAB', $statut_reponses, $date_debut, $date_fin);
}
if (!$ok) {
return $retours;
}
-
/*
* Exporter toutes les réponses d'un formulaire (anciennement action/exporter_formulaire_reponses)
* @param integer $id_formulaire
* @return unknown_type
*/
-function exporter_formulaires_reponses($id_formulaire, $delim = ',', $statut_reponses = 'publie') {
+function exporter_formulaires_reponses($id_formulaire, $delim = ',', $statut_reponses = 'publie', $date_debut = '', $date_fin = '') {
include_spip('inc/puce_statut');
// on ne fait des choses seulements si le formulaire existe et qu'il a des enregistrements
if ($id_formulaire > 0
and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . $id_formulaire)
- and $reponses = sql_allfetsel('*', 'spip_formulaires_reponses', 'id_formulaire = ' . $id_formulaire . ($statut_reponses == 'publie' ? ' and statut = "publie"' : ''))
- ) {
+ and $reponses = sql_allfetsel(
+ '*',
+ 'spip_formulaires_reponses',
+ 'id_formulaire = ' . intval($id_formulaire) . ($statut_reponses == 'publie' ? ' and statut = "publie"' : '')
+ . (strlen($date_debut) > 0 ? ' and date >= "'. $date_debut. '"' : '')
+ . (strlen($date_fin) > 0 ? ' and date <= "'.$date_fin.'"' : '')
+ )) {
+
include_spip('inc/saisies');
include_spip('facteur_fonctions');
include_spip('inc/filtres');
$reponses_completes = array();
// La première ligne des titres
- $titres = array(
+ $titres = array(
+ _T('formidable:id_formulaires_reponse'),
_T('public:date'),
_T('formidable:reponses_auteur'),
- _T('formidable:reponses_ip')
+ _T('formidable:reponses_ip'),
);
if ($statut_reponses != 'publie') {
$titres[] = _T('formidable:reponse_statut');
}
+
$saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false);
foreach ($saisies as $nom => $saisie) {
if ($saisie['saisie'] != 'explication') { // on exporte tous les champs sauf explications
$options = $saisie['options'];
- $titres[] = sinon($options['label_case'], sinon($options['label'], $nom));
+ $titres[] = sinon(
+ isset($options['label_case']) ? $options['label_case'] : '',
+ sinon(
+ isset($options['label']) ? $options['label'] : '',
+ $nom
+ )
+ );
}
}
-
+
// On passe la ligne des titres de colonnes dans un pipeline
$titres = pipeline(
'formidable_exporter_formulaire_reponses_titres',
array(
- 'args' => array('id_formulaire'=>$id_formulaire, 'formulaire'=>$formulaire),
+ 'args' => array('id_formulaire' => $id_formulaire, 'formulaire' => $formulaire),
'data' => $titres,
)
);
+
$reponses_completes[] = $titres;
+ $saisies_fichiers = array();
+
+ // sélectionner tous les auteurs d’un coup. Évite N requetes SQL…
+ $ids_auteurs = array_filter(array_map('intval', array_column($reponses, 'id_auteur')));
+ $auteurs = sql_allfetsel('id_auteur, nom', 'spip_auteurs', sql_in('id_auteur', $ids_auteurs));
+ $auteurs = array_column($auteurs, 'nom', 'id_auteur');
+
+ // Sélectionner toutes valeurs des réponses d’un coup. Éviten N requetes SQL...
+ $ids_reponses = array_column($reponses, 'id_formulaires_reponse');
+ $_reponses_valeurs = sql_allfetsel(
+ 'id_formulaires_reponse, nom, valeur',
+ 'spip_formulaires_reponses_champs',
+ array(
+ sql_in('id_formulaires_reponse', $ids_reponses),
+ //sql_in('nom', array_keys($saisies)) // ralentit la requête, et inutile
+ ),
+ '',
+ 'id_formulaires_reponse ASC'
+ );
+
+ // grouper par identifiant de réponse
+ $reponses_valeurs = array();
+ foreach ($_reponses_valeurs as $r) {
+ if (empty($reponses_valeurs[$r['id_formulaires_reponse']])) {
+ $reponses_valeurs[$r['id_formulaires_reponse']] = array();
+ }
+ $reponses_valeurs[$r['id_formulaires_reponse']][$r['nom']] = $r['valeur'];
+ }
+ unset($_reponses_valeurs);
+
+ // Ensuite tous les champs
+ $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/');
// On parcourt chaque réponse
- foreach ($reponses as $reponse) {
+ foreach ($reponses as $i => $reponse) {
// Est-ce qu'il y a un auteur avec un nom
$nom_auteur = '';
if ($id_auteur = intval($reponse['id_auteur'])) {
- $nom_auteur = sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur);
- }
- if (!$nom_auteur) {
- $nom_auteur = '';
+ $nom_auteur = !empty($auteurs[$id_auteur]) ? $auteurs[$id_auteur] : '';
}
// Le début de la réponse avec les infos (date, auteur, etc)
$reponse_complete = array(
+ $reponse['id_formulaires_reponse'],
$reponse['date'],
$nom_auteur,
- $reponse['ip']
+ $reponse['ip'],
);
if ($statut_reponses != 'publie') {
$reponse_complete[] = statut_texte_instituer('formulaires_reponse', $reponse['statut']);
}
- // Ensuite tous les champs
+ // Liste de toutes les valeurs
+ $valeurs = $reponses_valeurs[$reponse['id_formulaires_reponse']];
+
foreach ($saisies as $nom => $saisie) {
if ($saisie['saisie'] != 'explication') {
- $valeur = sql_getfetsel(
- 'valeur',
- 'spip_formulaires_reponses_champs',
- 'id_formulaires_reponse = ' . intval($reponse['id_formulaires_reponse']) . ' and nom = ' . sql_quote($nom)
- );
- if (is_array(unserialize($valeur))) {
- $valeur = unserialize($valeur);
+
+ // Saisie de type fichier ?
+ if ($saisie['saisie'] == 'fichiers') {
+ $_valeurs = $tenter_unserialize($valeurs[$nom]);
+ //tester s'il y a des saisies parmi les fichiers
+ if (is_array($_valeurs) and $_valeurs) {
+ $chemin = _DIR_FICHIERS_FORMIDABLE . 'formulaire_' . $id_formulaire . '/reponse_' . $reponse['id_formulaires_reponse'];
+ foreach ($_valeurs as $v) {
+ $chemin_fichier = $chemin . '/' . $saisie['options']['nom'] . '/' . $v['nom'];
+ if (file_exists($chemin_fichier)) {
+ $saisies_fichiers[] = $chemin_fichier;
+ }
+ }
+ }
}
- $reponse_complete[] = facteur_mail_html2text(
- recuperer_fond(
- 'saisies-vues/_base',
- array_merge(
- array(
- 'valeur_uniquement' => 'oui',
- 'type_saisie' => $saisie['saisie'],
- 'valeur' => $valeur
- ),
- $saisie['options']
- )
- )
- );
+
+ $valeur = isset($valeurs[$nom]) ? $valeurs[$nom] : '';
+ $reponse_complete[] = formidable_generer_valeur_texte_saisie($valeur, $saisie);
}
}
-
+
// On passe la ligne de réponse dans un pipeline
$reponse_complete = pipeline(
'formidable_exporter_formulaire_reponses_reponse',
array(
- 'args' => array('id_formulaire'=>$id_formulaire, 'formulaire'=>$formulaire, 'reponse'=>$reponse),
+ 'args' => array(
+ 'id_formulaire' => $id_formulaire,
+ 'formulaire' => $formulaire,
+ 'reponse' => $reponse,
+ ),
'data' => $reponse_complete,
)
);
$reponses_completes[] = $reponse_complete;
}
- if ($reponses_completes and $exporter_csv = charger_fonction('exporter_csv', 'inc/', true)) {
- $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim);
- exit();
+ if (!count($saisies_fichiers)) {// si pas de saisie fichiers, on envoie directement le csv
+ if ($reponses_completes and $exporter_csv = charger_fonction('exporter_csv', 'inc/', true)) {
+ $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim);
+ exit();
+ }
+ } else {
+ if ($reponses_completes and $exporter_csv = charger_fonction('exporter_csv', 'inc/', true)) {
+ $fichier_csv = $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim, null, false);
+ $fichier_zip = sous_repertoire(_DIR_CACHE, 'export') . 'reponses-formulaire-' . $formulaire['identifiant'] . '.zip';
+ include_spip('inc/formidable_fichiers');
+ $fichier_zip = formidable_zipper_reponses_formulaire($formulaire['id_formulaire'], $fichier_zip, $fichier_csv, $saisies_fichiers);
+ if (!$fichier_zip) {// si erreur lors du zippage
+ return false;
+ } else {
+ formidable_retourner_fichier($fichier_zip, basename($fichier_zip));
+ }
+ }
}
} else {
return false;
}
}
+
+/**
+ * Cette fonction retourne le texte d’une réponse pour un type de saisie donnée.
+ *
+ * On limite les calculs lorsque 2 valeurs/types de saisies sont identiques
+ * de fois de suite.
+ *
+ * @param string $valeur
+ * @param array $saisie
+ * @return string
+ */
+function formidable_generer_valeur_texte_saisie($valeur, $saisie) {
+ static $resultats = array();
+ static $tenter_unserialize = null;
+ if (is_null($tenter_unserialize)) {
+ $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/');
+ }
+
+ $hash = md5($saisie['saisie'] . ':' . serialize($saisie['options']) . ':' . $valeur);
+
+ if (!isset($resultats[$hash])) {
+ $valeur = $tenter_unserialize($valeur);
+ // Il faut éviter de passer par là… ça prend du temps…
+ $resultats[$hash] = facteur_mail_html2text(
+ recuperer_fond(
+ 'saisies-vues/_base',
+ array_merge(
+ array(
+ 'valeur_uniquement' => 'oui',
+ 'type_saisie' => $saisie['saisie'],
+ 'valeur' => $valeur,
+ ),
+ $saisie['options']
+ )
+ )
+ );
+
+ }
+
+ return $resultats[$hash];
+}