Rev 1631 | Rev 2155 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Service permettant de récupérer toutes les informations d'une observation publique.* Encodage en entrée : utf8* Encodage en sortie : utf8** Cas d'utilisation :* GET /CelObs/[id] : oû id est l'identifiant d'une observation publique** @author Jean-Pascal MILCENT <jpm@clapas.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @version $Id$* @copyright © 2013, Jean-Pascal MILCENT*/class CelObs extends Cel {private $rechercheObs = null;private $chpsEtendus = null;private $donnees = null;public function __construct($config) {parent::__construct($config);$this->rechercheObs = new RechercheObservation($config);$this->chpsEtendus = new GestionChampsEtendus($config, 'obs');}function getElement($ressources){$retour = false;$idObs = $ressources[0];if (isset($idObs) && preg_match('/^[0-9]+$/', $idObs)) {$criteres = array('id_observation' => $idObs, 'transmission' => 1);$obsTrouvee = $this->rechercheObs->rechercherObservations(null, $criteres, 0, 1)->get();$observation = array();if (is_array($obsTrouvee) && count($obsTrouvee) > 0) {$observation = $obsTrouvee[0];}$observation = $this->preparerChamps($observation);$observation = $this->selectionnerChamps($observation);$observation = $this->formaterClePourJs($observation);$champsEtendus = $this->chpsEtendus->consulter($idObs);if (is_array($champsEtendus) && count($champsEtendus) > 0) {$champsEtendus = $this->preparerChampsEtendus($champsEtendus);$observation['extension'] = $champsEtendus;}$this->envoyerJson($observation);$retour = true;}return $retour;}private function preparerChamps($champs) {if (isset($champs['date_observation'])) {$date = explode(' ', $champs['date_observation']);$champs['date_observation'] = $date[0];}return $champs;}private function selectionnerChamps($observation) {$champs = array('id_observation', 'nom_sel', 'nom_ret', 'nom_ret_nn', 'nt', 'famille','nom_referentiel', 'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'milieu', 'latitude', 'longitude','geodatum', 'date_observation', 'mots_cles_texte', 'commentaire', 'date_creation', 'date_modification','date_transmission', 'code_insee_calcule', 'abondance', 'certitude', 'phenologie', 'altitude');$selection = array();foreach ($champs as $chp) {if (isset($observation[$chp])) {$selection[$chp] = $observation[$chp];}}return $selection;}private function formaterClePourJs(Array $tableau) {$tableauJs = array();foreach ($tableau as $cle => $valeur) {if ($cle == 'ce_zone_geo') {$cle = 'codeZoneGeo';} else {$cle = str_replace(' ', '', ucwords(str_replace('_', ' ', $cle)));$cle{0} = strtolower($cle{0});}$tableauJs[$cle] = $valeur;}return $tableauJs;}private function preparerChampsEtendus($champs) {$retour = array();foreach ($champs as $chp) {$retour[$chp['cle']] = array('valeur' => $chp['valeur'], 'label' => $chp['label']);}return $retour;}/*** Méthode appelée avec une requête de type POST et un identifiant d'observation.* Modifie une observation en fonction des informations envoyées en POST.* Utilisé par:* - service:del:0.1/determinations/ : ValiderDetermination.php::modifierObservationParDetermination()* - service:del:0.1/observations/#idObs [POST] : pour dépublier une observation** @param $uid array $uid[0] (int) : identifiant observation* @param pairs array tableau contenant les champs à modifier sous la forme : nom_du_champ=nouvelle_valeur*/public function updateElement($ressources, $donnees) {$this->donnees = $donnees;if ($this->controlerAccessibiliteWs()) {if ($this->controleAppelIpAutorisee()) {$idObs = isset($ressources[0]) ? $ressources[0] : '';$this->verifierIdentifiantObs($idObs);$idObs = explode(',', $idObs);// Seulement la dépublicationif (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) == 3) {$donneesObligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');if ($this->verifierDonneesObligatoires($donneesObligatoires)) {$this->modifierObservationDepuisDEL($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";$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);}}}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 Modifiedheader("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 Errorheader("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);if ($ok == false) {$msg = "Indiquer un ou plusieurs identifiants d'obs séparés par des virgules.";$this->envoyerMessageErreur(412, $msg);}return $ok;}private function verifierDonneesObligatoires($champsObligatoires) {foreach ($champsObligatoires as $param) {if (! isset($this->donnees[$param])) {$msg = sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $champsObligatoires));$this->envoyerMessageErreur(412, $msg);}}}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);}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';private function getInfosBdtfx($id_nom) {$idNomP = $this->bdd->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) "."WHERE o.num_nom = $idNomP ".' -- '.__FILE__.' : '.__LINE__;$resultat = Cel::db()->executerRequete($requete, Cel::db::SQL_RETOUR_LIGNE);return $resultat;}}