Rev 2131 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** @category PHP* @package jrest* @author Aurélien Peronnet <aurelien@tela-botania.org>* @author Raphaël Droz <raphael@tela-botania.org>* @copyright 2013 Tela-Botanica* @license Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>**/class CelValidationObservation extends Cel {/*** Méthode appelée avec une requête de type POST avec un identifiant d'obs.* Modifie le taxon associé à une observation avec les informations envoyées* Utilisé par:* - del/services/modules/0.1/determinations/ValiderDetermination.php::modifierObservationParDetermination()** @param int $uid[0] identifiant observation* @param pairs array tableau contenant les valeurs à modifier* @param pairs['obsKeywordDelete'] optional string: mot-clef à délier à cette observation*/public function updateElement($uid, $pairs) {// ce service est uniquement destiné à être appelé en local,// depuis le serveur lui même// en particulier par l'application identiplante$this->controleAppelIpAutorisee();self::verifierParametresObligatoires($uid, $pairs);$id = $uid[0];$gestion_observation = new GestionObservation($this->config);$pairs = array_map('trim', $pairs);$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 = CelTaxonNomFrom::NN2($this->bdd, @$pairs['nom_sel_nn'], @$pairs['nom_referentiel']);if($more_data) $pairs = array_merge($pairs, $more_data);$modification = $gestion_observation->modifierObservationPublique($utilisateur, $id, $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, $id, $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());}}static function verifierParametresObligatoires($uid, $params) {if(!@intval($uid[0]) || !@intval($params['id_observation'])) {header("Content-Type: text/plain; charset=utf-8");die("L'identifiant d'observation doit être un entier");}// TODO: check sur 'id_observation' en tant que param est superflu ?// TODO: avec l'apparition de CelTaxonNomFrom, "nom_sel" devrait être optionnel// puisque nous regénérons des données valides avant l'update et puisque// seul un nom_sel_nn *valide* a pu nous provenir depuis une validation de proposition de la part de DEL.$params_obligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');foreach($params_obligatoires as $param) {if(@trim($params[$param])) continue;header("HTTP/1.0 412 Precondition Failed"); // XXX: PHP: 5.4 // http_response_code(412); // Precondition Failedheader("Content-Type: text/plain; charset=utf-8");die(sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $params_obligatoires)));}}}// pour les modifications touchants aux nom_sel(nn)/nom_ret(nn)/...// les clefs du tableau (= les aliases de champs) correspondent aux champs attendus// par tb_cel.cel_obs afin de pouvoir array_merger() et passer le résultat à modifierObservationPublique()class CelTaxonNomFrom {const db = 'tb_eflore';const bdtfx = 'bdtfx_v2_00';const bdtxa = 'bdtxa_v1_01';const isfan = 'isfan_v2013';const apd = 'apd_v1_00';// get from num_nom(_sel)static function NN($db, $id, $ref) {if(!$db || !$id || !$ref) return FALSE;return $db->query(sprintf("SELECT num_nom_retenu AS nom_ret_nn, num_taxon AS nt, CONCAT(nom_sci, ' ', auteur) AS nom_sel"." FROM cel_references"." WHERE referentiel = %s AND num_nom = %d", $db->quote($ref), intval($id)))->fetch(PDO::FETCH_ASSOC);}// get from num_nom(_sel) directement via la DB// ce qui nous permet l'initialisation des champs non-présents dans cel_references// cf TODOstatic function NN2($db, $id, $ref) {if(!$db || !$id || !$ref) return FALSE;switch($ref) {case "bdtfx":return $db->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::bdtfx, self::db, self::bdtfx, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);case "bdtxa":return $db->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 $db->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 "apd":return $db->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::apd, self::db, self::apd, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);}return FALSE;}}