Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1643 → Rev 1644

/trunk/jrest/services/ExportXLS.php
49,38 → 49,72
 
private $cache = Array();
private $id_utilisateur = NULL;
private $parametres_defaut = array("range" => "*",
"format" => "CSV");
 
function ExportXLS($config) {
parent::__construct($config);
}
 
/*
* Process $_POST et $_GET
* TODO: changer JRest pour pouvoir disposer d'un nom de méthode plus représentatif que "updateXXX"
* en POST
*/
function updateElement($uid, $pairs) {
$params = Array('uid' => $uid[0]);
// TODO: pas de range mais un utilisateur: possible
if(!isset($_POST['range'])) {
header('HTTP/1.0 204 No Content');
exit;
function getRessource() {
return $this->getElement(array());
}
function getElement($uid) {
$parametres_format = $this->traiterParametresFormat($uid, $_GET);
$filtres = $this->traiterFiltres($_GET);
$this->export($parametres_format, $filtres);
exit;
}
function traiterParametresFormat($uid, $params) {
$parametres = $this->parametres_defaut;
if(isset($params['format'])) {
if($params['format'] == 'csv') $parametres['format'] = 'CSV';
if($params['format'] == 'xls') $parametres['format'] = 'Excel5';
if($params['format'] == 'xlsx') $parametres['format'] = 'Excel2007';
}
// trim() car: `POST http://url<<<"range=*"`
elseif(trim($_POST['range']) == '*') {
$obs_ids = Array('*');
// TODO: $params['part'] pour le multi-part
$parametres['widget'] = isset($params['widget']) ? $params['widget'] : 'CEL';
$parametres['debut'] = isset($params['debut']) ? intval($params['debut']) : 0;
$parametres['limite'] = isset($params['limite']) ? intval($params['limite']) : 0;
$parametres['id_utilisateur'] = $this->traiterIdUtilisateur($uid);
$parametres['groupe_champs'] = null;
return $parametres;
}
function traiterIdUtilisateur($uid) {
$id_utilisateur = null;
// TODO: controleUtilisateur()
if(isset($uid[0])) {
$id_utilisateur = intval($uid[0]);
}
return $id_utilisateur;
}
function traiterFiltres($params) {
$obs_ids = $this->traiterObsIds($params);
$filtres = array();
if(!$obs_ids || count($obs_ids) == 1 && $obs_ids[0] == '*') {
unset($filtres['sql_brut']);
}
else {
$obs_ids = self::rangeToList(trim($_POST['range']));
$filtres = Array('sql_brut' =>
sprintf('id_observation IN (%s)', implode(',', $obs_ids)));
}
 
$params['format'] = 'CSV';
if($_POST['format'] == 'xls') $params['format'] = 'Excel5';
if($_POST['format'] == 'xlsx') $params['format'] = 'Excel2007';
 
$this->export($obs_ids, NULL, $params);
exit;
return $filtres;
}
function traiterObsIds($params) {
$obs_ids = Array('*');
if (isset($params['range']) && trim($params['range']) != '*') {
// trim() car: `POST http://url<<<"range=*"`
$obs_ids = self::rangeToList(trim($params['range']));
}
return $obs_ids;
}
 
/*
* $param: Tableau associatif, indexes supportés:
87,36 → 121,12
* - widget: le nom du widget d'origine (utilisé pour les méta-données du tableur)
*
*/
function export(Array $obs_ids, String $fieldSets = NULL, Array $params = Array()) {
$colonnes = self::nom_d_ensemble_vers_liste_de_colonnes($fieldSets);
// $colonne_abbrev = array_keys($colonnes);
function export(Array $parametres_format = Array(),Array $filtres = array()) {
$chercheur_observations = new RechercheObservation($this->config);
 
$objPHPExcel = new PHPExcel();
 
// TODO: $params['part'] pour le multi-part
$params['widget'] = isset($params['widget']) ? $params['widget'] : 'CEL';
// TODO: controleUtilisateur()
if(! $params['uid']) { // || ! $this->controleUtilisateur($params['uid'])) {
$params['uid'] = NULL;
}
if($params['uid']) $this->id_utilisateur = intval($params['uid']);
 
$criteres = Array();
if(! $obs_ids || count($obs_ids) == 1 && $obs_ids[0] == '*') {
unset($criteres['raw']);
}
else {
$criteres = Array('raw' =>
sprintf('id_observation IN (%s)', implode(',', $obs_ids)));
}
 
$criteres['debut'] = isset($_GET['debut']) ? intval($_GET['debut']) : 0;
$criteres['limite'] = isset($_GET['limite']) ? intval($_GET['limite']) : 0;
$observations = $chercheur_observations
->rechercherObservations($params['uid'], $criteres, $criteres['debut'], $criteres['limite'], TRUE)
->rechercherObservations($parametres_format['id_utilisateur'], $filtres, $parametres_format['debut'], $parametres_format['limite'], TRUE)
->get();
// debug //echo ($chercheur_observations->requete_selection_observations);
// XXX: malheureusement l'instance de JRest n'est pas accessible ici
if(!$observations) {
123,21 → 133,93
header('HTTP/1.0 204 No Content');
exit;
}
$colonnes = self::nomEnsembleVersListeColonnes($parametres_format['groupe_champs']);
// $colonne_abbrev = array_keys($colonnes);
$objPHPExcel = $this->gerenerFeuilleImportFormatee($parametres_format);
$feuille = $objPHPExcel->setActiveSheetIndex(0);
// attention formaterColonnesFeuille prend ses 2 premiers paramètres par référence
$this->formaterColonnesFeuille($feuille, $colonnes, $parametres_format);
$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);
 
$objPHPExcel->getProperties()->setCreator($params['widget']) // ou $uid ?
->setLastModifiedBy("XX") // TODO: $uid
->setTitle("YY") // TODO
->setSubject("ZZ") // TODO
->setDescription("Export blah");
//->setKeywords("office PHPExcel php")
//->setCategory("Test result file")
$no_ligne = 2;
foreach ($observations as $obs) {
// attention traiterLigneObservation prend ses 3 premiers paramètres par référence
$this->traiterLigneObservation($obs, $colonnes, $feuille, $no_ligne);
$no_ligne++;
}
 
$this->envoyerFeuille($objPHPExcel, $parametres_format);
}
private function envoyerFeuille($objPHPExcel, $parametres_format) {
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"liste.xls\"; charset=utf-8");
header("Cache-Control: max-age=0");
// csv|xls|xlsx => CSV|Excel5|Excel2007
// Note: le format Excel2007 utilise un fichier temporaire
$generateur = PHPExcel_IOFactory::createWriter($objPHPExcel, $parametres_format['format']);
$generateur->save('php://output');
exit;
}
private function traiterLigneObservation(&$obs, &$colonnes, &$feuille, $no_ligne) {
$no_colonne = 0;
foreach($colonnes as $abbrev => $colonne) {
$valeur = null;
if($colonne['extra'] == 2) continue;
// valeur direct depuis cel_obs ?
if(isset($obs[$abbrev])) $valeur = $obs[$abbrev];
// pré-processeur de la champs
if(function_exists($colonne['fonction'])) {
$valeur = $colonne['fonction']($valeur);
} elseif(method_exists(__CLASS__, $colonne['fonction'])) {
$valeur = call_user_func(array(__CLASS__, $colonne['fonction']), $valeur);
} elseif($colonne['fonction']) {
die("méthode {$colonne['fonction']} introuvable");
}
// fonction pour obtenir des champs (étendus)
elseif(function_exists($colonne['fonction_data'])) {
$valeur = $colonne['fonction_data']($obs);
}
elseif(method_exists(__CLASS__, $colonne['fonction_data'])) {
$valeur = call_user_func(array(__CLASS__, $colonne['fonction_data']), $obs);
}
// // cette section devrait être vide:
// // cas particuliers ingérable avec l'architecture actuelle:
if(false && $abbrev == 'date_observation' && $valeur == "0000-00-00") {
/* blah */
}
// // fin de section "cas particuliers"
$feuille->setCellValueByColumnAndRow($no_colonne, $no_ligne, $valeur);
$no_colonne++;
}
}
private function gerenerFeuilleImportFormatee($parametres_format) {
$objPHPExcel = new PHPExcel();
$objPHPExcel->getProperties()->setCreator($parametres_format['widget']) // ou $uid ?
->setLastModifiedBy("XX") // TODO: $uid
->setTitle("Export des observation du carnet en ligne") // TODO
->setSubject("Export") // TODO
->setDescription("Export");
//->setKeywords("office PHPExcel php")
//->setCategory("Test result file")
$objPHPExcel->getActiveSheet()->setTitle("Observations");
$feuille = $objPHPExcel->setActiveSheetIndex(0);
return $objPHPExcel;
}
private function formaterColonnesFeuille(&$feuille, &$colonnes, $parametres_format) {
$colid = 0;
foreach($colonnes as $colonne) {
if($colonne['extra'] == 2) continue;
 
$feuille->setCellValueByColumnAndRow($colid, 1, $colonne['nom']);
if($colonne['extra'] == 1) {
$feuille->getStyleByColumnAndRow($colid, 1)->getBorders()->applyFromArray(
157,58 → 239,9
)
);
}
 
$colid++;
}
 
$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);
 
$ligne = 2;
foreach ($observations as $obs) {
$colid = 0;
foreach($colonnes as $abbrev => $colonne) {
if($colonne['extra'] == 2) continue;
 
// valeur direct depuis cel_obs ?
if(isset($obs[$abbrev])) $valeur = $obs[$abbrev];
 
// pré-processeur de la champs
if(function_exists($colonne['fonction'])) {
$valeur = $colonne['fonction']($valeur);
} elseif(method_exists(__CLASS__, $colonne['fonction'])) {
$valeur = call_user_func(array(__CLASS__, $colonne['fonction']), $valeur);
} elseif($colonne['fonction']) {
die("méthode {$colonne['fonction']} introuvable");
}
// fonction pour obtenir des champs (étendus)
elseif(function_exists($colonne['fonction_data'])) {
$valeur = $colonne['fonction_data']($obs);
}
elseif(method_exists(__CLASS__, $colonne['fonction_data'])) {
$valeur = call_user_func(array(__CLASS__, $colonne['fonction_data']), $obs);
}
 
 
// // cette section devrait être vide:
// // cas particuliers ingérable avec l'architecture actuelle:
if(false && $abbrev == 'date_observation' && $valeur == "0000-00-00") { /* blah */ }
// // fin de section "cas particuliers"
 
$feuille->setCellValueByColumnAndRow($colid, $ligne, $valeur);
$colid++;
}
$ligne++;
}
 
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"liste.xls\"; charset=utf-8");
header("Cache-Control: max-age=0");
 
