Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2151 → Rev 2152

/trunk/jrest/jrest.ini.php.defaut
37,7 → 37,6
; URL des services web du CEL sous forme de template à utiliser avec sprintf
baseURLServicesAnnuaireTpl = "http://www.tela-botanica.org/service:annuaire:%s"
 
; Default
[eflore]
phptype = mysqli
username =
53,8 → 52,14
url_service_photoflora = "http://photoflora.free.fr/eflore-photoflora/services/index.php/0.1/projets/photoflora/images"
url_service_nom_attribution = "http://localhost/service:eflore:0.1/{referentiel}/noms-vernaculaires/attributions?masque.nt={valeur}&masque.lg={langue}"
 
[referentiels]
; Nom des tables des référentiels avec leur version actuellement utilisé pour récupérer les infos des noms
; ATTENTION : Bien préciser le nom de la base devant le nom de la table !
bdtfx = "tb_eflore.bdtfx_v2_00"
bdtxa = "tb_eflore.bdtxa_v1_01"
isfan = "tb_eflore.isfan_v2013"
bdtao = "tb_eflore.bdtao_v1_00"
 
; Images
[cel]
chemin_images = /opt/lampp/htdocs/Documents/images_serveur
chemin_export = /opt/lampp/htdocs/Documents/export_images
86,7 → 91,6
 
commande_script_images = "/usr/local/php/5.5/bin/php /home/apitela/www/scripts/cel/cli.php generationimages -a genererMinaturesPourId -id %s &";
 
; Stockage
[database_cel]
phptype = mysqli
username =
107,14 → 111,12
ann_pwd = U_PASSWD
pass_crypt_funct = md5
 
; LOGS
[log]
cheminlog = "/home/Logs/"
timezone = "Europe/Paris"
taillemax = 100000
 
; ADMIN
[jrest_admin]
admin = aurelien@tela-botanica.org,david.delon@clapas.net,jpm@tela-botanica.org,marie@tela-botanica.org
ip_autorisees = "127.0.0.1,193.54.123.216,193.54.123.169"
;*/?>
;*/?>
/trunk/jrest/services/CelImage.php
96,28 → 96,20
*
*/
public function deleteElement($uid){
if ($this->controlerAccessibiliteWs()) {
if ($this->controleAppelIpAutorisee()) {
// Initialisation des paramètres
$idImage = isset($uid[0]) ? $uid[0] : '';
$this->controlerAccessibiliteWs();
$this->controleAppelIpAutorisee();
 
// Vérifier les paramêtres
$this->verifierIdentifiantImage($idImage);
$idsImages = explode(',', $idImage);
$idImage = isset($uid[0]) ? $uid[0] : '';
$this->verifierIdentifiantImage($idImage);
$idsImages = explode(',', $idImage);
 
$gestionnaireImage = new GestionImage($this->config);
$suppressionImage = $gestionnaireImage->supprimerImage($idsImages);
$gestionnaireImage = new GestionImage($this->config);
$suppressionImage = $gestionnaireImage->supprimerImage($idsImages);
 
if ($suppressionImage) {
$this->envoyer('OK');
} else {
$this->envoyer("Au moins une image « $idImage » n'a pu être supprimé.");
}
} else {
header('Status: 401 Unauthorized');
$message = "Accès interdit. \n"."Vous n'êtes pas autorisé à accéder à ce service depuis '{$_SERVER['REMOTE_ADDR']}' !\n";
die($message);
}
if ($suppressionImage) {
$this->envoyer('OK');
} else {
$this->envoyer("Au moins une image « $idImage » n'a pu être supprimé.");
}
}
 
124,9 → 116,8
private function verifierIdentifiantImage($chaine) {
$ok = preg_match('/^(?:[0-9]+,)*[0-9]+$/', $chaine);
if ($ok == false) {
header("HTTP/1.0 412 Precondition Failed"); // TODO: PHP: 5.4 http_response_code(412);
header("Content-Type: text/plain; charset=utf-8");
die("Indiquer un ou plusieurs identifiants d'image séparés par des virgules.");
$msg = "Indiquer un ou plusieurs identifiants d'image séparés par des virgules.";
$this->envoyerMessageErreur(412, $msg);// Precondition Failed
}
return $ok;
}
/trunk/jrest/services/CelObs.php
23,8 → 23,17
parent::__construct($config);
$this->rechercheObs = new RechercheObservation($config);
$this->chpsEtendus = new GestionChampsEtendus($config, 'obs');
 
$this->chargerNomsTablesReferentiels();
}
 
