Subversion Repositories eFlore/Applications.cel

Compare Revisions

Regard whitespace Rev 1320 → Rev 1321

/trunk/jrest/services/InventoryImportExcel.php
2,12 → 2,9
// In : utf8
// Out : utf8
 
 
// TODO : traiter image multilignes
// TODO : doublons
 
/*
 
/**
Octobre 2010 David Delon.
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
et liaison d'images déjà chargee aux observations ainsi crées.
17,10 → 14,8
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
**/
 
*/
 
 
// Nom des colonnes
 
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
42,15 → 37,13
define('LIGNE_NORMALE',2); //
define('LIGNE_IMAGE_SEULEMENT',3); //
 
 
//TODO: refactoriser entièrement cette classe
class InventoryImportExcel extends Cel {
 
// Element constituant une observation
 
var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
 
// Fichier configuration
var $config;
 
// Encapsulation classe lecture fichier excel
var $extendExcelReader;
 
64,9 → 57,8
**/
function InventoryImportExcel($config) {
 
$this->config=$config;
parent::__construct($config);
// Pas d'heritage multiple en php :(
 
$this->extendExcelReader = new ExcelReader();
$this->extendExcelReader->initExcelReader();
}
76,8 → 68,6
**/
function createElement($pairs) {
 
 
$pairs['utilisateur']=$_POST['identifiant'];
if(!isset($_SESSION)) {session_start();}
$this->controleUtilisateur($pairs['utilisateur']);
 
85,7 → 75,6
$infos_fichier = $file ;
}
 
 
// Chargement tableau en memoire
$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
$arr = array();
104,11 → 93,9
$arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
// 1 : Traitement intitules
 
$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]);
$colonne=trim($colonne);
139,31 → 126,26
$cpt_img=0;
 
/* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
$DB=$this->connectDB($this->config,'database_cel');
$query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($pairs['utilisateur'])."' ";
$requete = "SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = ".$this->proteger($pairs['utilisateur'])." ";
$resultat = $this->requeter($requete);
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
if(is_array($resultat) && count($resultat) > 0) {
$this->dernier_ordre = $resultat[0]['ordre']; // 1 par defaut
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$this->dernier_ordre=$row['ordre']; // 1 par defaut
}
 
for ($i=0;$i<=$rowcount-1;$i++) {
// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
if ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
// print "image non rattachee a une observation";
// image non rattachée à une observation
}
else {
// print "vide";
// ligne vide
}
$i++;
}
while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur'],$DB);
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur']);
if ($ordre>0) {
$cpt_obs++; // Compteur d'observations crees
}
179,8 → 161,6
$i++;
}
}
}
$message = '';
190,7 → 170,6
$message .= $cpt_obs;
print $message;
 
}
 
function analyserLigne($line,$i) {
233,14 → 212,19
return LIGNE_NORMALE;
}
}
 
}
 
function traiterLigne($line,$i,$utilisateur,$DB) { // Controle donnee et insertion
function traiterLigne($line,$i,$utilisateur) {
// Controle donnee et insertion
$info_image=array();
$info_transmettre = "0";
$info_espece = array('en_id_nom' => '',
'nom_sel' => '',
'nom_ret' => '',
'nom_ret_nn' => '',
'nt' => '',
'famille' => ''
);
foreach ($this->format_observation as $colonne) {
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
276,13 → 260,18
$info_transmettre=$this->traiterTransmettre($line[TRANSMETTRE][$i]);
break;
case ESPECE:
$info_espece=$this->traiterEspece($line[ESPECE][$i]);
if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') {
$complement=$this->rechercherInformationsComplementaires($info_espece['en_id_nom']);
$chercheur_infos_taxon = new RechercheInfosTaxon($this->config);
$resultat_recherche_espece = $chercheur_infos_taxon->rechercherInfosSurTexteCodeOuNumTax($line[ESPECE][$i]);
if (isset($resultat_recherche_espece['en_id_nom']) && $resultat_recherche_espece['en_id_nom']!='') {
$info_espece['nom_sel'] = $resultat_recherche_espece['nom_sel'];
$info_espece['nom_sel_nn'] = $resultat_recherche_espece['en_id_nom'];
$complement = $chercheur_infos_taxon->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
$info_espece['nom_ret']=$complement['Nom_Retenu'];
$info_espece['num_nom_ret']=$complement['Num_Nom_Retenu'];
$info_espece['num_taxon']=$complement['Num_Taxon'];
$info_espece['nom_ret_nn'] = $complement['Num_Nom_Retenu'];
$info_espece['nt'] = $complement['Num_Taxon'];
$info_espece['famille']=$complement['Famille'];
} else {
$info_espece['nom_sel'] = $line[ESPECE][$i];
}
break;
case IMAGE:
293,27 → 282,27
else {
switch($colonne) {
case COMMUNE:
$info_commune['name']="000null";
$info_commune['nom']="";
break;
case LIEUDIT:
$info_lieudit="000null";
$info_lieudit="";
break;
case STATION:
$info_station="000null";
$info_station="";
break;
case MILIEU:
$info_milieu="000null";
$info_milieu="";
break;
case DEPARTEMENT:
if (!isset ($info_commune['code']) || $info_commune['code']=='') {
$info_commune['code']="000null";
$info_commune['code']="";
}
break;
case LATITUDE:
$info_latitude="000null";
$info_latitude = "";
break;
case LONGITUDE:
$info_longitude="000null";
$info_longitude = "";
break;
case NOTES:
$info_notes='';
321,100 → 310,90
case TRANSMETTRE:
$info_transmettre = "0";
break;
 
}
 
}
}
 
$this->dernier_ordre++;
 
list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
$info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
$query = "INSERT INTO cel_inventory (identifiant,ordre,nom_sel,num_nom_sel,nom_ret,num_nom_ret,num_taxon,famille,location,id_location,date_observation,lieudit,station, milieu, commentaire, transmission, date_creation,date_modification,coord_x,coord_y) " .
" VALUES('".$DB->escapeSimple($utilisateur)."','".
$DB->escapeSimple($this->dernier_ordre)."','".
$DB->escapeSimple($info_espece['nom_sel'])."','".
$DB->escapeSimple($info_espece['en_id_nom'])."','".
$DB->escapeSimple($info_espece['nom_ret'])."','".
$DB->escapeSimple($info_espece['num_nom_ret'])."','".
$DB->escapeSimple($info_espece['num_taxon'])."','".
$DB->escapeSimple($info_espece['famille'])."','".
$DB->escapeSimple($info_commune['name'])."','".
$DB->escapeSimple($info_commune['code'])."','".
$DB->escapeSimple($info_dateobs)."','".
$DB->escapeSimple($info_lieudit)."','".
$DB->escapeSimple($info_station)."','".
$DB->escapeSimple($info_milieu)."','".
$DB->escapeSimple($info_notes)."','".
$DB->escapeSimple($info_transmettre)."',".
"now() , now(),'".
$DB->escapeSimple($info_latitude)."','".
$DB->escapeSimple($info_longitude)."')";
$requete = "INSERT INTO cel_obs (".
"ce_utilisateur,ordre,".
"nom_sel,nom_sel_nn,nom_ret,nom_ret_nn,nt,famille,".
"zone_geo,ce_zone_geo,".
"date_observation,".
"lieudit,station, milieu, commentaire, transmission, ".
"date_creation,date_modification,latitude,longitude) ".
" VALUES(".$this->proteger($utilisateur).",".
$this->proteger($this->dernier_ordre).",".
$this->proteger($info_espece['nom_sel']).",".
$this->proteger($info_espece['nom_sel_nn']).",".
$this->proteger($info_espece['nom_ret']).",".
$this->proteger($info_espece['nom_ret_nn']).",".
$this->proteger($info_espece['nt']).",".
$this->proteger($info_espece['famille']).",".
$this->proteger($info_commune['nom']).",".
$this->proteger($info_commune['code']).",".
$this->proteger($info_dateobs).",".
$this->proteger($info_lieudit).",".
$this->proteger($info_station).",".
$this->proteger($info_milieu).",".
$this->proteger($info_notes).",".
$this->proteger($info_transmettre).",".
"now() , now(),".
$this->proteger($info_latitude).",".
$this->proteger($info_longitude).")";
 
$res =& $DB->query($query);
$insertion = $this->executer($requete);
 
if (PEAR::isError($res)) {
return false;
}
// creation lien image
foreach ($info_image as $pic) {
 
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation ) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
$requete_liaison = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observation ) VALUES ('.$this->proteger($pic['id_image']).','.$this->proteger($utilisateur).', '.$this->proteger($this->dernier_ordre).') ON DUPLICATE KEY UPDATE id_image = id_image ';
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
$liaison = $this->executer($requete_liaison);
if ($liaison !== false) {
$this->cpt_images_liees++;
} else {
return false;
} else {
$this->cpt_images_liees++;
}
}
 
return $this->dernier_ordre;
 
 
}
 
function traiterLigneComplement($line,$i,$utilisateur, $ordre = null) {
 
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
// creation lien image
foreach ($info_image as $pic) {
 
$DB=$this->connectDB($this->config,'cel_db');
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
$requete = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observations) VALUES ('.$this->proteger($pic['id_image']).','.$this->proteger($utilisateur).', '.$this->proteger($this->dernier_ordre).') ON DUPLICATE KEY UPDATE id_image = id_image' ;
$resultat_liaison = $this->executer($requete);
if ($resultat_liaison !== false) {
$this->cpt_images_liees++;
} else {
return false;
} else {
$this->cpt_images_liees++;
}
}
}
function traiterCommune($identifiant_commune) { // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
 
function traiterCommune($identifiant_commune) {
// Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
$identifiant_commune=trim($identifiant_commune);
$identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
 
preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
 
$DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
 
if (isset($elements[1])) { // commune + departement : montpellier (34)
$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)."'";
$requete="SELECT DISTINCT nom, code FROM cel_zone_geo WHERE nom = ".$this->proteger($nom_commune)." AND code LIKE ".$this->proteger($code_commune.'%');
}
else { // Code insee seul
preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
if (isset($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)."'";
$requete="SELECT DISTINCT nom, code FROM cel_zones_geo WHERE code = ".$this->proteger($code_insee_commune);
}
else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
// Commune
426,47 → 405,44
$nom_commune=cp1252_to_utf8($nom_commune);
$nom_commune=remove_accent($nom_commune);
$nom_commune=preg_replace("/ /","%",$nom_commune);
$query="SELECT DISTINCT name, code FROM locations WHERE name like '".$DB->escapeSimple($nom_commune)."'";
$requete="SELECT DISTINCT nom, code FROM cel_zones_geo WHERE nom like ".$this->proteger($nom_commune.'%');
}
}
}
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
$resultat_commune = $this->requeter($requete);
$commune_code = $res->fetchrow(DB_FETCHMODE_ASSOC);
// cas de la commune introuvable dans le référentiel
if(!is_array($commune_code) || count($commune_code) == 0) {
$commune_code['name'] = fix_latin($identifiant_commune);
$commune_code['code'] = '000null';
if(!is_array($resultat_commune) || count($resultat_commune) == 0) {
$resultat_commune['nom'] = fix_latin($identifiant_commune);
$resultat_commune['code'] = 'NULL';
} else {
$resultat_commune = $resultat_commune[0];
}
return $commune_code;
return $resultat_commune;
}
 
function traiterLieudit($lieudit) { // texte libre
 
//echo "traitement lieudit";
function traiterLieudit($lieudit) {
// texte libre
$lieudit=fix_latin($lieudit);
return trim($lieudit);
}
 
function traiterStation($station) { // texte libre
// echo "traitement station";
function traiterStation($station) {
// texte libre
$station=fix_latin($station);
return trim($station);
}
 
function traiterMilieu($milieu) { // texte libre
// echo "traitement milieu";
function traiterMilieu($milieu) {
// texte libre
$milieu=fix_latin($milieu);
return trim($milieu);
}
 
function traiterDepartement($departement) { // texte libre
 
function traiterDepartement($departement) {
// texte libre
if(is_numeric($departement) && strlen($departement) == 5) {
$departement = substr($departement,0,2);
}
482,400 → 458,53
return utf8_encode(trim($departement));
}
 
function traiterLatitude($latitude) { // verifier formal decimal + limite france ? TODO
// echo "traitement latitude";
function traiterLatitude($latitude) {
// verifier formal decimal + limite france ? TODO
return trim($latitude);
}
 
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
// echo "traitement longitude";
function traiterLongitude($longitude) {
// verifier format decimal + limite france ? TODO
return trim($longitude);
}
 
function traiterNotes($notes) { // texte libre
// echo "traitement notes";
function traiterNotes($notes) {
// texte libre
$notes=remove_accent($notes);
return utf8_encode(trim($notes));
}
 
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
// echo "traitement dateobs";
return trim($dateobs);
function traiterDateObs($dateobs) {
// verifier jj/mm/aaaa sinon date vide TODO
$date = trim($dateobs);
if(!preg_match("#[0-9]{2}/[0-9]{2}/([0-9]{4}|[0-9]{2})#", $date)) {
$date = '00/00/0000';
}
return $date;
}
 
function traiterTransmettre($transmettre) {
$transmission = '0';
if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
$transmission = '1';
}
return $transmission;
}
 
function traiterEspece($identifiant_espece) { // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999) ou code taxonomique (format BDNFFnt999999)
 
// echo "traitement espece";
$identifiant_espece=trim($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 (isset($elements[1])) { // Numero nomenclatural
 
 
// Recherche du nom associe
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
$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 ";
 
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$elements[1]);
 
}
 
else { // Numero taxonomique ou nom scientifique
preg_match('/BDNFFnt([0-9][0-9]*)/',$identifiant_espece,$elements);
if (isset($elements[1])) { // Numero taxonomique
$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_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 esn_id_taxon = '".$elements[1]. "'".
" AND esn_id_version_projet_taxon = 25 ".
" AND esn_ce_statut=3 ".
" AND en_id_nom = esn_id_nom" .
" 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 ";
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$row['en_id_nom']);
 
 
}
 
else { // Nom scientifique
$nameparser=new NameParser();
$nom_latin_decoupe=$nameparser->parse($identifiant_espece);
 
$DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
 
// requete sous espece (on privilegie les noms retenu cf tri par esn_ce_statut)
if (isset($nom_latin_decoupe['infra']) && $nom_latin_decoupe['infra']!="") {
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
" AND enrg_abreviation_rang = '".$DB->escapeSimple($nom_latin_decoupe['infra_type'])."' " .
" AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['infra'])."' " .
" AND esn_id_nom= en_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
" ORDER BY esn_ce_statut ".
" LIMIT 1";
}
else { // espece (on privilegie les noms retenu cf tri par esn_ce_statut)
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
" AND enrg_abreviation_rang = 'sp.' " .
" AND esn_id_nom= en_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
" ORDER BY esn_ce_statut ".
" LIMIT 1";
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
$id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
 
// Recherche du nom associe
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
$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= '".$id_nom['en_id_nom']. "'".
" 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 ";
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
if ($res->numRows() > 0 ) {
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
}
else {
return array("nom_sel"=>$identifiant_espece);
}
 
 
}
}
 
}
 
 
 
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
 
$DB=$this->connectDB($this->config,'cel_db');
 
$liste_images = explode("/",$images) ;
 
$row =array();
foreach($liste_images as $image) {
 
$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'";
 
$res =& $DB->query($query);
$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
die($res->getMessage());
$requete = "SELECT * FROM cel_images WHERE ce_utilisateur = ".$this->proteger($utilisateur)." AND nom_original= ".$this->proteger($image);
$ligne = $this->requeter($requete);
if(is_array($ligne) && !empty($ligne)) {
$row[] = $ligne[0];
}
 
}
return $row;
 
 
}
 
function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ...
 
$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, b.esn_id_taxon, b.esn_id_nom" .
" 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 a, eflore_selection_nom b".
" WHERE a.esn_id_nom= ".$numNom.
" AND a.esn_id_version_projet_taxon = 25 ".
" AND a.esn_id_taxon=b.esn_id_taxon ".
" AND b.esn_ce_statut=3 ".
" AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" .
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = b.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 ";
 
 
$res =& $DB->query($query);
 
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
// Nom retenu, Num Nomenclatural nom retenu, Num Taxon,
 
$value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>"");
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$fam=$this->rechercherFamille($row['esn_id_taxon'],$DB);
 
// Recherche Famille
while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
$fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB);
}
if ($fam['en_ce_rang']==120) {
$famille=$fam['en_nom_supra_generique'];
}
else {
$famille="Famille inconnue";
}
 
$value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
}
 
return $value;
 
 
 
}
 
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 rechercherFamille($taxon,&$DB) {
 
$row=array();
 
$query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
" FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ".
" WHERE etr_id_taxon_1 = ".$taxon.
" AND etr_id_version_projet_taxon_1 = 25 ".
" AND etr_id_categorie_taxon = 3 ".
" AND etr_id_valeur_taxon = 3 ".
" AND esn_id_taxon = etr_id_taxon_2 ".
" AND esn_ce_statut = 3 ".
" AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ".
" AND en_id_nom = esn_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom ";
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
return $row;
}
else {
$row['en_ce_rang']='fin';
return $row;
}
 
}
 
 
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 ;
}
 
 
 
 
}
 
function init_byte_map(){
$byte_map = array();
for($x=128;$x<256;++$x){
949,9 → 578,7
return $outstr;
}
 
 
function remove_accent($str)
{
function remove_accent($str) {
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
983,7 → 610,6
return str_replace($a, $b, $str);
}
 
 
function cp1252_to_utf8($str) {
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
"\xc2\x82" => "\xe2\x80\x9a",
1016,12 → 642,4
);
return strtr ( utf8_encode ( $str ), $cp1252_map );
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
*
*
*/
 
 
?>
?>