Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1637 → Rev 1638

/trunk/jrest/services/ExportXLS.php
65,12 → 65,12
}
// trim() car: `POST http://url<<<"range=*"`
elseif(trim($_POST['range']) == '*') {
$records = Array('*');
$obs_ids = Array('*');
}
else {
$records = self::rangeToList(trim($_POST['range']));
$obs_ids = self::rangeToList(trim($_POST['range']));
}
$this->export($records, NULL, $params);
$this->export($obs_ids, NULL, $params);
exit;
}
 
79,9 → 79,9
* - widget: le nom du widget d'origine (utilisé pour les méta-données du tableur)
*
*/
function export(Array $records, String $fieldSets = NULL, Array $params = Array()) {
$colonnes = self::fieldSetsToColumns($fieldSets);
$columnSlugs = array_keys($colonnes);
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);
$chercheur_observations = new RechercheObservation($this->config);
 
$objPHPExcel = new PHPExcel();
94,12 → 94,12
}
 
$criteres = Array();
if(! $records || count($records) == 1 && $records[0] == '*') {
if(! $obs_ids || count($obs_ids) == 1 && $obs_ids[0] == '*') {
unset($criteres['raw']);
}
else {
$criteres = Array('raw' =>
sprintf('id_observation IN (%s)', implode(',', $records)));
sprintf('id_observation IN (%s)', implode(',', $obs_ids)));
}
 
$criteres['debut'] = isset($_GET['debut']) ? intval($_GET['debut']) : 0;
124,12 → 124,12
//->setCategory("Test result file")
 
