Browse Source
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

6 changed files with 215 additions and 25 deletions
@ -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; |
||||
} |
@ -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…
Reference in new issue