Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1904 → Rev 1914

/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;