* @author Raphaël Droz * @copyright 2013 Tela-Botanica * @license Licence CECILL * @license GPL v3 * */ 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 Modified header("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 Error header("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 Failed header("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'; // 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 TODO static 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); } return FALSE; } }