Browse Source

Suite de r111474 : Pouvoir exporter en spip-cli des formulaires formidables un peu gros.

On modifie pour que l’export de base, sépare la génération du fichier de l’envoi au navigateur.
Une commande SPIP-Cli prend en premier argument l’identifiant numérique ou textuel du formulaire. Une option pour le format csv ou xls.

```
spip formidable:exporter:formulaire super-petition
spip formidable:exporter:formulaire 2 --format=xls
```

Cette commande génère l’export (dans tmp/cache/export) au format csv ou xls, et zip s’il y a des fichiers dans les réponses.
On affiche, si réussite, le chemin physique généré, et également un lien de téléchargement qui peut être donné à une personne.
Cette personne doit être connectée à SPIP, avoir les droits de lecture pour ces réponses de formulaire.
Le lien d’action (un peu long) n’est valide que pour 1 contenu de fichier donné.

Note: le nommage de la commande pourrait évoluer si quelqu’un·e à mieux.
svn/root/tags/v3.16.0 v3.16.0
marcimat@rezo.net 4 years ago
parent
commit
1d344f4dd3
  1. 2
      .gitattributes
  2. 61
      action/formidable_recuperer_export.php
  3. 50
      formulaires/exporter_formulaire_reponses.php
  4. 15
      inc/formidable_fichiers.php
  5. 2
      paquet.xml
  6. 110
      spip-cli/FormidableExporterFormulaire.php

2
.gitattributes vendored

@ -2,6 +2,7 @@
action/dupliquer_formulaire.php -text
action/editer_formulaire.php -text
action/exporter_formulaire.php -text
action/formidable_recuperer_export.php -text
action/formidable_recuperer_fichier.php -text
action/formidable_recuperer_fichier_par_email.php -text
action/supprimer_formulaire.php -text
@ -168,6 +169,7 @@ saisies-vues/formulaire_formidable_multiple.html -text
saisies/champ.html -text
saisies/formulaire_formidable.html -text
saisies/formulaire_formidable_multiple.html -text
spip-cli/FormidableExporterFormulaire.php -text
/todo.txt -text
traiter/email.php -text
traiter/email.yaml -text

61
action/formidable_recuperer_export.php

@ -0,0 +1,61 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/autoriser');
include_spip('inc/formidable');
include_spip('inc/formidable_fichiers');
/**
* Récupère, si on est autorisé à voir la réponse du formulaire,
* un export csv ou xls (ou zip) qui aurait été préablablement réalisé.
* et l'envoi en http
*
* On s’assure que la personne est identifiée, et à l’autorisation de voir les réponses.
* Par ailleurs, on s’assure que le hash est valable uniquement pour un contenu de fichier donné.
*
**/
function action_formidable_recuperer_export() {
// {id_formulaire}:{filename}
$args = _request('args');
$cle = _request('cle');
include_spip('inc/securiser_action');
include_spip('inc/minipres');
if (!verifier_cle_action($args, $cle)) {
echo minipres();
exit;
}
list($id_formulaire, $md5, $filename) = array_pad(explode(':', $args, 3), 3, null);
if (
!$id_formulaire
or !$md5
or !$filename
or false !== stripos($filename, '/')
or false !== stripos($filename, '\\')
or empty($GLOBALS['visiteur_session']['id_auteur'])
or !autoriser('voir', 'formulairesreponse', $id_formulaire)
) {
echo minipres();
exit;
}
$chemin_fichier = _DIR_CACHE . 'export/' . $filename;
if (!file_exists($chemin_fichier)) {
echo minipres(_T('formidable:erreur_fichier_introuvable'));
exit;
}
if (md5_file($chemin_fichier) !== $md5) {
echo minipres(_L('URL d’export obsolète'));
exit;
}
formidable_retourner_fichier($chemin_fichier, $filename);
exit;
}

50
formulaires/exporter_formulaire_reponses.php

