Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 539 → Rev 540

/trunk/jrest/services/InventoryImportExcel.php
5,6 → 5,7
 
 
// TODO : traiter image multilignes
// TODO : doublons
 
/*
 
33,31 → 34,32
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 "/"
define('DEPARTEMENT','departement'); // Texte libre
 
 
// Resultat de l'analyse d'une ligne
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');
// Parser de Nom
include('NameParser.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 $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,IMAGE );
 
 
// Fichier configuration
var $config;
 
// Encapsulation classe lecture fichier excel
 
var $extendExcelReader;
 
// Dernier numero d'ordre utilise
var $dernier_ordre=1;
 
/**
Constructeur
**/
68,6 → 70,10
 
$this->extendExcelReader = new ExcelReader();
$this->extendExcelReader->initExcelReader();
 
/* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
 
 
}
 
/**
78,17 → 84,15
 
$pairs['utilisateur']=$_POST['identifiant'];
session_start();
$this->controleUtilisateur($pairs['utilisateur']);
 
session_start();
$this->controleUtilisateur($pairs['utilisateur']);
 
foreach($_FILES as $file) { // C'est le plus simple
$infos_fichier = $file ;
}
 
foreach($_FILES as $file) { // C'est le plus simple
 
$infos_fichier = $file ;
}
 
 
// Chargement tableau en memoire
 
$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
101,58 → 105,81
print "Tableau vide";
exit;
}
for($row=1;$row<=$rowcount;$row++)
for($col=1;$col<=$colcount;$col++)
$arr[$col][$row] = $data->val($row,$col,0);
 
// Chargement tableau
for($row=1;$row<=$rowcount;$row++)
for($col=1;$col<=$colcount;$col++)
$arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
 
 
// 1 : Traitement colonnes
// 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]);
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;
for($col=1;$col<=$colcount;$col++) {
$colonne=strtolower($arr[$col][1]);
$colonne=trim($colonne);
$colonne=cp1252_to_utf8($colonne);
$colonne=remove_accent($colonne);
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter
case COMMUNE:
case LIEUDIT:
case STATION:
case MILIEU:
case DEPARTEMENT:
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]);
*/
 
// print_r($line[COMMUNE]);
// print_r($line[LIEUDIT]);
// print_r($line[STATION]);
// print_r($line[MILIEU]);
// print_r($line[DEPARTEMENT]);
// 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
 
$cpt_obs=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'])."' ";
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
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 lignes vides du debut et les lignes contenant des information sur image uniquement
// 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";
163,7 → 190,7
$i++;
}
while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur']);
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur'],$DB);
if ($ordre>0) {
$cpt_obs++; // Compteur d'observations crees
}
182,7 → 209,8
}
print $cpt_obs;
//print $cpt_obs ." nouvelle(s) observation(s) !";
print $cpt_obs ;
 
}
 
215,7 → 243,7
 
}
 
function traiterLigne($line,$i,$utilisateur) { // Controle donnee et insertion
function traiterLigne($line,$i,$utilisateur,$DB) { // Controle donnee et insertion
$info_image=array();
foreach ($this->format_observation as $colonne) {
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
232,6 → 260,9
case MILIEU:
$info_milieu=$this->traiterMilieu($line[MILIEU][$i]);
break;
case DEPARTEMENT:
$info_commune['code']=$this->traiterDepartement($line[DEPARTEMENT][$i]);
break;
case LATITUDE:
$info_latitude=$this->traiterLatitude($line[LATITUDE][$i]);
break;
246,16 → 277,14
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']);
$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['famille']=$complement['Famille'];
}
 
 
break;
if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') {
$complement=$this->rechercherInformationsComplementaires($info_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['famille']=$complement['Famille'];
}
break;
case IMAGE:
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
break;
276,6 → 305,9
case MILIEU:
$info_milieu="000null";
break;
case DEPARTEMENT:
$info_commune['code']="000null";
break;
case LATITUDE:
$info_latitude="000null";
break;
288,45 → 320,30
}
}
 
// Dernier numero d'ordre utilise :
$this->dernier_ordre++;
 
$DB=$this->connectDB($this->config,'database_cel'); // TODO / a garder en memoire pour eviter appels mutliples
$query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($utilisateur)."' ";
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
$ordre=1;
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$ordre=$row['ordre']+1;
}
 
list($jour,$mois,$annee)=split("/",$info_dateobs);
$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, date_creation,date_modification,coord_x,coord_y) " .
" VALUES('".$DB->escapeSimple($utilisateur)."','".
$DB->escapeSimple($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)."',".
"now() , now(),'".
$DB->escapeSimple($info_latitude)."','".
$DB->escapeSimple($info_longitude)."')";
// print $query;
$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, 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)."',".
"now() , now(),'".
$DB->escapeSimple($info_latitude)."','".
$DB->escapeSimple($info_longitude)."')";
// print "\n";
 
 
355,7 → 372,7
 
 
 
return $ordre;
return $this->dernier_ordre;
 
 
}
368,16 → 385,15
function traiterCommune($identifiant_commune) { // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
 
 
$identifiant_commune=trim($identifiant_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);
preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
 
$DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
 
if ($elements[1]) { // departement present
if ($elements[1]) { // commune + departement : montpellier (34)
$nom_commune=$elements[1];
$code_commune=$elements[2];
 
384,19 → 400,20
$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)."'";
}
}
else { // Code insee seul
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 { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
// Commune
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)."'";
}
}
}
 
417,184 → 434,212
 
//echo "traitement lieudit";
 
return utf8_encode(ltrim($lieudit));
return utf8_encode(trim($lieudit));
}
 