$objPHPExcel->getActiveSheet()->setTitle("Observations");
$sheet = $objPHPExcel->setActiveSheetIndex(0);
$feuille = $objPHPExcel->setActiveSheetIndex(0);
$colid = 0;
foreach($colonnes as $colonne) {
$sheet->setCellValueByColumnAndRow($colid, 1, $colonne['nom']);
$feuille->setCellValueByColumnAndRow($colid, 1, $colonne['nom']);
if($colonne['extra']) {
$sheet->getStyleByColumnAndRow($colid, 1)->getBorders()->applyFromArray(
$feuille->getStyleByColumnAndRow($colid, 1)->getBorders()->applyFromArray(
array(
'allborders' => array(
'style' => PHPExcel_Style_Border::BORDER_DASHDOT,
143,12 → 143,12
 
$objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);
 
$row = 2;
$ligne = 2;
foreach ($observations as $obs) {
$colid = 0;
foreach($colonnes as $slug => $colonne) {
foreach($colonnes as $abbrev => $colonne) {
// valeur direct depuis cel_obs ?
if(isset($obs[$slug])) $valeur = $obs[$slug];
if(isset($obs[$abbrev])) $valeur = $obs[$abbrev];
 
// pré-processeur de la champs
if(function_exists($colonne['fonction'])) {
169,13 → 169,13
 
// // cette section devrait être vide:
// // cas particuliers ingérable avec l'architecture actuelle:
if(false && $slug == 'date_observation' && $valeur == "0000-00-00") { /* blah */ }
if(false && $abbrev == 'date_observation' && $valeur == "0000-00-00") { /* blah */ }
// // fin de section "cas particuliers"
 
$sheet->setCellValueByColumnAndRow($colid, $row, $valeur);
$feuille->setCellValueByColumnAndRow($colid, $ligne, $valeur);
$colid++;
}
$row++;
$ligne++;
}
 
header("Content-Type: application/vnd.ms-excel");
182,9 → 182,9
header("Content-Disposition: attachment; filename=\"liste.xls\"; charset=utf-8");
header("Cache-Control: max-age=0");
// Le format Excel2007 utilise un fichier temporaire
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
// $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
$generateur = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
// $generateur = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$generateur->save('php://output');
exit;
}
 
191,6 → 191,7
/*
* @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
* http://stackoverflow.com/questions/7698664/converting-a-range-or-partial-array-in-the-form-3-6-or-3-6-12-into-an-arra
*/
static function rangeToList($in = '') {
$inSets = explode(',', $in);
214,17 → 215,18
* eg: "espece" ou "champs-etendus", ...
*
* @return: un tableau associatif déjà ordonné
* clé: slug [machine-name] de la colonne (eg: "espece" ou "mot-clef")
* clé: abbrev [machine-name] de la colonne (eg: "espece" ou "mot-clef")
* valeur: des données relative à cette colonne, cf GenColInfo
*
* @TODO: fonction commune à la génération en CSV
*
*/
static function fieldSetsToColumns($fieldSets = 'standard') {
if(! $fieldSets) $fieldSets = 'standard';
$fieldSets = array_flip(explode(',', $fieldSets));
static function nom_d_ensemble_vers_liste_de_colonnes($groupe_de_champs = 'standard') {
if(! $groupe_de_champs) $groupe_de_champs = 'standard';
$groupe_de_champs = array_flip(explode(',', $groupe_de_champs));
$colonnes = Array();
 
if(isset($fieldSets['standard'])) {
if(isset($groupe_de_champs['standard'])) {
$colonnes += Array(
'nom_sel' => self::GenColInfo('nom_sel', 'Espèce'),
'nom_sel_nn' => self::GenColInfo('nom_sel_nn', 'Numéro nomenclatural'),
278,8 → 280,8
* $fonction_data doit retourner une valeur
 
*/
static function GenColInfo($slug, $nom, $is_extra = 0, $fonction = NULL, $fonction_data = NULL, $importable = TRUE) {
return Array('slug' => $slug,
static function GenColInfo($abbrev, $nom, $is_extra = 0, $fonction = NULL, $fonction_data = NULL, $importable = TRUE) {
return Array('abbrev' => $abbrev,
'nom' => $nom,
'extra' => $is_extra ? 1 : 0,
'fonction' => $fonction,
353,10 → 355,10
// pas de cache:
error_log("require NomsVernaculaires.php pour \"{$obs['nom_ret']}\"");
 
$data = Array('masque.nt' => $obs['nt'],
$donnees = Array('masque.nt' => $obs['nt'],
'masque.lg' => $langue,
'retour.champs' => 'num_statut');
$noms = $service->consulter(Array('nvjfl', 'noms-vernaculaires'), $data);
$noms = $service->consulter(Array('nvjfl', 'noms-vernaculaires'), $donnees);
 
if(! $noms) return '';
$noms = array_filter((array)($noms->resultat), function($item) { return ($item->num_statut == 1); });
387,10 → 389,10
// pas de cache:
error_log("require NomsVernaculaires.php pour \"{$obs['nom_ret']}\"");
 
$data = Array('masque.nt' => $obs['nt'],
$donnees = Array('masque.nt' => $obs['nt'],
'masque.lg' => $langue,
'retour.champs' => 'conseil_emploi');
$this->service->initialiserRessourcesEtParametres(Array('nvjfl', 'noms-vernaculaires', 'attributions'), $data);
$this->service->initialiserRessourcesEtParametres(Array('nvjfl', 'noms-vernaculaires', 'attributions'), $donnees);
try {
$noms = $this->service->traiterRessources();
} catch(Exception $e) { return ''; }
/trunk/jrest/services/ImportXLS.php
13,7 → 13,7
* Service d'import de données d'observation du CEL au format XLS
*/
 
// sont define()'d commme n° de colonne tous les slugs retournés par ExportXLS::fieldSetsToColumns()
// sont define()'d commme n° de colonne tous les abbrevs retournés par ExportXLS::nom_d_ensemble_vers_liste_de_colonnes()
// préfixés par C_ cf: detectionEntete()
 
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
25,11 → 25,11
require_once('ExportXLS.php');
 
class MyReadFilter implements PHPExcel_Reader_IReadFilter {
public $excludes = array();
public $exclues = array();
public function __construct() {}
public function readCell($column, $row, $worksheetName = '') {
if(@$this->excludes[$column]) return false;
if($row == 1) return false;
public function readCell($colonne, $ligne, $worksheetName = '') {
if(@$this->exclues[$colonne]) return false;
if($ligne == 1) return false;
return true;
}
}
78,40 → 78,40
$infos_fichier = array_pop($_FILES);
/*$objPHPExcel = PHPExcel_IOFactory::load($infos_fichier['tmp_name']);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);*/
$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);*/
 
/*$objReader = PHPExcel_IOFactory::createReader("Excel5");
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($infos_fichier['tmp_name']);*/
 
//var_dump($sheetData);
//var_dump($donnees);
 
$objReader = PHPExcel_IOFactory::createReader("Excel5");
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($infos_fichier['tmp_name']);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);
$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);
 
$filterSubset = new MyReadFilter();
$filterSubset->excludes = self::detectionEntete($sheetData[1]);
$objReader->setReadFilter($filterSubset);
$filtre_colonnes = new MyReadFilter();
$filtre_colonnes->exclues = self::detectionEntete($donnees[1]);
$objReader->setReadFilter($filtre_colonnes);
 
// recharge avec le filtre sur colonnes actif
// (exclue les colonnes inutiles/inutilisables)
$objPHPExcel = $objReader->load($infos_fichier['tmp_name']);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);
self::charger($sheetData);
$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);
self::charger($donnees);
}
 
static function detectionEntete($entete) {
$colonnes_reconnues = Array();
$cols = ExportXLS::fieldSetsToColumns('standard');
$cols = ExportXLS::nom_d_ensemble_vers_liste_de_colonnes('standard');
foreach($entete as $k => $v) {
$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
foreach($cols as $col) {
$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
$entete_officiel_slug = $col['slug'];
if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_slug) {
define("C_" . strtoupper($entete_officiel_slug), $k);
$entete_officiel_abbrev = $col['abbrev'];
if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
define("C_" . strtoupper($entete_officiel_abbrev), $k);
$colonnes_reconnues[$k] = 1;
break;
}
125,7 → 125,7
// ne conserve que le nom long pour matcher avec la ligne XLS d'entête
array_walk($colonnes_automatiques, function(&$v) { $v = $v['nom']; });
$colonnesID_a_exclure = array_intersect($entete, $colonnes_automatiques);
// TODO: pourquoi ne pas comparer avec les slugs aussi
// TODO: pourquoi ne pas comparer avec les abbrevs aussi
 
return array_merge($colonnesID_non_reconnues, $colonnesID_a_exclure);
}
132,12 → 132,12
 
static function charger($donnees) {
// TODO: chunkfilter
$chunks = 30;
$morceaux = 30;
$i = 2;
$end = $i + $chunks;
while($i < $end && isset($donnees[$i])) {
$record = self::chargerLigne($donnees[$i]);
$req = implode(', ', self::sortArrayByArray($record, self::$ordre_BDD));
$fin = $i + $morceaux;
while($i < $fin && isset($donnees[$i])) {
$enregistrement = self::chargerLigne($donnees[$i]);
$req = implode(', ', self::sortArrayByArray($enregistrement, self::$ordre_BDD));
$i++;
}
}
174,7 → 174,7
"commentaire" => trim($ligne[C_COMMENTAIRE]),
 
// XXX: fixe
"transmission" => 0, // cf commentaire dans ExportXLS::fieldSetsToColumns()
"transmission" => 0, // cf commentaire dans ExportXLS::nom_d_ensemble_vers_liste_de_colonnes()
"date_creation" => date("Y-m-d H:i:s"),
"date_modification" => date("Y-m-d H:i:s"),