/branches/v1.7-croissant/jrest/lib/RechercheInfosTaxonBeta.php |
---|
40,6 → 40,7 |
$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']); |
$this->url_service_chorologie_obs = $config['eflore']['url_service_chorologie_obs']; |
$this->config = $config; |
} |
public function rechercherGenreEspeceSurPrefixe($genre = null, $espece = null) { |
84,26 → 85,30 |
public function rechercherInformationsComplementairesSurNom($nom_saisi) { |
$nom_saisi = trim($nom_saisi); |
// Essai de recherche sur le nom saisi tel quel |
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, true); |
if(empty($liste_genre_espece)) { |
// Essai de recherche stricte en tentant de supprimer le nom d'auteur |
$nom_saisi_sans_auteur = self::supprimerAuteur($nom_saisi); |
if($nom_saisi_sans_auteur) { // ne pas faire la requête sur un mot vide |
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi_sans_auteur, true); |
} |
if(empty($liste_genre_espece)) { |
// Dernière tentative : essai de recherche étendue |
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, false); |
} |
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, 'stricte'); |
if($liste_genre_espece) return $liste_genre_espece; |
// Essai de recherche stricte en tentant de supprimer le nom d'auteur |
if( ($nom_saisi_sans_auteur = self::supprimerAuteur($nom_saisi)) ) { // ne pas faire la requête sur un mot vide |
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi_sans_auteur, 'stricte'); |
} |
if($liste_genre_espece) return $liste_genre_espece; |
// avant-dernière tentative : essai de recherche étendue |
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, 'etendue'); |
if($liste_genre_espece) return $liste_genre_espece; |
// 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, $stricte = true) { |
private function effectuerRequeteUrlRecherche($nom_saisi, $mode = 'stricte') { |
$res = @json_decode(file_get_contents(sprintf('%1$s?masque=%2$s&recherche=%3$s&ns.format=txt&retour.champs=%4$s&navigation.limite=1', |
$this->url_service_nom, |
urlencode($nom_saisi), |
($stricte ? 'stricte' : 'etendue'), |
$mode, |
implode(',', array("id","nom_sci","auteur","nom_retenu.id","famille","num_taxonomique","nom_retenu_complet"))))); |
if(!$res) return NULL; |
$resultat = (array)$res->resultat; |
136,7 → 141,20 |
return strpos($nom_saisi,'x ') === 0; |
} |
public function effectuerRequeteInfosComplementairesSurNumNom($num_nom) { |
public function effectuerRequeteInfosComplementairesSurNumNom($num_nom, $ref = NULL) { |
if($ref && isset($this->config['eflore']['api_host'])) { |
return @json_decode(file_get_contents($this->config['eflore']['api_host'] . '/' . |
$ref . '/' . |
'noms' . '/' . |
$num_nom . |
'?retour.champs=' . implode(',', array('nom_sci,auteur', |
'id', |
'nom_retenu_complet', |
'nom_retenu.id', |
'num_taxonomique', |
'famille')))); |
} |
// XXX: compat |
return @json_decode(file_get_contents($this->url_service_nom.'/'.$num_nom.'?retour.champs=nom_sci,auteur,id,nom_retenu_complet,nom_retenu.id,num_taxonomique,famille')); |
} |
183,10 → 201,12 |
// TODO: ignorer la colonne référentiel, et utiliser le référentiel donné |
// mais il faut alors avertir le service (d'import/modif) d'utiliser le référentiel |
// passé au nom d'espèce |
// Seul le effectuerRequeteInfosComplementairesSurNumNom() le supporte, car c'est encore |
// un peu complexe à implémenter proprement pour cause d'attributs de classes. |
} |
// Numero nomenclatural |
if ($type == 'nn') { |
$obj = $this->effectuerRequeteInfosComplementairesSurNumNom($num); |
$obj = $this->effectuerRequeteInfosComplementairesSurNumNom($num, $ref); |
} |
// Numero taxonomique |
else { |
/branches/v1.7-croissant/jrest/lib/Cel.php |
---|
121,10 → 121,7 |
protected function verifierSecuriteParametreUrl($param) { |
//$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';'); |
if (!is_string($param)) return $param; |
$param = strip_tags($param); |
return $param; |
return is_string($param) ? strip_tags($param) : $param; |
} |
private function definirParametresUrlParDefaut() { |
219,12 → 216,12 |
print $contenu; |
} |
private function envoyerAuth($message_accueil, $message_echec) { |
static function envoyerAuth($message_accueil, $message_echec) { |
header('HTTP/1.0 401 Unauthorized'); |
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"'); |
header('Content-type: text/plain; charset=UTF-8'); |
print $message_echec; |
exit(0); |
exit; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
240,14 → 237,12 |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE L'IDENTIFICATION |
protected function getAuthIdentifiant() { |
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null; |
return $id; |
static function getAuthIdentifiant() { |
return isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : null; |
} |
protected function getAuthMotDePasse() { |
$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null; |
return $mdp; |
static function getAuthMotDePasse() { |
return isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : null; |
} |
public function authentifierAdmin() { |
268,19 → 263,11 |
} |
public function isAdmin($id) { |
$admins = $this->config['jrest_admin']['admin']; |
$admin_tab = explode(',',$admins); |
if (in_array($id,$admin_tab)) { |
return true; |
} else { |
return false; |
} |
return in_array($id, explode(',', $this->config['jrest_admin']['admin'])); |
} |
public function controleUtilisateur($id) { |
if (isset($_SESSION['user']) && isset($_SESSION['user']['name']) && $_SESSION['user']['name'] == '') { |
if (@array_key_exists('name', $_SESSION['user']) && empty($_SESSION['user']['name'])) { |
//cas de la session temporaire, on ne fait rien de particulier |
} else { |
if (isset($_SESSION['user']) && isset($_SESSION['user']['name']) && !$this->isAdmin($_SESSION['user']['name']) && $_SESSION['user']['name'] != $id) { |
292,12 → 279,10 |
} |
public function controleAppelIpAutorisee() { |
$ips_autorisees = explode(',', $this->config['jrest_admin']['ip_autorisees']); |
$ip_appelante = $_SERVER['REMOTE_ADDR']; |
if(!in_array($ip_appelante, $ips_autorisees) && $ip_appelante != $_SERVER['SERVER_ADDR']) { |
$ips_autorisees = explode(',', @$this->config['jrest_admin']['ip_autorisees']); |
if(!in_array($_SERVER['REMOTE_ADDR'], $ips_autorisees) && $_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) { |
header('HTTP/1.0 401 Unauthorized'); |
echo 'Accès interdit'; |
exit(0); |
exit('Accès interdit'); |
} |
return true; |
} |
315,26 → 300,26 |
} |
private function authentifier($message_accueil, $message_echec, $type) { |
$id = $this->getAuthIdentifiant(); |
if (!isset($id)) { |
$this->envoyerAuth($message_accueil, $message_echec); |
if (!isset($_SERVER['PHP_AUTH_USER'])) { |
self::envoyerAuth($message_accueil, $message_echec); // exit |
} |
if ($type == 'Utilisateur' && self::getAuthMotDePasse() == 'debug') { |
$autorisation = true; |
} else { |
if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') { |
$autorisation = true; |
} else { |
$methodeAutorisation = "etre{$type}Autorise"; |
$autorisation = $this->$methodeAutorisation(); |
} |
if ($autorisation == false) { |
$this->envoyerAuth($message_accueil, $message_echec); |
} |
$methodeAutorisation = "etre{$type}Autorise"; |
$autorisation = $this->$methodeAutorisation(); |
} |
if ($autorisation == false) { |
self::envoyerAuth($message_accueil, $message_echec); |
} |
return true; |
} |
public function etreUtilisateurAutorise() { |
$identifiant = $this->getAuthIdentifiant(); |
$mdp = md5($this->getAuthMotDePasse()); |
$identifiant = self::getAuthIdentifiant(); |
$mdp = md5(self::getAuthMotDePasse()); |
$service = "TestLoginMdp/$identifiant/$mdp"; |
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service); |
$json = $this->getRestClient()->consulter($url); |
345,36 → 330,26 |
} |
public function etreAdminAutorise() { |
$identifiant = $this->getAuthIdentifiant(); |
$identifiant = self::getAuthIdentifiant(); |
$autorisation = ($this->etreUtilisateurAutorise() && $this->etreAdminCel($identifiant)) ? true : false; |
return $autorisation; |
} |
public function etreAdminCel($courriel) { |
$admins = $this->config['jrest_admin']['admin']; |
$courriels_autorises = explode(',', $admins); |
$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ; |
return $autorisation; |
// parmi les admins ? |
return in_array($courriel, explode(',', $this->config['jrest_admin']['admin'])); |
} |
public function getInfosComplementairesUtilisateur($id_utilisateur) { |
$defaut_infos = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur); |
if(! is_numeric($id_utilisateur)) return $defaut_infos; |
$infos_utilisateur = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur); |
$resultat_infos_utilisateur = Cel::db()->requeter( |
'SELECT prenom, nom, courriel FROM cel_utilisateurs' |
. ' WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur)); |
if(is_numeric($id_utilisateur)) { |
$requete_infos_utilisateur = 'SELECT prenom, nom, courriel FROM cel_utilisateurs '. |
'WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur); |
$resultat_infos_utilisateur = Cel::db()->requeter($requete_infos_utilisateur); |
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) { |
$infos_utilisateur = $resultat_infos_utilisateur[0]; |
} |
} |
return $infos_utilisateur; |
if($resultat_infos_utilisateur && count($resultat_infos_utilisateur)) return $resultat_infos_utilisateur[0]; |
return $defaut_infos; // autrement, info par défaut |
} |
public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) { |
456,8 → 431,7 |
} |
protected function tronquerCourriel($courriel) { |
$courriel = preg_replace('/[^@]+$/i', '...', $courriel); |
return $courriel; |
return preg_replace('/[^@]+$/i', '...', $courriel); |
} |
protected function nettoyerTableau(Array $tableau) { |
546,26 → 520,14 |
return $code_departement; |
} |
protected function convertirCodeInseeVersCodeZoneGeo($code_insee) { |
return 'INSEE-C:'.$code_insee; |
} |
static function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $code_insee) { |
$resultat = Cel::db()->requeter(sprintf( |
'SELECT id_zone_geo FROM cel_zones_geo WHERE nom LIKE %s AND id_zone_geo LIKE %s', |
Cel::db()->proteger($nom_commune), |
Cel::db()->proteger("INSEE-C:" . $code_insee . '%'))); |
protected function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $dpt) { |
$code_insee = $dpt; |
$requete = 'SELECT id_zone_geo FROM cel_zones_geo '. |
'WHERE nom LIKE '.Cel::db()->proteger($nom_commune).' '. |
'AND id_zone_geo LIKE "INSEE-C:'.$dpt.'%"'; |
$resultat = Cel::db()->requeter($requete); |
if(is_array($resultat) && count($resultat) > 0) { |
$code_insee = $resultat[0]['id_zone_geo']; |
} |
return $code_insee; |
if($resultat && count($resultat)) return $resultat[0]['id_zone_geo']; |
return $code_insee; // autrement retourne l'original |
} |
protected function encoderMotCle($mot_cle) { |
718,5 → 680,3 |
return $contenu; |
} |
} |
?> |
/branches/v1.7-croissant/jrest/lib/LiaisonMotsCles.php |
---|
1,24 → 1,14 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botania.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* in : utf8 |
* out : utf8 |
* |
* Librairie de liaison d'images et d'observation à des mots clés |
* |
*/ |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botania.org> |
* @author Raphaël Droz <raphael@tela-botania.org> |
* @copyright 2010, 2013 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* |
* Librairie de liaison d'images et d'observation à des mots clés |
*/ |
class LiaisonMotsCles extends Cel { |
const SEPARATEUR_MOT_CLE_TEXTE = ','; |
30,34 → 20,45 |
} |
public function ajouterLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) { |
$mode = $this->mode; |
$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image'; |
$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image'; |
// le mot clé ignore est spécifique mysql, mais il est utilisé ici pour des raisons |
// de performance, à remplacer par un test sur les mots clés déjà existant si ça gène |
$requete_liaison_mots_cles = 'INSERT IGNORE INTO cel_'.$this->mode.'_mots_cles '. |
'('.$champ_objet_lie.', '.$champ_mot_cle.') '. |
'VALUES '; |
$requete_liaison_mots_cles = sprintf('INSERT IGNORE INTO cel_%s_mots_cles '. |
'(%s, %s) VALUES ', |
$mode, |
$mode == 'obs' ? 'id_observation' : 'id_image', |
$mode == 'obs' ? 'id_mot_cle_obs' : 'id_mot_cle_image'); |
$insert = array(); |
foreach($ids_images_ou_obs as $id_image_ou_obs) { |
foreach($mots_cles as $mot) { |
$requete_liaison_mots_cles .= '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).'),'; |
// TODO!! ce_utilisateur |
$insert[] = '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).')'; |
} |
} |
$requete_liaison_mots_cles = rtrim($requete_liaison_mots_cles,','); |
$resultat_liaison_mots_cles = Cel::db()->executer($requete_liaison_mots_cles); |
foreach($ids_images_ou_obs as $id_image_ou_obs) { |
$this->regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur); |
if(!$insert) { |
// peut arriver, par exemple lorsqu'on décoche tous les mots-clef associés à une image |
$this->logger('CEL_bugs', 'Pas de mot-clef à ajouter à des '.$mode.' : '. implode(',', $ids_images_ou_obs)); |
} |
else { |
$resultat_liaison_mots_cles = Cel::db()->executer($requete_liaison_mots_cles . implode(',',$insert)); |
if(! $resultat_liaison_mots_cles) { |
$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$mode.' : '.$requete_liaison_mots_cles); |
// ne pas retourner car si nous sommes passés par InventoryKeyWordImageLink updateElement(), |
// alors celui-ci à *purgé* les mots-clefs en amont et compte sur nous pour faire une réinitialisation |
/// correcte ... |
// return FALSE; |
} |
} |
if(!$resultat_liaison_mots_cles) { |
$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$this->mode.' : '.$requete_liaison_mots_cles); |
// ... donc dans tous les cas nous devons conserver une cohérence entre les deux modes de stockage des mots-clefs |
$ret = TRUE; |
foreach($ids_images_ou_obs as $id_image_ou_obs) { |
$bool = self::regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur, $mode); |
$ret = $ret & ($bool !== FALSE); // peut légitimement retourner 0 |
} |
return $resultat_liaison_mots_cles; |
return $ret; |
} |
public function supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_images_ou_obs, $mots_cles) { |
65,7 → 66,7 |
$retour = $this->supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles); |
foreach($ids_images_ou_obs as $image_ou_obs) { |
$this->regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur); |
self::regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur, $this->mode); |
} |
return $retour; |
82,16 → 83,10 |
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle); |
if ($requete_suppression_liaison_mot_cle !== false) { |
$retour = true; |
} else { |
$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"; |
$this->logger($message); |
$retour = false; |
} |
return $retour; |
if ($requete_suppression_liaison_mot_cle !== false) return TRUE; |
$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"); |
return FALSE; |
} |
public function supprimerToutesLiaisonsPourIdImageOuObs($id_utilisateur, $ids_images_ou_obs) { |
105,15 → 100,11 |
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle); |
if ($requete_suppression_liaison_mot_cle !== false) { |
$retour = true; |
} else { |
$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"; |
$this->logger($message); |
$retour = false; |
return TRUE; |
} |
return $retour; |
$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete"); |
return FALSE; |
} |
public function supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles) { |
133,7 → 124,7 |
$resultat_requete_objets_lies_mot_cle = Cel::db()->requeter($requete_objets_lies_mot_cle); |
foreach($resultat_requete_objets_lies_mot_cle as $objet_lie) { |
$this->regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur); |
self::regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur, $this->mode); |
} |
if ($requete_suppression_liaison_mot_cle !== false) { |
148,42 → 139,37 |
return $retour; |
} |
private function regenererIndexTexteMotCle($image_ou_obs, $identifiant_utilisateur) { |
$mots_cles = $this->obtenirMotsClesTexte($image_ou_obs, $identifiant_utilisateur); |
static private function regenererIndexTexteMotCle($id_image_ou_obs, $identifiant_utilisateur, $mode) { |
$mots_cles = self::obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode); |
$mots_cles_texte_chaine = ""; |
if (count($mots_cles) > 0) { |
$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($mots_cles); |
$mots_cles_texte_chaine = self::formaterTableauMotCleTextePourInsertion($mots_cles); |
} |
$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $image_ou_obs, $identifiant_utilisateur); |
// self::executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur, $mode); |
return Cel::db()->executer(sprintf('UPDATE %s SET mots_cles_texte = %s WHERE %s = %s AND ce_utilisateur = %s -- %s:%d', |
$mode == 'obs' ? 'cel_obs' : 'cel_images', |
Cel::db()->proteger($mots_cles_texte_chaine), |
$mode == 'obs' ? 'id_observation' : 'id_image', |
Cel::db()->proteger($id_image_ou_obs), |
Cel::db()->proteger($identifiant_utilisateur), |
__FILE__ , __LINE__)); |
} |
private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur) { |
$requete = 'UPDATE '.(($this->mode == 'obs') ? 'cel_obs' : 'cel_images').' '. |
'SET mots_cles_texte = '.Cel::db()->proteger($mots_cles_texte_chaine).' '. |
'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs). |
' AND ce_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur); |
return Cel::db()->executer($requete); |
private static function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode) { |
return Cel::db()->requeter(sprintf('SELECT mot_cle FROM cel_mots_cles_%1$s WHERE id_mot_cle_%2$s IN '. |
' (SELECT id_mot_cle_%2$s FROM cel_%1$s_mots_cles WHERE %3$s = %4$s)'. |
' AND id_utilisateur = %5$s -- %6$s:%7$d', |
$mode, |
$mode == 'obs' ? 'obs' : 'image', |
$mode == 'obs' ? 'id_observation' : 'id_image', |
Cel::db()->proteger($id_image_ou_obs), |
Cel::db()->proteger($identifiant_utilisateur), |
__FILE__ , __LINE__)); |
} |
private function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur) { |
$requete = 'SELECT mot_cle '. |
'FROM '.'cel_mots_cles_'.$this->mode.' '. |
'WHERE id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' IN '. |
'('. |
'SELECT id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' '. |
'FROM cel_'.$this->mode.'_mots_cles '. |
'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs). |
')'. |
' AND id_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur); |
$resultats = Cel::db()->requeter($requete); |
return $resultats; |
} |
private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) { |
private static function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) { |
$mot_cles_texte_chaine = ''; |
if (is_array($tableau_mots_cles_texte)) { |
197,7 → 183,7 |
return $mot_cles_texte_chaine; |
} |
public function nettoyerMotsCles($chaine) { |
static function nettoyerMotsCles($chaine) { |
$valeur = str_replace('null', '', $chaine); |
$valeur = trim($valeur, ';;'); |
/branches/v1.7-croissant/jrest/lib/GestionObservation.php |
---|
1,27 → 1,30 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
* PHP Version 5.2 |
* |
* @category PHP |
* @package jrest |
* @author Raphaël Droz <raphael@tela-botanica.org> |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010, 2013 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @link /doc/jrest/ |
* |
* Classe de gestion de l'ajout, modification et suppression des observations |
* |
* TODO: $sous_requete .= ' date_modification = now() ' |
* devrait être une clause ON UPDATE ou un TRIGGER |
* afin de mettre à jour la date de modification uniquement lorsqu'une modification a effectivement eu lieu |
* |
*/ |
class GestionObservation extends Cel { |
/** |
* Classe de gestion de l'ajout, modification et suppression des observations |
* |
* in=utf8 |
* out=utf8 |
* |
*/ |
class GestionObservation extends Cel { |
static $cel_obs = array( |
"id_observation", "ordre", "ce_utilisateur", "prenom_utilisateur", "nom_utilisateur", "courriel_utilisateur", "nom_sel", "nom_sel_nn", "nom_ret", "nom_ret_nn", "nt", "famille", "nom_referentiel", |
"ce_zone_geo", "zone_geo", "lieudit", "station", "milieu", "latitude", "longitude", "altitude", "geodatum", "date_observation", "mots_cles_texte", "commentaire", "transmission", |
"date_creation", "date_modification", "date_transmission", "abondance", "certitude", "phenologie", "code_insee_calcul"); |
/** |
* Ajoute une observation grâce aux paramètres fournis |
* |
31,13 → 34,28 |
* @return true ou false suivant le succès de l'opération |
*/ |
public function ajouterObservation($utilisateur, $parametres) { |
$origin_params = $parametres; |
$base_param = array('nom_sel_nn' => NULL, |
'nom_sel' => NULL, |
'nom_ret_nn' => NULL, |
'nom_referentiel' => NULL); |
$parametres = array_merge($base_param, $parametres); |
$retour = true; |
$parametres['ordre'] = $this->renvoyerDernierOrdreUtilisePlusUn($utilisateur); |
$this->traiterEspece($parametres); |
$this->formaterParametresObservation($parametres); |
// si la détermination à échoué, alors: |
// soit le référentiel d'origine était "valide", soit non |
if(!$parametres['nom_sel_nn']) { |
// quoiqu'il en soit, on le met à "autre" |
$parametres['nom_referentiel'] = Cel::$fallback_referentiel; |
} |
$this->ajoutInfoUtilisateurARequete($parametres); |
self::formaterParametresObservation($parametres); |
$requete_insertion_observation = 'INSERT INTO cel_obs '; |
$sous_requete_colonnes = $this->traiterParametresObservationEtConstruireSousRequeteAjout($parametres); |
110,13 → 128,12 |
'nom_sel' => NULL, |
'nom_ret_nn' => NULL, |
'nom_referentiel' => NULL); |
$parametres = array_merge($base_param, $parametres); |
// $parametres = array_merge($base_param, $parametres); |
$retour = true; |
$requete_modification = "UPDATE cel_obs SET " ; |
// si pas de nom_sel : on supprime les champs automatiques. et le référentiel. |
if(!isset($parametres['nom_sel']) || !@$parametres['nom_sel']) { |
if(false && (!isset($parametres['nom_sel']) || !@$parametres['nom_sel'])) { |
$parametres['nom_referentiel'] = NULL; // pas d'update de traiterParametresObservationEtConstruireSousRequeteMaj() |
$requete_modification .= "nom_referentiel = NULL, nom_sel_nn = NULL, nom_ret_nn = NULL, nom_ret = NULL, nt = NULL, famille = NULL,"; |
} |
135,20 → 152,25 |
famille = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, famille), |
EOF; |
} |
else { |
elseif(isset($parametres['nom_sel'])) { |
// uniquement en cas de nom_sel présent |
$this->traiterEspece($parametres); |
} |
$this->formaterParametresObservation($parametres); |
$requete_modification .= $this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) . |
" WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur); |
self::formaterParametresObservation($parametres); |
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres); |
$champ_maj[] = "date_modification = now()"; |
$requete_modification .= |
implode(', ', $champ_maj) |
. " WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur); |
// 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()->executerRequeteSimple($requete_modification); |
$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification . ' -- ' . __FILE__ . ':' . __LINE__); |
if ($resultat_modification === false) { |
$retour = false; |
157,6 → 179,39 |
return $retour; |
} |
/** |
* @return nombre d'observations mises à jour, ou FALSE en cas de problème |
*/ |
static function modifierMultiplesObservation($utilisateur, Array $ordre, $parametres) { |
// nous pouvons aussi retirer 'ce_utilisateur' (== $utilisateur) qui sera dans la clause WHERE |
$exclusions = array('nom_sel_nn', 'nom_sel', 'nom_ret_nn', 'nom_referentiel', 'ce_utilisateur'); |
$parametres = array_diff_key($parametres, array_flip($exclusions)); |
$parametres = array_intersect_key($parametres, array_flip(self::$cel_obs)); |
$parametres = array_filter( |
$parametres, |
create_function('$e','return strpos($e, "(Valeurs multiples)") === false;')); |
// modifie $parametres par référence |
self::formaterParametresObservation($parametres); |
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres); |
if(!$champ_maj) return 0; // rien à mettre à jour finalement |
$champ_maj[] = "date_modification = now()"; |
$nb_upd = Cel::db()->executer(sprintf( |
"UPDATE cel_obs SET %s WHERE ordre IN (%s) AND ce_utilisateur = %s -- %s:%d", |
implode(', ', $champ_maj), |
implode(', ', $ordre), |
Cel::db()->proteger($utilisateur), |
__FILE__, __LINE__)); |
if($nb_upd === FALSE) return FALSE; |
return $nb_upd; |
// TODO: return json_encode(updated_rows()); |
} |
/** |
* Modifie une observation publique dont l'id et l'utilisateur sont passé en paramètre |
175,11 → 230,15 |
$parametres = array_merge($base_param, $parametres); |
$this->traiterEspece($parametres); |
$this->formaterParametresObservation($parametres); |
self::formaterParametresObservation($parametres); |
$retour = true; |
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres); |
$champ_maj[] = "date_modification = now()"; |
$requete_modification = "UPDATE cel_obs SET " . |
$this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) . |
implode(', ', $champ_maj) . |
" WHERE id_observation = ".Cel::db()->proteger($id). |
" AND ce_utilisateur = ".Cel::db()->proteger($utilisateur)." ". |
" AND transmission = 1"; |
187,14 → 246,13 |
// 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()->executerRequeteSimple($requete_modification); |
$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification . ' -- ' . __FILE__ . ':' . __LINE__); |
if ($resultat_modification === false) { |
$retour = false; |
$this->logger("CEL_bugs","Erreur de mise à jour de l\'observation : ".$id); |
} |
return $retour; |
return $resultat_modification; |
} |
/** |
374,7 → 432,7 |
// XXX: ne devrait plus être nécessaire maintenant que rechercherInformationsComplementairesSurNom() [plus précisément effectuerRequeteUrlRecherche()] |
// a été modifiée pour retourner tous les champs nécessaire. |
if ($deuxieme_passe && (!$parametres['nom_ret_nn'] || !$parametres['nt'])) { |
if ($deuxieme_passe && (! array_key_exists('nom_ret_nn', $parametres) || ! array_key_exists('nt', $parametres))) { |
// Utilisation d'un nom faisant parti du referentiel : recherche du nom valide correspondant |
$chercheur_infos_complementaires = new RechercheInfosTaxonBeta($this->config , $code_referentiel); |
$complement = $chercheur_infos_complementaires->effectuerRequeteInfosComplementairesSurNumNom($parametres['nom_sel_nn']); |
400,6 → 458,16 |
$parametres['nom_referentiel'] = $code_referentiel; |
} |
// uniquement nécessaire lors de l'ajout |
private function ajoutInfoUtilisateurARequete(&$parametres) { |
if(! isset($parametres['ce_utilisateur'])) return; |
$infos_utilisateur = $this->getInfosComplementairesUtilisateur($parametres['ce_utilisateur']); |
$parametres['courriel_utilisateur'] = $infos_utilisateur['courriel']; |
$parametres['nom_utilisateur'] = $infos_utilisateur['nom']; |
$parametres['prenom_utilisateur'] = $infos_utilisateur['prenom']; |
} |
/** |
* Formate les paramètres fournis en ajoutant des infos complementaires |
* |
407,16 → 475,7 |
* |
* @return $parametres le tableau modifié selon ce qu'il contenait |
*/ |
private function formaterParametresObservation(&$parametres) { |
if(isset($parametres['ce_utilisateur'])) { |
$infos_utilisateur = $this->getInfosComplementairesUtilisateur($parametres['ce_utilisateur']); |
$parametres['courriel_utilisateur'] = $infos_utilisateur['courriel']; |
$parametres['nom_utilisateur'] = $infos_utilisateur['nom']; |
$parametres['prenom_utilisateur'] = $infos_utilisateur['prenom']; |
} |
static function formaterParametresObservation(&$parametres) { |
// Pour empecher que des numéros de département de 1 à 9 soient saisis sans 0 |
// TODO: décider quoi faire pour les zones géo plus générales |
if (isset($parametres['ce_zone_geo'])) { |
429,9 → 488,9 |
} |
if (strlen($parametres['ce_zone_geo']) > 0 && strlen($parametres['ce_zone_geo']) <= 2) { |
$parametres['ce_zone_geo'] = $this->obtenirCodeInseeCommunePourNomEtDepartement($parametres['zone_geo'], $parametres['ce_zone_geo']); |
$parametres['ce_zone_geo'] = Cel::obtenirCodeInseeCommunePourNomEtDepartement($parametres['zone_geo'], $parametres['ce_zone_geo']); |
} else { |
$parametres['ce_zone_geo'] = $this->convertirCodeInseeVersCodeZoneGeo($parametres['ce_zone_geo']); |
$parametres['ce_zone_geo'] = 'INSEE-C:'. $parametres['ce_zone_geo']; |
} |
} |
} |
493,13 → 552,12 |
* @return string une sous requete utilisable pour la modification d'une observation |
* selon la syntaxe UPDATE table SET colonne1 = valeur1, colonne2 = valeur2 WHERE condition |
*/ |
private function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) { |
$sous_requete = ''; |
static function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) { |
$champs = array(); |
// Nullifiage ... |
// TODO: code dupliqué, en faire une fonction à mettre à la place appropriée |
foreach($parametres as $cle => $valeur) { |
// Pour apparaitre le premier dans les tris ... |
if (trim($valeur) == "" || trim($valeur) == "null" || trim($valeur) == "000null") { |
$valeur = "NULL"; |
506,13 → 564,8 |
} else { |
$valeur = Cel::db()->proteger($valeur); |
} |
$sous_requete .= $cle." = ".$valeur.", "; |
$champs[] = $cle." = ".$valeur; |
} |
$sous_requete .= ' date_modification = now() '; |
return $sous_requete; |
return $champs; |
} |
} |
?> |
} |
/branches/v1.7-croissant/jrest/lib/ImageRecreation.php |
---|
1,8 → 1,8 |
<?php |
Class ImageRecreation { |
private $droits = 0705; |
private $formats = array('CRX2S','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L'); |
private $droits = 0755; |
private $formats = array('CRX2S','CRXS','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L'); |
const MODE_GD = 'gd'; |
const MODE_IMAGEMAGICK = 'imagemagick'; |
private $mode; |