Rev 445 | Rev 480 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php
// In : utf8
// Out : utf8
// Import depuis une feuille de calcul
// Test fonction d'import
// Import de base
// TODO : soigner les controles ...
// Scenario avance
// Nom des colonnes
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
define('LIEUDIT','lieu-dit'); // Texte libre
define('STATION','station'); // Texte libre
define('MILIEU','milieu'); // Texte libre
define('LATITUDE','latitude'); // En decimal systeme WGS84
define('LONGITUDE','longitude'); // En decimal systeme WGS84
define('NOTES','notes'); // Texte libre
define('DATEOBS','date'); // date au format jj/mm/aaaa
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
define('IMAGE','image'); // nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
// Resultat analyse ligne // TODO : Classe ?
define('LIGNE_VIDE',1); //
define('LIGNE_NORMALE',2); //
define('LIGNE_IMAGE_SEULEMENT',3); //
include_once('Decoupage.class.php'); // TODO : Autoload
include_once('DecoupageNomLatin.class.php');
// Element constituant une observation
Class InventoryImportExcel extends DBAccessor {
// Element constituant une observation
var $format_observation=array(COMMUNE ,LIEUDIT ,STATION ,MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );
var $config;
var $extendExcelReader;
function InventoryImportExcel($config) {
$this->config=$config;
// Pas d'heritage multiple en php :(
$this->extendExcelReader = new ExcelReader();
$this->extendExcelReader->initExcelReader();
}
function createElement($pairs) {
// uid[0] : utilisateur obligatoire
session_start();
$this->controleUtilisateur($pairs['identifiant']);
foreach($_FILES as $file) { // FIXME : est necessaire
$infos_fichier = $file ;
}
// Chargement tableau en memoire FIXME : limiter le nombre de ligne ?
$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
$arr = array();
$rowcount=$data->rowcount(0);
$colcount=$data->colcount(0);
if ($rowcount<=1) { // TODO : retour erreur
print "Tableau vide";
exit;
}
for($row=1;$row<=$rowcount;$row++)
for($col=1;$col<=$colcount;$col++)
$arr[$col][$row] = $data->val($row,$col,0);
//print_r($arr);
// 1 : Traitement colonnes
$line = array();
/* Les colonnes ne sont pas forcemment dans l'ordre : on les extrait pour traitement futur */
for($col=1;$col<=$colcount;$col++) {
$colonne=strtolower($arr[$col][1]);
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter
case COMMUNE:
case LIEUDIT:
case STATION:
case MILIEU:
case LATITUDE:
case LONGITUDE:
case NOTES:
case DATEOBS:
case ESPECE:
case IMAGE:
$selection=array_values($arr[$col]);
array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
$line[$colonne]=$selection;
break;
}
}
/*
print_r($line[COMMUNE]);
print_r($line[LIEUDIT]);
print_r($line[STATION]);
print_r($line[MILIEU]);
print_r($line[LATITUDE]);
print_r($line[LONGITUDE]);
print_r($line[NOTES]);
print_r($line[DATEOBS]);
print_r($line[ESPECE]);
print_r($line[IMAGE]);
*/
// 1 : Traitement lignes
for ($i=0;$i<=$colcount-1;$i++) {
// On saute les lignes vides
while (($this->analyserLigne($line,$i)==LIGNE_VIDE) && ($i<=$colcount)) {
print "vide";
$i++;
}
while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$colcount)) {
$this->traiterLigne($line,$i);
$i++;
while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$colcount)) {
if ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
$this->traiterLigneComplement($line,$i);
}
else {
print "vide";
}
$i++;
}
}
// Cas special : seul l'image est presente
}
}
function analyserLigne($line,$i) {
$ligne_vide=true;
$ligne_image_seulement=true;
$ligne_normale=true;
foreach ($this->format_observation as $colonne) {
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
if ($colonne!=IMAGE) {
$ligne_image_seulement=false;
$ligne_vide=false;
break;
}
$ligne_vide=false;
}
}
if ($ligne_vide) {
return LIGNE_VIDE;
}
else {
if ($ligne_image_seulement) {
return LIGNE_IMAGE_SEULEMENT;
}
else {
return LIGNE_NORMALE;
}
}
}
function traiterLigne($line,$i) {
foreach ($this->format_observation as $colonne) {
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter
case COMMUNE:
$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
echo $info_commune['name'];
echo $info_commune['code'];
break;
case LIEUDIT:
$this->traiterLieudit($line[LIEUDIT][$i]);
break;
case STATION:
$this->traiterStation($line[STATION][$i]);
break;
case MILIEU:
$this->traiterMilieu($line[MILIEU][$i]);
break;
case LATITUDE:
$this->traiterLatitude($line[LATITUDE][$i]);
break;
case LONGITUDE:
$this->traiterLongitude($line[LONGITUDE][$i]);
break;
case NOTES:
$this->traiterNotes($line[NOTES][$i]);
break;
case DATEOBS:
$this->traiterDateObs($line[DATEOBS][$i]);
break;
case ESPECE:
$this->traiterEspece($line[ESPECE][$i]);
break;
case IMAGE:
$this->traiterImage($line[IMAGE][$i]);
break;
}
print "\n";
}
}
}
function traiterLigneComplement($line,$i) {
$this->traiterImage($line[IMAGE][$i]);
print "\n";
}
function traiterCommune($identifiant_commune) { // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
echo "traitement commune";
$identifiant_commune=ltrim($identifiant_commune);
$identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
preg_match('/(.*)\((.*)\)/',$identifiant_commune,$elements);
$DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
if ($elements[1]) { // departement present
$nom_commune=$elements[1];
$code_commune=$elements[2];
$query="SELECT DISTINCT name, code FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."%' AND code ='".$DB->escapeSimple($code_commune)."'";
}
else {
preg_match('/([0-9][0-9])|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
if ($elements[1]) { // code insee commune
$code_insee_commune=$elements[1];
$query="SELECT DISTINCT name, code FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
}
else {
preg_match('/(.*)/',$identifiant_commune,$elements);
if ($elements[1]) { // commune
$nom_commune=$elements[1];
$query="SELECT DISTINCT name, code FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."'";
}
}
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
return $res->fetchrow(DB_FETCHMODE_ASSOC);
}
function traiterLieudit($lieudit) { // texte libre
echo "traitement lieudit";
return utf8_encode(ltrim($lieudit));
}
function traiterStation($station) { // texte libre
echo "traitement station";
return utf8_encode(ltrim($station));
}
function traiterMilieu($milieu) { // texte libre
echo "traitement milieu";
return utf8_encode(ltrim($milieu));
}
function traiterLatitude($latitude) { // verifier formal decimal + limite france ? TODO
echo "traitement latitude";
return ltrim($latitude);
}
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
echo "traitement longitude";
return ltrim($longitude);
}
function traiterNotes($notes) { // texte libre
echo "traitement notes";
return utf8_encode(ltrim($notes));
}
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
echo "traitement dateobs";
return ltrim($notes);
}
function traiterEspece($identifiant_espece) { // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999)
echo "traitement espece";
$identifiant_espece=ltrim($identifiant_espece);
$identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
if ($elements[1]) { // Numero nomenclatural
$DB=$this->connectDB($this->config);
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a, " .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" WHERE a.esn_id_nom= '".$elements[1]. "'".
" AND a.esn_id_version_projet_taxon = 25 ".
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = a.esn_id_nom" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
}
else { // Nom scientifique
$decoupageNomLatin=new DecoupageNomLatin();
$nom_latin_decoupe=$decoupageNomLatin->decouper($identifiant_espece);
print_r($nom_latin_decoupe);
/*
[nom_genre] => Acer
[nom_sp] => monspessulanum
[auteur_sp] =>
[nom_complement] =>
[type_infrasp] =>
[nom_infrasp] =>
[num_nomenc] =>
[num_taxo] =>
[rang_taxonomique] => 250
[nom_courant] => monspessulanum
[nom_superieur] => Acer
[agg] =>
[nom_complet] => Acer monspessulanum
/*
[nom_genre] => Acer
[nom_sp] => monspessulanum
[auteur_sp] =>
[nom_complement] =>
[type_infrasp] => subsp.
[nom_infrasp] => monspessulanum
[num_nomenc] =>
[num_taxo] =>
[rang_taxonomique] => 280
[nom_courant] => monspessulanum
[nom_superieur] => monspessulanum
[agg] =>
[nom_complet] => Acer monspessulanum subsp. monspessulanum
*/
/*
$query="SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom, esn_ce_statut" .
" FROM eflore_nom, eflore_nom_rang, " .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" , eflore_selection_nom".
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['nom_genre'])."' " .
" AND en_ce_rang = '".$DB->escapeSimple($nom_latin_decoupe['rang_taxonomique'])."' " .
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['nom_sp'])."' AND en_ce_rang = enrg_id_rang " .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
" AND esn_id_nom= en_id_nom ".
" ORDER BY esn_ce_statut, en_ce_rang, en_epithete_espece, en_nom_genre LIMIT 50";
*/
}
}
function traiterImage($image) { // recherche id image de ce nom et creation table correspondance
echo "traitement image";
}
// utilitaire : FIXME mutualiser avec autres scripts
function formaterNom($rawnom) {
// Constitution du nom:
$nom = '';
if ($rawnom['en_nom_supra_generique'] != '') {
$nom .= $rawnom['en_nom_supra_generique'];
} else if ($rawnom['en_epithete_infra_generique'] != '') {
$nom .= $rawnom['en_epithete_infra_generique'];
} else {
if ($rawnom['en_nom_genre'] != '') {
$nom .= $rawnom['en_nom_genre'];
}
if ($rawnom['en_epithete_espece']!= '') {
$nom .= ' '.$rawnom['en_epithete_espece'];
}
if ($rawnom['en_epithete_infra_specifique'] != '') {
if (!empty($rawnom['enrg_abreviation_rang'])) {
$nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
}
$nom .= ' '.$rawnom['en_epithete_infra_specifique'];
}
}
return $nom.$this->retournerAuteur($rawnom) ;
}
function retournerAuteur($rawnom) {
$auteurs = '';
$auteur_basio = '';
$auteur_modif = '';
if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' ) {
$auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
$auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
}
} else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
$auteur_basio .= $rawnom['abreviation_auteur_basio'];
}
if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
$auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
$auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
}
} else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
$auteur_modif .= $rawnom['abreviation_auteur_modif'];
}
if (!empty($auteur_modif)) {
$auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
} elseif (!empty($auteur_basio)) {
$auteurs = ' '.$auteur_basio;
}
return $auteurs ;
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
*
*
*/
?>