Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1714 → Rev 1715

/trunk/jrest/services/CelWidgetExport.php
62,6 → 62,10
private $format = 'csv';
public $id_utilisateur = null;
 
// un cache, initialisé par certaines fonctions de préchargement, à la manière
// de ce qui est fait par FormateurGroupeColonne
static $cache = Array();
public function getRessource() {
return $this->getElement(array());
144,7 → 148,8
$criteres = $this->traiterParametresAutorises($_GET);
// ne pas faire de super-requête en cas d'absence de paramètres
// par exemple "format", au minimum, devrait être défini
if(!$criteres) die('pas de paramètre reçu');
if(!$criteres) die('erreur: pas de paramètre reçu');
if(!in_array($this->format, array('pdf','csv','xls'))) die('erreur: format invalide');
 
$criteres['transmission'] = 1;
if($this->doitEtPeutExporterObsPrivees($criteres)) {
180,32 → 185,29
}
 
// cas XLS et CSV: on peut avoir besoin des champs étendus, des noms communs et des champs baseflor:
// 0) obtention des colonnes correspondantes aux groupes de champs
 
// Obtention des colonnes correspondantes aux groupes de champs
$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($groupes);
 
// 1) champs étendus, si demandés
$colonnes_champs_supp_par_obs = $champs_supp_par_obs = array();
if(isset($colonnes['etendu'])) {
$gestion_champs_etendus = new GestionChampsEtendus($this->config, 'obs');
$champs_supp_par_obs = $gestion_champs_etendus->consulterParLots($ids);
$colonnes_champs_supp_par_obs = $gestion_champs_etendus->consulterClesParLots($ids);
}
/*
Champs étendus et noms communs, si demandés.
* Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
qu'il initialise et utilise en interne sans qu'un passage par paramètre dans le contexte de CelWidgetExport
ne soit nécessaire.
* Pour les champs étendus, c'est CelWidgetExport::$cache qui est utilisé, aussi bien pour les en-têtes que
pour les données préchargées, cf self::traiterLigneEtendue()
*/
self::$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
 
// 2) nom communs
// $cache pourrait être utilisé par les fonctions de colonnes
// * Pour "nom commun", "preload" retourne NULL, car c'est le cache statique de FormateurGroupeColonne
// qu'il initialise et utilise en interne sans qu'un passage par paramètre ne soit nécessaire
$cache = FormateurGroupeColonne::preload($colonnes, $this, $ids);
// TODO: tous les champs étendus et les paramètres supplémentaires devraient être passés en un seul
// tableau (et chaque formateur csv, xls etc... pourrait également être dans une classe à part)
switch($this->format) {
case 'csv':
$csv = $this->convertirEnCsv($observations, $colonnes, $colonnes_champs_supp_par_obs, $champs_supp_par_obs);
$csv = $this->convertirEnCsv($observations, $colonnes);
$this->envoyerCsv($csv);
break;
case 'xls':
$xls = $this->convertirEnXls($observations, $colonnes, $colonnes_champs_supp_par_obs, $champs_supp_par_obs);
$xls = $this->convertirEnXls($observations, $colonnes);
$this->envoyerXls($xls);
break;
default:
237,7 → 239,7
exit;
}
private function convertirEnCsv(&$data, $colonnes, &$colonnes_supplementaires, &$champs_supplementaires = array()) {
private function convertirEnCsv(&$data, $colonnes) {
$chemin_temp = "php://temp";
$outstream = fopen($chemin_temp, 'r+');
 
247,7 → 249,9
$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
}
// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
$intitule_champs = array_merge($intitule_champs, array_values($colonnes_supplementaires));
if(isset($colonnes['etendu'])) {
$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
}
 
// header
fputcsv($outstream, $intitule_champs, ',', '"');
256,8 → 260,7
$id_obs = $ligne['id_observation'];
$ligne = self::filtrerDonneesSensibles($ligne);
$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
$ligne_etendue_aplatie = self::aplatirChampsEtendus($champs_supplementaires[$id_obs]);
self::traiterLigneEtendue($ligne, $colonnes_supplementaires, $ligne_etendue_aplatie);
self::traiterLigneEtendue($ligne, @self::$cache['etendu']['data'][$id_obs]);
fputcsv($outstream, $ligne, ',', '"');
}
rewind($outstream);
266,7 → 269,7
return $csv;
}
private function convertirEnXls(&$data, $colonnes, &$colonnes_supplementaires, &$champs_supplementaires = array()) {
private function convertirEnXls(&$data, $colonnes) {
$this->extendSpreadsheetProductor = new SpreadsheetProductor();
$this->extendSpreadsheetProductor->initSpreadsheet();
286,7 → 289,9
$intitule_champs = array_merge($intitule_champs, FormateurGroupeColonne::$baseflor_col);
}
// en second car manuellement appellé plus bas, TODO: utiliser l'API du FormateurGroupeColonne
$intitule_champs = array_merge($intitule_champs, array_values($colonnes_supplementaires));
if(isset($colonnes['etendu'])) {
$intitule_champs = array_merge($intitule_champs, array_values(self::$cache['etendu']['header']));
}
 
// header
$indice = 0;
298,9 → 303,7
$id_obs = $ligne['id_observation'];
$ligne = self::filtrerDonneesSensibles($ligne);
$ligne = FormateurGroupeColonne::getLigneObservation($ligne, $colonnes, $this);
 
$ligne_etendue_aplatie = self::aplatirChampsEtendus($champs_supplementaires[$id_obs]);
$ligne_supp = self::traiterLigneEtendue($ligne, $colonnes_supplementaires, $ligne_etendue_aplatie);
self::traiterLigneEtendue($ligne, @self::$cache['etendu']['data'][$id_obs]);
$indice = 0;
foreach($ligne as &$champ) {
$worksheet->write($nb_lignes,$indice++,$champ);
311,7 → 314,7
}
private function convertirEnPdf(&$observations) {
if(count($observations) > 300) die('trop de données');
if(count($observations) > 300) die('erreur: trop de données');
//require_once('GenerateurPDF.php');
$pdf = new GenerateurPDF();
$pdf->export($observations);
318,15 → 321,24
return $pdf;
}
static function traiterLigneEtendue(&$ligne, &$colonnes_etendues, $ligne_etendue_aplatie) {
if(! $colonnes_etendues) return;
if(! $ligne_etendue_aplatie) return;
$nb_colonnes_supp = count($colonnes_etendues);
static function traiterLigneEtendue(&$ligne, $ligne_etendue_aplatie) {
// si header n'est pas défini, aucune observation ne possède de champ étendu
// et nous n'ajoutons ni colonnes, ni valeurs.
if(! isset(self::$cache['etendu']['header'])) return;
 
$ligne_supp = array_fill(0, $nb_colonnes_supp, '');
$ligne_supp = array_fill(0, count(self::$cache['etendu']['header']), '');
$ligne_etendue_fmt = array();
 
foreach($colonnes_etendues as $colonne) {
// si, cependant cette seule observation n'a pas de champs étendus,
// nous devons rajouter des blancs (notamment dans le cas ou d'autres
// champs viennent à être ajoutés en aval à l'avenir
// cf: $fonction_dynamique dans FormateurGroupeColonne::GenColInfo()
if(! $ligne_etendue_aplatie) {
$ligne = array_merge($ligne, $ligne_supp);
return;
}
 
foreach(self::$cache['etendu']['header'] as $colonne) {
if(!isset($ligne_etendue_aplatie[$colonne])) {
$ligne_etendue_fmt[$colonne] = '';
} else {
334,18 → 346,10
}
}
 
// XXX/ array_merge() ?
$ligne += $ligne_etendue_fmt;
}
 
static function aplatirChampsEtendus(&$ligne_champs_etendus) {
$champs_etendus_fmt = array();
if(!$ligne_champs_etendus) return $champs_etendus_fmt;
foreach($ligne_champs_etendus as $champ) {
$champs_etendus_fmt[$champ->cle] = $champ->valeur;
}
return $champs_etendus_fmt;
}
static function filtrerDonneesSensibles($ligne) {
if(stripos($ligne['mots_cles_texte'], 'sensible') !== false) {
$ligne['latitude'] = '';