private function chargerNomsTablesReferentiels() {
// Créé des attributs avec le code du référentiel : bdtfx, bdtxa, bdtao, isfan
foreach ( $this->config['referentiels'] as $referentiel => $table) {
$this->$referentiel = $table;
}
}
 
function getElement($ressources){
$retour = false;
$idObs = $ressources[0];
114,80 → 123,30
$idObs = isset($ressources[0]) ? $ressources[0] : '';
$this->verifierIdentifiantObs($idObs);
 
$idObs = explode(',', $idObs);
// Seulement la dépublication
if (isset($this->donnees['transmission']) && count($this->donnees) == 1) {
$gestionnaireObs = new GestionObservation($this->config);
$detransmissionObs = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
if ($detransmissionObs === false) {
$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
$this->envoyerMessageErreur(304, $msg);
if (count($this->donnees) == 1) {
$donneesObligatoires = array('transmission');
if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
$this->depublierObs($idObs);
}
} if (count($this->donnees) == 3) {
$donneesObligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');
} else if (count($this->donnees) == 4) {
$donneesObligatoires = array('id_observation', 'nom_sel_nn', 'nom_referentiel', 'id_utilisateur');
if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
$this->modifierObservationDepuisDEL($idObs);
$this->accepterPropositionDEL($idObs);
}
} else {
$msg = "La modification complète d'une observation n'est pas implémentée. \n".
"Uniquement la dépublication pour l'instant fonctionne";
$msg = "La modification complète d'une observation n'est pas implémentée.";
$this->envoyerMessageErreur(501, $msg);
}
 
$this->envoyer('OK');
} else {
$msg = "Accès interdit. \n"."Vous n'êtes pas autorisé à accéder à ce service depuis '{$_SERVER['REMOTE_ADDR']}' !\n";
$this->envoyerMessageErreur(401, $msg);
$this->envoyer('ok');
}
}
}
 
private function modifierObservationDepuisDEL($idObs) {
$gestion_observation = new GestionObservation($this->config);
$pairs = array_map('trim', $this->donnees);
$utilisateur = $pairs['ce_utilisateur'];
unset($pairs['ce_utilisateur'], $pairs['id_observation']);
 
// mise à jour des mots-clefs suite à une validation:
// typiquement, DEL modifierObservationParDetermination()
// nous enverra obsKeywordDelete=aDeterminer en plus de certitude=Certaine
$obsKeywordDelete = @trim($pairs['obsKeywordDelete']);
// $imgKeywordDelete = @trim($pairs['imgKeywordDelete']);
unset($pairs['obsKeywordDelete']); // , $pairs['imgKeywordDelete']);
 
// complete les données de la proposition validée car:
// 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
// 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
// 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
$more_data = $this->NN2(@$pairs['nom_sel_nn'], @$pairs['nom_referentiel']);
if($more_data) $pairs = array_merge($pairs, $more_data);
 
$modification = $gestion_observation->modifierObservationPublique($utilisateur, $idObs, $pairs);
if($modification) {
$gestion_mots_cles = new GestionMotsClesChemin($this->config, 'obs');
// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
$supp_liaison_mot_cle = $gestion_mots_cles->supprimerLiaisonPourMotCleEtIdElementLie($obsKeywordDelete, $idObs, $utilisateur);
// TODO : quel impact de la valeur de retour ?
header("Content-Type: text/plain; charset=utf-8");
die("OK"); // attention, compatibilité avec ValiderDetermination.php de DEL !
}
// cf TODO: n'arrivera pas tant que l'UPDATE ajoutera systématiquement date_modification = now()
elseif($modification === 0) {
header("HTTP/1.0 304 Not Modified"); // XXX: PHP 5.4 // http_response_code(304); // Not Modified
header("Content-Type: text/plain; charset=utf-8");
die("Not Modified");
}
else {
header("HTTP/1.0 500 Internal Server Error"); // XXX: PHP: 5.4 // http_response_code(500); // Internal Server Error
header("Content-Type: text/plain; charset=utf-8");
die("Impossible de modifier l'observation associée à cet identifiant " . mysql_error());
}
}
 