@ -37,13 +37,24 @@ function formulaires_exporter_formulaire_reponses_traiter($id_formulaire = 0) {
$verifier(_request('date_debut'), 'date', array('normaliser' => 'datetime'), $date_debut);
$verifier(_request('date_fin'), 'date', array('normaliser' => 'datetime'), $date_fin);
$chemin = false;
$content_type = '';
if (_request('type_export') == 'csv') {
$ok = exporter_formulaires_reponses($id_formulaire, ',', $statut_reponses, $date_debut, $date_fin);
$chemin = exporter_formulaires_reponses($id_formulaire, ',', $statut_reponses, $date_debut, $date_fin);
if (pathinfo($chemin, PATHINFO_EXTENSION) === 'csv') {
$content_type = "text/comma-separated-values; charset=" . $GLOBALS['meta']['charset'];
}
} elseif (_request('type_export') == 'xls') {
$ok = exporter_formulaires_reponses($id_formulaire, 'TAB', $statut_reponses, $date_debut, $date_fin);
$chemin = exporter_formulaires_reponses($id_formulaire, 'TAB', $statut_reponses, $date_debut, $date_fin);
if (pathinfo($chemin, PATHINFO_EXTENSION) === 'xls') {
$content_type = "text/comma-separated-values; charset=iso-8859-1";
}
}
if (!$ok) {
if ($chemin) {
formidable_retourner_fichier($chemin, basename($chemin), $content_type);
} else {
$retours['editable'] = 1;
$retours['message_erreur'] = _T('formidable:info_aucune_reponse');
}
@ -51,10 +62,17 @@ function formulaires_exporter_formulaire_reponses_traiter($id_formulaire = 0) {
return $retours;
}
/*
* Exporter toutes les réponses d'un formulaire (anciennement action/exporter_formulaire_reponses)
/**
* Exporter toutes les réponses d'un formulaire dans un fichier
*
* @param integer $id_formulaire
* @return unknown_type
* @param string $delim (Délimiteur ',' ou 'TAB')
* @param string $statut_reponses
* @param string $date_debut
* @param string $date_fin
*
* @return string|false Chemin du fichier d’export CSV, XLS ou ZIP
*/
function exporter_formulaires_reponses($id_formulaire, $delim = ',', $statut_reponses = 'publie', $date_debut = '', $date_fin = '') {
$exporter_csv = charger_fonction('exporter_csv', 'inc/', true);
@ -72,22 +90,16 @@ function exporter_formulaires_reponses($id_formulaire, $delim = ',', $statut_rep
return false;
}
$fichier_csv = $exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim, null, false);
// si pas de saisie fichiers, on envoie directement le csv
if (!count($saisies_fichiers)) {
$exporter_csv('reponses-formulaire-' . $formulaire['identifiant'], $reponses_completes, $delim);
exit;
} else {
$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);
// si erreur lors du zippage
if (!$fichier_zip) {
return false;
} else {
formidable_retourner_fichier($fichier_zip, basename($fichier_zip));
}
return $fichier_csv;
}
$fichier_zip = sous_repertoire(_DIR_CACHE, 'export') . 'reponses-formulaire-' . $formulaire['identifiant'] . '.zip';
include_spip('inc/formidable_fichiers');
return formidable_zipper_reponses_formulaire($formulaire['id_formulaire'], $fichier_zip, $fichier_csv, $saisies_fichiers);
}

15
inc/formidable_fichiers.php

