Rev 445 | Blame | 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 colonnesdefine('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"define('LIEUDIT','lieu-dit'); // Texte libredefine('STATION','station'); // Texte libredefine('MILIEU','milieu'); // Texte libredefine('LATITUDE','latitude'); // En decimal systeme WGS84define('LONGITUDE','longitude'); // En decimal systeme WGS84define('NOTES','notes'); // Texte libredefine('DATEOBS','date'); // date au format jj/mm/aaaadefine('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 : Autoloadinclude_once('DecoupageNomLatin.class.php');// Element constituant une observationClass InventoryImportExcel extends DBAccessor {// Element constituant une observationvar $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 obligatoiresession_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 erreurprint "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 traitercase 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 lignesfor ($i=0;$i<=$colcount-1;$i++) {// On saute les lignes videswhile (($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 traitercase 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 inseeecho "traitement commune";$identifiant_commune=ltrim($identifiant_commune);$identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveaupreg_match('/(.*)\((.*)\)/',$identifiant_commune,$elements);$DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun iciif ($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 libreecho "traitement lieudit";return utf8_encode(ltrim($lieudit));}function traiterStation($station) { // texte libreecho "traitement station";return utf8_encode(ltrim($station));}function traiterMilieu($milieu) { // texte libreecho "traitement milieu";return utf8_encode(ltrim($milieu));}function traiterLatitude($latitude) { // verifier formal decimal + limite france ? TODOecho "traitement latitude";return ltrim($latitude);}function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODOecho "traitement longitude";return ltrim($longitude);}function traiterNotes($notes) { // texte libreecho "traitement notes";return utf8_encode(ltrim($notes));}function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODOecho "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 niveaupreg_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 correspondanceecho "traitement image";}// utilitaire : FIXME mutualiser avec autres scriptsfunction 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$***/?>