private function verifierIdentifiantObs($chaine) {
$ok = preg_match('/^(?:[0-9]+,)*[0-9]+$/', $chaine);
$ok = preg_match('/^[0-9]+$/', $chaine);
if ($ok == false) {
$msg = "Indiquer un ou plusieurs identifiants d'obs séparés par des virgules.";
$msg = "Indiquer un seul identifiant numérique d'observation.";
$this->envoyerMessageErreur(412, $msg);
}
return $ok;
200,51 → 159,125
$this->envoyerMessageErreur(412, $msg);
}
}
return true;
}
 
private function NN2($id, $ref) {
if(!$db || !$id || !$ref) return FALSE;
switch($ref) {
case "bdtfx":
return $this->bdd->query(sprintf(, self::db, self::bdtfx, self::db, self::bdtfx, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
case "bdtxa":
return $this->bdd->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel". // subtilité: "num_tax"
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtxa, self::db, self::bdtxa, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
case "isfan":
return $this->bdd->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::isfan, self::db, self::isfan, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
case "bdtao":
return $this->bdd->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtao, self::db, self::bdtao, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
private function depublierObs($idObs) {
$gestionnaireObs = new GestionObservation($this->config);
$depublication = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
if ($depublication === false) {
$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
$this->envoyerMessageErreur(304, $msg);
}
return FALSE;
}
 
const db = 'tb_eflore';
const bdtfx = 'bdtfx_v2_00';
const bdtxa = 'bdtxa_v1_01';
const isfan = 'isfan_v2013';
const bdtao = 'bdtao_v1_00';
/**
* Modifie une observation aveec les infos d'une proposition :
* Nous complétons les données de la proposition acceptée ici car:
* 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
* 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
* 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
*/
private function accepterPropositionDEL($idObs) {
$gestion_observation = new GestionObservation($this->config);
$donnees = array_map('trim', $this->donnees);
$idUtilisateur = $donnees['id_utilisateur'];
$donneesAModifier = array(
'certitude' => 'Certaine',
'nom_referentiel' => $donnees['nom_referentiel'],
);
// TODO : la récupération des infos du nom est aussi effectué par la suite voir ce qu'il faut garder
$infosNoms = $this->getNomInfos($donnees['nom_sel_nn'], $donnees['nom_referentiel']);
if ($infosNoms) {
$donneesAModifier = array_merge($donneesAModifier, $infosNoms);
}
 
$modification = $gestion_observation->modifierObservationPublique($idObs, $donneesAModifier);
 
if ($modification) {
// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
$gestionMotsClesObs = new GestionMotsClesChemin($this->config, 'obs');
$supp_liaison_mot_cle = $gestionMotsClesObs->supprimerLiaisonPourMotCleEtIdElementLie('aDeterminer', $idObs, $idUtilisateur);
} else {
$msg = "Impossible de modifier l'observation associée à cet identifiant. Erreur mysql : " . mysql_error();
$this->envoyerMessageErreur(500, $msg);// Internal Server Error
}
}
 
// TODO : cette méthode et celles qui en dépendent sont peut être inutiles au vue de la méthode traiterEspece() de GestionObservation
private function getNomInfos($id_nom, $code_referentiel) {
$retour = false;
if ($id_nom && $code_referentiel) {
switch ($code_referentiel) {
case 'bdtfx' :
$retour = $this->getInfosBdtfx($id_nom);
break;
case 'bdtxa' :
$retour = $this->getInfosBdtxa($id_nom);
break;
case 'isfan' :
$retour = $this->getInfosIsfan($id_nom);
break;
case 'bdtao' :
$retour = $this->getInfosBdtao($id_nom);
break;
}
}
return $retour;
}
 
private function getInfosBdtfx($id_nom) {
$idNomP = $this->bdd->proteger($id_nom);
$idNomP = CEL::db()->proteger($id_nom);
$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
" CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
" CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
"FROM bdtfx_v2_00 AS o ".
" LEFT JOIN bdtfx_v2_00 AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
"FROM {$this->bdtfx} AS o ".
" LEFT JOIN {$this->bdtfx} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
"WHERE o.num_nom = $idNomP ".
' -- '.__FILE__.' : '.__LINE__;
$resultat = Cel::db()->executerRequete($requete, Cel::db::SQL_RETOUR_LIGNE);
$resultat = Cel::db()->requeterLigne($requete);
return $resultat;
}
 
private function getInfosBdtxa($id_nom) {
$idNomP = CEL::db()->proteger($id_nom);
// Champ "num_tax" au lieu de "num_taxonomique"
$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, o.famille, ".
" CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
" CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
"FROM {$this->bdtxa} AS o ".
" LEFT JOIN {$this->bdtxa} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
"WHERE o.num_nom = $idNomP ".
' -- '.__FILE__.' : '.__LINE__;
$resultat = Cel::db()->requeterLigne($requete);
return $resultat;
}
 
private function getInfosIsfan($id_nom) {
$idNomP = CEL::db()->proteger($id_nom);
// Champ "num_tax" au lieu de "num_taxonomique"
$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
" CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
" CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
"FROM {$this->isfan} AS o ".
" LEFT JOIN {$this->isfan} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
"WHERE o.num_nom = $idNomP ".
' -- '.__FILE__.' : '.__LINE__;
$resultat = Cel::db()->requeterLigne($requete);
return $resultat;
}
 
private function getInfosBdtao($id_nom) {
$idNomP = CEL::db()->proteger($id_nom);
// Champ "num_tax" au lieu de "num_taxonomique"
$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
" CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
" CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
"FROM {$this->bdtao} AS o ".
" LEFT JOIN {$this->bdtao} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
"WHERE o.num_nom = $idNomP ".
' -- '.__FILE__.' : '.__LINE__;
$resultat = Cel::db()->requeterLigne($requete);
return $resultat;
}
}
/trunk/jrest/lib/RechercheInfosTaxonBeta.php
13,8 → 13,8
*/
 
/**
*
* La classe appelle les web service d'eflore pour éviter que le code client
*
* La classe appelle les web service d'eflore pour éviter que le code client
* ne soit dépendant de la version d'eflore
*/
class RechercheInfosTaxonBeta extends Cel {
24,7 → 24,7
private $url_service_nom = null;
private $url_service_taxon = null;
private $url_service_chorologie = null;
 
private $masque_recherche = null;
private $code_referentiel = 'bdtfx';
 
45,7 → 45,7
$this->code_referentiel = $code_referentiel;
$this->formaterUrlsServices($this->config);
}
 
private function formaterUrlsServices($config) {
$this->url_service_nom = str_replace('{referentiel}', $this->code_referentiel ,$config['eflore']['url_service_nom']);
$this->url_service_taxon = str_replace('{referentiel}', $this->code_referentiel ,$config['eflore']['url_service_taxon']);
52,9 → 52,9
$this->url_service_chorologie_obs = $config['eflore']['url_service_chorologie_obs'];
$this->config = $config;
}
 
public function rechercherGenreEspeceSurPrefixe($genre = null, $espece = null) {
$liste_genre_espece = array();
$liste_genre_espece = array();
$this->masque_recherche = trim(trim($genre).' '.trim($espece,' *'));
$masque = urlencode($this->masque_recherche);
if(self::DEBUG) error_log("CEL fetch: " . $this->url_service_nom.'?masque='.$masque.'&recherche=etendue&retour.format=min&navigation.limite=50&ns.structure=au');
61,7 → 61,7
$urlService = $this->url_service_nom.'?masque='.$masque.'&recherche=etendue&retour.format=min&navigation.limite=50&ns.structure=au';
$requete = @file_get_contents($urlService);
if($requete != '') {
$requete = json_decode($requete);
$requete = json_decode($requete);
if(is_object($requete) && isset($requete->resultat)) {
foreach ($requete->resultat as $id => $res) {
$retenu = ($res->retenu == "true") ? '3' : '4';
68,11 → 68,11
$liste_genre_espece[] = array($res->nom_sci_complet, $id, $retenu);
}
}
usort($liste_genre_espece, array($this, 'comparerParRetenuPuisNom'));
usort($liste_genre_espece, array($this, 'comparerParRetenuPuisNom'));
}
return $liste_genre_espece;
}
 
function comparerParRetenuPuisNom($a, $b) {
if($a[2] == 3 && $b[2] != 3) {
return -1;
82,7 → 82,7
return levenshtein($this->masque_recherche, $a[0]) >= levenshtein($this->masque_recherche, $b[0]);
}
}
 
public function effectuerRequeteInfosComplementairesEtFormaterNom($numNom) {
$resultat_infos_complementaires = (array)$this->effectuerRequeteInfosComplementairesSurNumNom($numNom);
$retour_infos_complementaires = array();
89,10 → 89,10
if (isset($resultat_infos_complementaires['nom_retenu_complet']) && $resultat_infos_complementaires['nom_retenu_complet']) {
$retour_infos_complementaires=array((self::supprimerBiblio($resultat_infos_complementaires['nom_retenu_complet'])));
}
 
return $retour_infos_complementaires;
}
 
public function rechercherInformationsComplementairesSurNom($nom_saisi) {
$nom_saisi = trim($nom_saisi);
// Essai de recherche sur le nom saisi tel quel
111,10 → 111,10
 
// dernière tentative: concaténation (nom_sci,auteur) (= nom-retenu généré utilisé comme nom_sci)
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, 'concat');
 
return $liste_genre_espece;
}
 
private function effectuerRequeteUrlRecherche($nom_saisi, $mode = 'stricte') {
$url = sprintf(
'%1$s?masque=%2$s&recherche=%3$s&ns.format=txt&retour.champs=%4$s&navigation.limite=1',
134,7 → 134,7
$resultat = (array)$res->resultat;
return array_pop($resultat);
}
 
static function supprimerAuteur($nom_saisi) {
// TODO: gérer les hybrides
if(self::estUnHybride($nom_saisi) || self::estUneFormuleHybridite($nom_saisi)) {
143,7 → 143,7
$nom_saisi_sans_auteur = implode(' ',array_slice($nom_decoupe, 0, end($derniere_position_hybride) + 2));
} else {
/* Attention le parseur de nom n'est pas fiable à 100%
mais ça marche dans la plupart des cas
mais ça marche dans la plupart des cas
à part les formules d'hybridité saisies avec un auteur */
$nameparser = new NameParser();
$auteur = $nameparser->parse_auth($nom_saisi);
152,15 → 152,15
 
return trim($nom_saisi_sans_auteur);
}
 
static function estUneFormuleHybridite($nom_saisi) {
return strpos($nom_saisi,' x ') !== false;
}
 
static function estUnHybride($nom_saisi) {
return strpos($nom_saisi,'x ') === 0;
}
 
public function effectuerRequeteInfosComplementairesSurNumNom($num_nom, $ref = NULL) {
if($ref && isset($this->config['eflore']['api_host'])) {
if(self::DEBUG) error_log("CEL fetch: " .$this->config['eflore']['api_host'] . '/');
183,7 → 183,7
static function supprimerBiblio($nom) {
return trim(preg_replace('/ \[.*\]/','',$nom));
}
 
public function rechercherNumTaxSurNumNom($num_nom) {
$nt = null;
$url = $this->url_service_nom."/".$num_nom.'?retour.champs=num_taxonomique';
193,10 → 193,10
$infos = json_decode($resultat);
$nt = $infos->num_taxonomique;
}
 
return $nt;
}
 
public function taxonEstPresentDansDepartement($num_taxon,$code_departement) {
$presence_taxon = false;
$url = $this->url_service_chorologie_obs.'?masque.departement='.$code_departement.'&masque.determination.nt='.$num_taxon.'&navigation.limite=1';
210,9 → 210,9
}
return $presence_taxon;
}
/* texte libre, nom scientifique,
ou code nomenclatural (format bdtfx:nn:999999)
 
/* texte libre, nom scientifique,
ou code nomenclatural (format bdtfx:nn:999999)
ou code taxonomique (format bdtfx:nt:999999)
TODO: voir ce qu'on fait pour l'import de différent référentiels */
function rechercherInfosSurTexteCodeOuNumTax($identifiant_espece) {
245,7 → 245,7
// Nom scientifique
return $this->rechercherInformationsComplementairesSurNom($identifiant_espece);
}
 
public function rechercherSynonymesSurNumNom($num_nom) {
$retour = array();
if(self::DEBUG) error_log("CEL fetch: " . $this->url_service_nom.'/'.$num_nom.'/relations/synonymie/?retour.format=min');
258,4 → 258,4
}
return $retour;
}
}
}
/trunk/jrest/lib/Cel.php
222,6 → 222,7
} else if (!is_null($mime) && is_null($encodage)) {
header("Content-Type: $mime");
}
http_response_code(200);// OK
print $contenu;
}
 
