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'); |
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; |
} |
// trim() car: `POST http://url<<<"range=*"` |
elseif(trim($_POST['range']) == '*') { |
$obs_ids = Array('*'); |
|
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'; |
} |
// 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))); |
} |
return $filtres; |
} |
|
$params['format'] = 'CSV'; |
if($_POST['format'] == 'xls') $params['format'] = 'Excel5'; |
if($_POST['format'] == 'xlsx') $params['format'] = 'Excel2007'; |
|
$this->export($obs_ids, NULL, $params); |
exit; |
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) { |
124,49 → 134,40 |
exit; |
} |
|
$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") |
|
$objPHPExcel->getActiveSheet()->setTitle("Observations"); |
$colonnes = self::nomEnsembleVersListeColonnes($parametres_format['groupe_champs']); |
// $colonne_abbrev = array_keys($colonnes); |
$objPHPExcel = $this->gerenerFeuilleImportFormatee($parametres_format); |
$feuille = $objPHPExcel->setActiveSheetIndex(0); |
$colid = 0; |
foreach($colonnes as $colonne) { |
if($colonne['extra'] == 2) continue; |
// attention formaterColonnesFeuille prend ses 2 premiers paramètres par référence |
$this->formaterColonnesFeuille($feuille, $colonnes, $parametres_format); |
$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12); |
|
$feuille->setCellValueByColumnAndRow($colid, 1, $colonne['nom']); |
if($colonne['extra'] == 1) { |
$feuille->getStyleByColumnAndRow($colid, 1)->getBorders()->applyFromArray( |
array( |
'allborders' => array( |
'style' => PHPExcel_Style_Border::BORDER_DASHDOT, |
'color' => array('rgb' => PHPExcel_Style_Color::COLOR_BLUE) |
) |
) |
); |
$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++; |
} |
if(! $colonne['importable']) { |
$feuille->getStyleByColumnAndRow($colid, 1)->getFill()->applyFromArray( |
array( |
'type' => PHPExcel_Style_Fill::FILL_SOLID, |
'color' => array('rgb' => PHPExcel_Style_Color::COLOR_YELLOW) |
) |
); |
|
$this->envoyerFeuille($objPHPExcel, $parametres_format); |
} |
|
$colid++; |
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; |
} |
|
$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12); |
|
$ligne = 2; |
foreach ($observations as $obs) { |
$colid = 0; |
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 ? |
188,29 → 189,61 |
$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 */ } |
if(false && $abbrev == 'date_observation' && $valeur == "0000-00-00") { |
/* blah */ |
} |
// // fin de section "cas particuliers" |
|
$feuille->setCellValueByColumnAndRow($colid, $ligne, $valeur); |
$colid++; |
$feuille->setCellValueByColumnAndRow($no_colonne, $no_ligne, $valeur); |
$no_colonne++; |
} |
$ligne++; |
} |
|
header("Content-Type: application/vnd.ms-excel"); |
header("Content-Disposition: attachment; filename=\"liste.xls\"; charset=utf-8"); |
header("Cache-Control: max-age=0"); |
private function gerenerFeuilleImportFormatee($parametres_format) { |
$objPHPExcel = new PHPExcel(); |
|
// 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; |
$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"); |
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( |
array( |
'allborders' => array( |
'style' => PHPExcel_Style_Border::BORDER_DASHDOT, |
'color' => array('rgb' => PHPExcel_Style_Color::COLOR_BLUE) |
) |
) |
); |
} |
if(! $colonne['importable']) { |
$feuille->getStyleByColumnAndRow($colid, 1)->getFill()->applyFromArray( |
array( |
'type' => PHPExcel_Style_Fill::FILL_SOLID, |
'color' => array('rgb' => PHPExcel_Style_Color::COLOR_YELLOW) |
) |
); |
} |
|
$colid++; |
} |
} |
|
/* |
* @param $fieldSets: un range, eg: 1-5,8,32,58-101 |
* @return un tableau trié, eg: 1,2,3,4,5,8,32,58,...,101 |
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; |