@ -259,15 +259,18 @@ function formidable_deplacer_fichier_emplacement_definitif($fichier, $nom, $mime
/**
* Fournit à l'utilisateur·trice un fichier qui se trouve normalement dans un endroit inaccessible,
* par exemple dans config.
*
* La fonction ne vérifie ni l'existence effective du fichier,
* ni le droit effectif de l'utilisateur.
* Ceci doit être fait dans l'action qui appelle cette fonction
*
* @param string $chemin le chemin du fichier
* @param string $f le nom du fichier qui sera envoyé à l'utilisateur·trice.
* @param string $content_type Si Connu, sinon calculé
*
**/
function formidable_retourner_fichier($chemin, $f) {
header('Content-Type: '.mime_content_type($chemin));
function formidable_retourner_fichier($chemin, $f, $content_type = '') {
header('Content-Type: ' . ($content_type ?: mime_content_type($chemin)));
header("Content-Disposition: attachment; filename=\"$f\";");
header('Content-Transfer-Encoding: binary');
// fix for IE catching or PHP bug issue (inspiré de plugins-dist/dump/action/telecharger_dump.php
@ -445,12 +448,14 @@ function formidable_effacer_fichiers_email() {
}
return $dossiers_effaces;
}
/**
* Génerer un zip des réponses d'un formulaire
*
* @param int $id_formulaire (identifiant numérique)
* @param str $chemin_du_zip chemin complet du zip
* @param str $fichier_csv un fichier csv à ajouter, contenant les réponses
* @return str|int chemin complet du zip ou 0 si erreur lors de la création
* @param string $chemin_du_zip chemin complet du zip
* @param string $fichier_csv un fichier csv à ajouter, contenant les réponses
* @return string|int chemin complet du zip ou 0 si erreur lors de la création
**/
function formidable_zipper_reponses_formulaire($id_formulaire, $chemin_du_zip, $fichier_csv, $saisies_fichiers) {
include_spip('inc/pclzip');

2
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="formidable"
categorie="communication"
version="3.15.0"
version="3.16.0"
etat="stable"
compatibilite="[3.0.0;3.2.*]"
logo="images/formidable-64.png"

110
spip-cli/FormidableExporterFormulaire.php

@ -0,0 +1,110 @@
<?php
namespace Spip\Formidable\Command;
use Spip\Cli\Console\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class FormidableExporterFormulaire extends Command {
protected $formats = ['csv', 'xls'];
protected function configure() {
$this
->setName('formidable:exporter:formulaire')
->setDescription('Exporter un formulaire Formidable.')
->addArgument(
'identifiant',
InputArgument::REQUIRED,
'Numéro ou identifiant du formulaire'
)
->addOption(
'format',
'f',
InputOption::VALUE_OPTIONAL,
'Format d’export (' . implode(', ', $this->formats) . ')',
'csv'
)
;
}
protected function execute(InputInterface $input, OutputInterface $output) {
/** @var Spip $spip */
$this->demarrerSpip();
$identifiant = $input->getArgument('identifiant');
if (!$id_formulaire = $this->identifierFormulaireFormidable($identifiant)) {
$this->io->error("Identifiant $identifiant introuvable");
return;
}
$format = $input->getOption('format');
if (!in_array($format, $this->formats)) {
$this->io->error("Format d’export $format inconnu");
return;
}
$this->io->text("Exporter le formulaire n°<info>$id_formulaire</info> en <info>$format</info>");
$fichier = $this->exporterFormulaireFormidable($id_formulaire, $format);
if ($fichier) {
$this->io->check("Export réussi");
$this->io->text(["", "<info>Chemin physique</info>"]);
$this->io->text(realpath($fichier));
$this->io->text(["", "<info>Lien de téléchargement</info>"]);
include_spip('inc/securiser_action');
$args = "$id_formulaire:" . md5_file($fichier) . ":" . basename($fichier);
$cle = calculer_cle_action($args);
$action = generer_url_action('formidable_recuperer_export', "args=$args&cle=$cle", true);
$this->io->text(url_absolue($action));
} else {
$this->io->fail("Echec de l’export");
}
$this->io->text("");
}
/**
* Retourne l’identifiant numérique d’un identifiant (numérique ou texte)
* d’un formulaire formidable,
*
* @param string|int $identifiant
* @return int
*/
protected function identifierFormulaireFormidable($identifiant) {
if (is_numeric($identifiant)) {
$where = 'id_formulaire = ' . intval($identifiant);
} elseif (is_string($identifiant)) {
$where = 'identifiant = ' . sql_quote($identifiant);
} else {
return 0;
}
return intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where));
}
/**
* Génère un export de formulaire Formidable
* @param int $id_formulaire
* @param string $format
* @return string|false Chemin du fichier csv, xls ou zip généré
*/
protected function exporterFormulaireFormidable($id_formulaire, $format = 'csv') {
include_spip('inc/formidable');
include_spip('formulaires/exporter_formulaire_reponses');
$fichier = false;
switch ($format) {
case 'csv':
$fichier = exporter_formulaires_reponses($id_formulaire, ',');
break;
case 'xls':
$fichier = exporter_formulaires_reponses($id_formulaire, 'TAB');
break;
}
return $fichier;
}
}
Loading…
Cancel
Save