function traiterStation($station) { // texte libre
// echo "traitement station";
return utf8_encode(ltrim($station));
return utf8_encode(trim($station));
}
 
function traiterMilieu($milieu) { // texte libre
// echo "traitement milieu";
return utf8_encode(ltrim($milieu));
return utf8_encode(trim($milieu));
}
 
function traiterDepartement($departement) { // texte libre
// echo "traitement milieu";
return utf8_encode(trim($departement));
}
 
function traiterLatitude($latitude) { // verifier formal decimal + limite france ? TODO
// echo "traitement latitude";
return ltrim($latitude);
return trim($latitude);
}
 
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
// echo "traitement longitude";
return ltrim($longitude);
return trim($longitude);
}
 
function traiterNotes($notes) { // texte libre
// echo "traitement notes";
return utf8_encode(ltrim($notes));
return utf8_encode(trim($notes));
}
 
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
// echo "traitement dateobs";
return ltrim($dateobs);
return trim($dateobs);
}
 
function traiterEspece($identifiant_espece) { // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999)
function traiterEspece($identifiant_espece) { // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999) ou code taxonomique (format BDNFFnt999999)
 
// echo "traitement espece";
$identifiant_espece=ltrim($identifiant_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);
 
preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
if ($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);
// 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]);
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 { // Nom scientifique
 
 
$decoupageNomLatin=new DecoupageNomLatin();
$nom_latin_decoupe=$decoupageNomLatin->decouper($identifiant_espece);
else { // Numero taxonomique ou nom scientifique
preg_match('/BDNFFnt([0-9][0-9]*)/',$identifiant_espece,$elements);
/*
if ($elements[1]) { // Numero taxonomique
$DB=$this->connectDB($this->config);
 
[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
$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);
 
[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
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']);
 
 
$DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
}
 
$query="SELECT DISTINCT en_id_nom" .
" FROM eflore_nom, eflore_nom_rang " .
" 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'])."' " ;
if (isset($nom_latin_decoupe['nom_infrasp']) && $nom_latin_decoupe['nom_infrasp']!="") {
$query.=" AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['nom_infrasp'])."' " ;
}
$query.=" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['nom_sp'])."' AND en_ce_rang = enrg_id_rang " .
" LIMIT 1";
else { // Nom scientifique
$nameparser=new NameParser();
$nom_latin_decoupe=$nameparser->parse($identifiant_espece);
 
//print_r($nom_latin_decoupe);
$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());
}
 
$res =& $DB->query($query);
$id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
die($res->getMessage());
}
// 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);
 
$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);
}
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
 
 
 
}
}
 
}
626,72 → 671,69
 
}
 
function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ...
 
// utilitaire : FIXME mutualiser avec autres scripts
 
function rechercherInformationsComplementaires($numNom) {
 
$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 ";
" 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);
$res =& $DB->query($query);
 
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
if (DB::isError($res)) {
die($res->getMessage());
}
 
// Nom retenu, Num Nomen nom retenu, Num Taxon,
// Famille
// 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);
while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
$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) {
}
if ($fam['en_ce_rang']==120) {
$famille=$fam['en_nom_supra_generique'];
}
else {
}
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);
}
$value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
 
return $value;
 
}
 
return $value;
 
 
 
}
 
function formaterNom($rawnom) {
727,9 → 769,9
 
function rechercherFamille($taxon,&$DB) {
 
$row=array();
$row=array();
 
$query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
$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 ".
740,14 → 782,14
" 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);
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
if (DB::isError($res)) {
die($res->getMessage());
}
 
if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
return $row;
if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
return $row;
}
else {
$row['en_ce_rang']='fin';
758,34 → 800,35
 
 
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'];
}
$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($auteur_modif)) {
$auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
} elseif (!empty($auteur_basio)) {
$auteurs = ' '.$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'];
}
 
return $auteurs ;
if (!empty($auteur_modif)) {
$auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
} elseif (!empty($auteur_basio)) {
$auteurs = ' '.$auteur_basio;
}
 
return $auteurs ;
}
 
 
794,7 → 837,73
}
 
 
function remove_accent($str)
{
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
$b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
return str_replace($a, $b, $str);
}
 
 
function cp1252_to_utf8($str) {
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
"\xc2\x82" => "\xe2\x80\x9a",
"\xc2\x83" => "\xc6\x92",
"\xc2\x84" => "\xe2\x80\x9e",
"\xc2\x85" => "\xe2\x80\xa6",
"\xc2\x86" => "\xe2\x80\xa0",
"\xc2\x87" => "\xe2\x80\xa1",
"\xc2\x88" => "\xcb\x86",
"\xc2\x89" => "\xe2\x80\xb0",
"\xc2\x8a" => "\xc5\xa0",
"\xc2\x8b" => "\xe2\x80\xb9",
"\xc2\x8c" => "\xc5\x92",
"\xc2\x8e" => "\xc5\xbd",
"\xc2\x91" => "\xe2\x80\x98",
"\xc2\x92" => "\xe2\x80\x99",
"\xc2\x93" => "\xe2\x80\x9c",
"\xc2\x94" => "\xe2\x80\x9d",
"\xc2\x95" => "\xe2\x80\xa2",
"\xc2\x96" => "\xe2\x80\x93",
"\xc2\x97" => "\xe2\x80\x94",
 
"\xc2\x98" => "\xcb\x9c",
"\xc2\x99" => "\xe2\x84\xa2",
"\xc2\x9a" => "\xc5\xa1",
"\xc2\x9b" => "\xe2\x80\xba",
"\xc2\x9c" => "\xc5\x93",
"\xc2\x9e" => "\xc5\xbe",
"\xc2\x9f" => "\xc5\xb8"
);
return strtr ( utf8_encode ( $str ), $cp1252_map );
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
*