1,16 → 1,7 |
<?php |
|
// declare(encoding='UTF-8'); |
/** |
* @category PHP |
* @package jrest |
* @author Raphaël Droz <raphael@tela-botania.org> |
* @copyright 2013 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
*/ |
|
/** |
* Service d'export de données d'observation du CEL au format XLS |
* Service d'export de données d'observation du CEL au format XLS. |
* |
* Format du service : |
* POST /ExportXLS |
19,7 → 10,7 |
* |
* Les données POST acceptées sont: |
* range (obligatoire): un range d'id_observation sous la forme d'entier ou d'intervalles d'entiers |
* séparés par des virgules ou bien '*' (pour toutes) |
* séparés par des virgules ou bien '*' (pour toutes) |
* TODO: limit |
* TODO: départ |
* TODO: sets (ou colonnes, ou extended) |
30,50 → 21,60 |
* |
* Si <Utilisateur> est fourni, le observations seront le résultat de l'intersection des 2 contraintes |
* |
* @internal Mininum PHP version : 5.2 |
* @category CEL |
* @package Services |
* @subpackage Observations |
* @version 0.1 |
* @author Mathias CHOUET <mathias@tela-botanica.org> |
* @author Raphaël Droz <raphael@tela-botania.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Aurelien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org> |
*/ |
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib'); |
// TERM |
ini_set('html_errors', 0); |
ini_set('xdebug.cli_color', 2); |
require_once('lib/PHPExcel/Classes/PHPExcel.php'); |
require_once('lib/FormateurGroupeColonne.php'); |
require_once 'lib/PHPExcel/Classes/PHPExcel.php'; |
require_once 'lib/FormateurGroupeColonne.php'; |
|
class ExportXLS extends Cel { |
|
private $id_utilisateur = NULL; |
private $parametres_defaut = array("range" => "*", |
"format" => "CSV"); |
|
private $parametres_defaut = array('range' => '*', 'format' => 'CSV'); |
|
private $filtres_autorises = array( |
'id_utilisateur' => 'id_utilisateur', |
'utilisateur' => 'courriel_utilisateur', |
'commune' => 'zone_geo', |
'dept' => 'departement', |
'projet' => 'mots_cles', |
'num_taxon' => 'nt', |
'date_debut' => 'date_debut', |
'date_fin' => 'date_fin', |
'taxon' => 'taxon' |
'id_utilisateur' => 'id_utilisateur', |
'utilisateur' => 'courriel_utilisateur', |
'commune' => 'zone_geo', |
'dept' => 'departement', |
'projet' => 'mots_cles', |
'num_taxon' => 'nt', |
'date_debut' => 'date_debut', |
'date_fin' => 'date_fin', |
'taxon' => 'taxon' |
); |
|
function ExportXLS($config) { |
public function __construct($config) { |
parent::__construct($config); |
} |
|
function getRessource() { |
|
public function getRessource() { |
return $this->getElement(array()); |
} |
|
function getElement($uid) { |
$parametres_format = $this->traiterParametresFormat($uid, $_GET); |
|
public function getElement($uid) { |
$parametres_format = $this->traiterParametresFormat($uid, $_GET); |
$filtres = $this->traiterFiltres($_GET); |
$this->export($parametres_format, $filtres); |
exit; |
exit(); |
} |
|
function traiterParametresFormat($uid, $params) { |
|
private function traiterParametresFormat($uid, $params) { |
$parametres = $this->parametres_defaut; |
if(isset($params['format'])) { |
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'; |
80,44 → 81,42 |
if($params['format'] == 'pdf') $parametres['format'] = 'pdf'; |
} |
// TODO: $params['part'] pour le multi-part |
$parametres['widget'] = isset($params['widget']) ? $params['widget'] : 'CEL'; |
$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'] = isset($params['colonnes']) ? $params['colonnes'] : 'standard,avance'; |
|
|
return $parametres; |
} |
|
function traiterIdUtilisateur($uid) { |
|
private function traiterIdUtilisateur($uid) { |
$id_utilisateur = null; |
// TODO: controleUtilisateur() |
if(isset($uid[0])) { |
if (isset($uid[0])) { |
$id_utilisateur = intval($uid[0]); |
} |
return $id_utilisateur; |
} |
|
function traiterFiltres($params) { |
|
private function traiterFiltres($params) { |
$obs_ids = $this->traiterObsIds($params); |
$filtres = array(); |
if(!$obs_ids || count($obs_ids) == 1 && $obs_ids[0] == '*') { |
if (!$obs_ids || count($obs_ids) == 1 && $obs_ids[0] == '*') { |
unset($filtres['sql_brut']); |
} |
else { |
} else { |
$filtres = Array('sql_brut' => |
sprintf('id_observation IN (%s)', implode(',', $obs_ids))); |
} |
foreach($params as $cle => $valeur) { |
if(trim($valeur) != '' && isset($this->filtres_autorises[$cle])) { |
foreach ($params as $cle => $valeur) { |
if (trim($valeur) != '' && isset($this->filtres_autorises[$cle])) { |
$filtres[$this->filtres_autorises[$cle]] = $valeur; |
} |
} |
return $filtres; |
} |
|
|
function traiterObsIds($params) { |
|
private function traiterObsIds($params) { |
$obs_ids = Array('*'); |
if (isset($params['range']) && trim($params['range']) != '*') { |
// trim() car: `POST http://url<<<"range=*"` |
128,10 → 127,10 |
|
/* |
* $param: Tableau associatif, indexes supportés: |
* - widget: le nom du widget d'origine (utilisé pour les méta-données du tableur) |
* - widget: le nom du widget d'origine (utilisé pour les méta-données du tableur) |
* |
*/ |
function export(Array $parametres_format = Array(),Array $filtres = array()) { |
private function export(Array $parametres_format = Array(),Array $filtres = array()) { |
$chercheur_observations = new RechercheObservation($this->config); |
|
$observations = $chercheur_observations |
139,13 → 138,15 |
->get(); |
// debug //echo ($chercheur_observations->requete_selection_observations); |
// XXX: malheureusement l'instance de JRest n'est pas accessible ici |
if(!$observations) { |
if (!$observations) { |
header('HTTP/1.0 204 No Content'); |
exit; |
exit(); |
} |
|
if($parametres_format['format'] == 'pdf') { |
if(count($observations) > 300) die('too much'); |
if ($parametres_format['format'] == 'pdf') { |
if (count($observations) > 300) { |
die('too much'); |
} |
require_once('GenerateurPDF.php'); |
|
$pdf = new GenerateurPDF(); |
153,7 → 154,7 |
//$pdf->export1($observations); |
//$pdf->export2($observations); |
$pdf->pdf->Output('etiquettes.pdf', 'I'); |
die; |
die(); |
} |
|
$colonnes = FormateurGroupeColonne::nomEnsembleVersListeColonnes($parametres_format['groupe_champs']); |
173,12 → 174,12 |
|
$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"); |
|
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']); |
185,43 → 186,44 |
$generateur->save('php://output'); |
exit; |
} |
|
public function traiterLigneObservation(&$obs, &$colonnes, &$feuille, $no_ligne) { |
|
private function traiterLigneObservation(&$obs, &$colonnes, &$feuille, $no_ligne) { |
$no_colonne = 0; |
foreach($colonnes as $abbrev => $colonne) { |
foreach ($colonnes as $abbrev => $colonne) { |
$valeur = null; |
if($colonne['extra'] == 2 || ! is_null($colonne['dyna'])) continue; |
|
if ($colonne['extra'] == 2 || ! is_null($colonne['dyna'])) { |
continue; |
} |
|
// valeur direct depuis cel_obs ? |
if(isset($obs[$abbrev])) $valeur = $obs[$abbrev]; |
if (isset($obs[$abbrev])) { |
$valeur = $obs[$abbrev]; |
} |
|
// pré-processeur de la champs |
if(function_exists($colonne['fonction'])) { |
if (function_exists($colonne['fonction'])) { |
$valeur = $colonne['fonction']($valeur); |
} elseif(method_exists('FormateurGroupeColonne', $colonne['fonction'])) { |
} else if (method_exists('FormateurGroupeColonne', $colonne['fonction'])) { |
$valeur = call_user_func(array('FormateurGroupeColonne', $colonne['fonction']), $valeur); |
} elseif(method_exists(__CLASS__, $colonne['fonction'])) { |
} else if (method_exists(__CLASS__, $colonne['fonction'])) { |
$valeur = call_user_func(array(__CLASS__, $colonne['fonction']), $valeur); |
} elseif($colonne['fonction']) { |
} else if ($colonne['fonction']) { |
die("méthode {$colonne['fonction']} introuvable"); |
} |
// fonction pour obtenir des champs (étendus) |
elseif(function_exists($colonne['fonction_data'])) { |
} else if (function_exists($colonne['fonction_data'])) { // fonction pour obtenir des champs (étendus) |
$valeur = $colonne['fonction_data']($obs); |
} |
elseif(method_exists(__CLASS__, $colonne['fonction_data'])) { |
} else if (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 */ |
if (false && $abbrev == 'date_observation' && $valeur == "0000-00-00") { |
/* blah */ |
} |
if($abbrev == 'images') { |
if ($abbrev == 'images') { |
$valeur = FormateurGroupeColonne::getImages($obs, $this->id_utilisateur, $this); |
} |
if($abbrev == 'nom-commun') { |
if ($abbrev == 'nom-commun') { |
$valeur = FormateurGroupeColonne::getNomCommun_v4($obs, $this); |
} |
|
230,29 → 232,29 |
$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") |
|
->setLastModifiedBy("XX") // TODO: $uid |
->setTitle("Export des observation du carnet en ligne") // TODO |
->setSubject("Export") // TODO |
->setDescription("Export"); |
|
$objPHPExcel->getActiveSheet()->setTitle("Observations"); |
return $objPHPExcel; |
} |
|
|
private function formaterColonnesFeuille(&$feuille, &$colonnes, $parametres_format) { |
$colid = 0; |
foreach($colonnes as $colonne) { |
if($colonne['extra'] == 2) continue; |
|
foreach ($colonnes as $colonne) { |
if ($colonne['extra'] == 2) { |
continue; |
} |
|
$feuille->setCellValueByColumnAndRow($colid, 1, $colonne['nom']); |
if($colonne['extra'] == 1) { |
if ($colonne['extra'] == 1) { |
$feuille->getStyleByColumnAndRow($colid, 1)->getBorders()->applyFromArray( |
array( |
'allborders' => array( |
262,7 → 264,7 |
) |
); |
} |
if(! $colonne['importable']) { |
if (! $colonne['importable']) { |
$feuille->getStyleByColumnAndRow($colid, 1)->getFill()->applyFromArray( |
array( |
'type' => PHPExcel_Style_Fill::FILL_SOLID, |
270,7 → 272,6 |
) |
); |
} |
|
$colid++; |
} |
} |
284,10 → 285,12 |
$inSets = explode(',', $in); |
$outSets = array(); |
|
foreach($inSets as $inSet) { |
foreach ($inSets as $inSet) { |
list($start,$end) = explode('-', $inSet . '-' . $inSet); |
// ignore les ranges trop importants |
if($start > 10000000 || $end > 10000000 || abs($start-$end) > 10000) continue; |
if ($start > 10000000 || $end > 10000000 || abs($start-$end) > 10000) { |
continue; |
} |
$outSets = array_merge($outSets,range($start,$end)); |
} |
$outSets = array_unique($outSets); |