/trunk/jrest/lib/GestionObservation.php
238,38 → 238,31
*
* @return true ou false suivant le succès de l'opération
*/
public function modifierObservationPublique($utilisateur, $id, $parametres) {
$base_param = array(
public function modifierObservationPublique($id_obs, $parametres) {
$parametresDefaut = array(
'nom_sel_nn' => NULL,
'nom_sel' => NULL,
'nom_ret_nn' => NULL,
'nom_referentiel' => NULL);
$parametres = array_merge($base_param, $parametres);
$parametres = array_merge($parametresDefaut, $parametres);
 
$this->traiterEspece($parametres);
self::formaterParametresObservation($parametres);
 
$retour = true;
 
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
$champ_maj[] = "date_modification = now()";
$champ_maj[] = 'date_modification = NOW()';
 
$requete_modification = "UPDATE cel_obs SET " .
$requete = "UPDATE cel_obs SET " .
implode(', ', $champ_maj) .
" WHERE id_observation = ".Cel::db()->proteger($id).
" AND ce_utilisateur = ".Cel::db()->proteger($utilisateur)." ".
" WHERE id_observation = ".Cel::db()->proteger($id_obs).
" AND transmission = 1 ".
' -- ' . __FILE__ . ':' . __LINE__;
// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes)
// ce qui peut arriver dans les commentaires
// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple
$resultat_modification = Cel::db()->executer($requete_modification . ' -- ' . __FILE__ . ':' . __LINE__);
$resultat = Cel::db()->executer($requete);
 
if ($resultat_modification === false) {
$this->logger("CEL_bugs","Erreur de mise à jour de l\'observation : ".$id);
if ($resultat === false) {
$this->logger("CEL_bugs", "Erreur de mise à jour de l'observation : ".$id_obs);
}
 
return $resultat_modification;
return $resultat;
}
 
public function modifierTransmissionObservation($ids_obs_ou_tableau, $publier) {