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'] = ''; |