Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1840 → Rev 1914

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