// csv|xls|xlsx => CSV|Excel5|Excel2007
// Note: le format Excel2007 utilise un fichier temporaire
$generateur = PHPExcel_IOFactory::createWriter($objPHPExcel, $params['format']);
$generateur->save('php://output');
exit;
}
 
/*
244,7 → 277,7
* @TODO: fonction commune à la génération en CSV
*
*/
static function nom_d_ensemble_vers_liste_de_colonnes($groupe_de_champs = 'standard') {
static function nomEnsembleVersListeColonnes($groupe_de_champs = 'standard') {
if(! $groupe_de_champs) $groupe_de_champs = 'standard';
$groupe_de_champs = array_flip(explode(',', $groupe_de_champs));
$colonnes = Array();
338,9 → 371,10
 
protected function formaterDate($date_heure_mysql, $format = NULL) {
if (!$date_heure_mysql || $date_heure_mysql == "0000-00-00 00:00:00") return "00/00/0000";
$timestamp = DateTime::createFromFormat("Y-m-d H:i:s", $date_heure_mysql)->getTimestamp();
$date_format = DateTime::createFromFormat("Y-m-d H:i:s", $date_heure_mysql);
$timestamp = @$date_format->getTimestamp();
if(!$timestamp) return "00/00/0000";
// TODO: les widget ne font malheureusement pas usage de l'heure dans le CEL
// TODO: les widgets ne font malheureusement pas usage de l'heure dans le CEL
// TODO: si modification, ne pas oublier de modifier le format d'import correspondant
// dans ImportXLS (actuellement: "d/m/Y")
$date_formatee = strftime('%d/%m/%Y', $timestamp);
463,7 → 497,8
} catch(Exception $e) { return ''; }
if(! $noms) return '';
$noms = array_filter($noms['resultat'], function($item) { return ($item['num_statut'] == 1); });
$nom = array_pop($noms)['nom_vernaculaire'];
$premier_nom = array_pop($noms);
$nom = $premier_nom['nom_vernaculaire'];
 
// cache
$this->cache['getNomCommun'][$cache_id] = $nom;