1502 |
aurelien |
1 |
<?php
|
1873 |
raphael |
2 |
/**
|
|
|
3 |
* @category PHP
|
|
|
4 |
* @package jrest
|
|
|
5 |
* @author Aurélien Peronnet <aurelien@tela-botania.org>
|
|
|
6 |
* @author Raphaël Droz <raphael@tela-botania.org>
|
|
|
7 |
* @copyright 2013 Tela-Botanica
|
|
|
8 |
* @license Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
|
|
|
9 |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
|
|
|
10 |
*
|
|
|
11 |
*/
|
1502 |
aurelien |
12 |
class CelValidationObservation extends Cel {
|
|
|
13 |
/**
|
|
|
14 |
* Méthode appelée avec une requête de type POST avec un identifiant d'obs.
|
|
|
15 |
* Modifie le taxon associé à une observation avec les informations envoyées
|
1870 |
raphael |
16 |
* Utilisé par:
|
|
|
17 |
* - del/services/modules/0.1/determinations/ValiderDetermination.php::modifierObservationParDetermination()
|
1502 |
aurelien |
18 |
*
|
|
|
19 |
* @param int $uid[0] identifiant observation
|
|
|
20 |
* @param pairs array tableau contenant les valeurs à modifier
|
1873 |
raphael |
21 |
* @param pairs['obsKeywordDelete'] optional string: mot-clef à délier à cette observation
|
1502 |
aurelien |
22 |
*/
|
1870 |
raphael |
23 |
public function updateElement($uid, $pairs) {
|
1502 |
aurelien |
24 |
// ce service est uniquement destiné à être appelé en local,
|
|
|
25 |
// depuis le serveur lui même
|
|
|
26 |
// en particulier par l'application identiplante
|
|
|
27 |
$this->controleAppelIpAutorisee();
|
1870 |
raphael |
28 |
self::verifierParametresObligatoires($uid, $pairs);
|
1502 |
aurelien |
29 |
$id = $uid[0];
|
|
|
30 |
|
|
|
31 |
$gestion_observation = new GestionObservation($this->config);
|
1873 |
raphael |
32 |
$pairs = array_map('trim', $pairs);
|
1502 |
aurelien |
33 |
$utilisateur = $pairs['ce_utilisateur'];
|
1870 |
raphael |
34 |
unset($pairs['ce_utilisateur'], $pairs['id_observation']);
|
1873 |
raphael |
35 |
|
|
|
36 |
// mise à jour des mots-clefs suite à une validation:
|
|
|
37 |
// typiquement, DEL modifierObservationParDetermination()
|
|
|
38 |
// nous enverra obsKeywordDelete=aDeterminer en plus de certitude=Certaine
|
|
|
39 |
$obsKeywordDelete = @trim($pairs['obsKeywordDelete']);
|
|
|
40 |
// $imgKeywordDelete = @trim($pairs['imgKeywordDelete']);
|
|
|
41 |
unset($pairs['obsKeywordDelete']); // , $pairs['imgKeywordDelete']);
|
|
|
42 |
|
1877 |
raphael |
43 |
// complete les données de la proposition validée car:
|
|
|
44 |
// 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
|
|
|
45 |
// 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
|
|
|
46 |
// 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
|
|
|
47 |
$more_data = CelTaxonNomFrom::NN2($this->bdd, @$pairs['nom_sel_nn'], @$pairs['nom_referentiel']);
|
|
|
48 |
if($more_data) $pairs = array_merge($pairs, $more_data);
|
|
|
49 |
|
1502 |
aurelien |
50 |
$modification = $gestion_observation->modifierObservationPublique($utilisateur, $id, $pairs);
|
1870 |
raphael |
51 |
if($modification) {
|
1873 |
raphael |
52 |
// quel impact de ces valeurs de retour ?
|
|
|
53 |
if($kid = InventoryKeyWordList::getMotsClefId($utilisateur, 'obs', $obsKeywordDelete))
|
|
|
54 |
InventoryKeyWordObsLink::unlinkKeyword($this->config, 'obs', explode(',', $id), $utilisateur, $kid);
|
|
|
55 |
/* if($kid = InventoryKeyWordList::getMotsClefId($utilisateur, 'images', $imgKeywordDelete))
|
|
|
56 |
InventoryKeyWordObsLink::unlinkKeyword($this->config, 'obs', explode(',', $id), $utilisateur, $kid); */
|
1870 |
raphael |
57 |
header("Content-Type: text/plain; charset=utf-8");
|
|
|
58 |
die("OK"); // attention, compatibilité avec ValiderDetermination.php de DEL !
|
1502 |
aurelien |
59 |
}
|
1877 |
raphael |
60 |
// cf TODO: n'arrivera pas tant que l'UPDATE ajoutera systématiquement date_modification = now()
|
1870 |
raphael |
61 |
elseif($modification === 0) {
|
1906 |
raphael |
62 |
header("HTTP/1.0 304 Not Modified"); // XXX: PHP 5.4 // http_response_code(304); // Not Modified
|
1870 |
raphael |
63 |
header("Content-Type: text/plain; charset=utf-8");
|
|
|
64 |
die("Not Modified");
|
|
|
65 |
}
|
|
|
66 |
else {
|
1906 |
raphael |
67 |
header("HTTP/1.0 500 Internal Server Error"); // XXX: PHP: 5.4 // http_response_code(500); // Internal Server Error
|
1870 |
raphael |
68 |
header("Content-Type: text/plain; charset=utf-8");
|
|
|
69 |
die("Impossible de modifier l'observation associée à cet identifiant " . mysql_error());
|
|
|
70 |
}
|
1502 |
aurelien |
71 |
}
|
|
|
72 |
|
1870 |
raphael |
73 |
static function verifierParametresObligatoires($uid, $params) {
|
|
|
74 |
if(!@intval($uid[0]) || !@intval($params['id_observation'])) {
|
|
|
75 |
header("Content-Type: text/plain; charset=utf-8");
|
|
|
76 |
die("L'identifiant d'observation doit être un entier");
|
1502 |
aurelien |
77 |
}
|
1870 |
raphael |
78 |
|
|
|
79 |
// TODO: check sur 'id_observation' en tant que param est superflu ?
|
1877 |
raphael |
80 |
// TODO: avec l'apparition de CelTaxonNomFrom, "nom_sel" devrait être optionnel
|
|
|
81 |
// puisque nous regénérons des données valides avant l'update et puisque
|
|
|
82 |
// seul un nom_sel_nn *valide* a pu nous provenir depuis une validation de proposition de la part de DEL.
|
|
|
83 |
$params_obligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');
|
1502 |
aurelien |
84 |
foreach($params_obligatoires as $param) {
|
1870 |
raphael |
85 |
if(@trim($params[$param])) continue;
|
1906 |
raphael |
86 |
header("HTTP/1.0 412 Precondition Failed"); // XXX: PHP: 5.4 // http_response_code(412); // Precondition Failed
|
1870 |
raphael |
87 |
header("Content-Type: text/plain; charset=utf-8");
|
|
|
88 |
die(sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $params_obligatoires)));
|
1502 |
aurelien |
89 |
}
|
|
|
90 |
}
|
|
|
91 |
}
|
1877 |
raphael |
92 |
|
|
|
93 |
// pour les modifications touchants aux nom_sel(nn)/nom_ret(nn)/...
|
|
|
94 |
// les clefs du tableau (= les aliases de champs) correspondent aux champs attendus
|
|
|
95 |
// par tb_cel.cel_obs afin de pouvoir array_merger() et passer le résultat à modifierObservationPublique()
|
|
|
96 |
class CelTaxonNomFrom {
|
|
|
97 |
const db = 'tb_eflore';
|
|
|
98 |
const bdtfx = 'bdtfx_v2_00';
|
|
|
99 |
const bdtxa = 'bdtxa_v1_01';
|
|
|
100 |
const isfan = 'isfan_v2013';
|
|
|
101 |
|
|
|
102 |
// get from num_nom(_sel)
|
|
|
103 |
static function NN($db, $id, $ref) {
|
|
|
104 |
if(!$db || !$id || !$ref) return FALSE;
|
|
|
105 |
return $db->query(sprintf("SELECT num_nom_retenu AS nom_ret_nn, num_taxon AS nt, CONCAT(nom_sci, ' ', auteur) AS nom_sel".
|
|
|
106 |
" FROM cel_references".
|
|
|
107 |
" WHERE referentiel = %s AND num_nom = %d", $db->quote($ref), intval($id)))->fetch(PDO::FETCH_ASSOC);
|
|
|
108 |
}
|
|
|
109 |
|
|
|
110 |
// get from num_nom(_sel) directement via la DB
|
|
|
111 |
// ce qui nous permet l'initialisation des champs non-présents dans cel_references
|
|
|
112 |
// cf TODO
|
|
|
113 |
static function NN2($db, $id, $ref) {
|
|
|
114 |
if(!$db || !$id || !$ref) return FALSE;
|
|
|
115 |
switch($ref) {
|
|
|
116 |
case "bdtfx":
|
|
|
117 |
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".
|
|
|
118 |
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
|
|
|
119 |
" FROM %s.%s o".
|
|
|
120 |
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
|
|
|
121 |
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtfx, self::db, self::bdtfx, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
|
|
|
122 |
case "bdtxa":
|
|
|
123 |
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"
|
|
|
124 |
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
|
|
|
125 |
" FROM %s.%s o".
|
|
|
126 |
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
|
|
|
127 |
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtxa, self::db, self::bdtxa, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
|
|
|
128 |
case "isfan":
|
|
|
129 |
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".
|
|
|
130 |
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
|
|
|
131 |
" FROM %s.%s o".
|
|
|
132 |
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
|
|
|
133 |
" WHERE o.num_nom = %d -- %s:%d", self::db, self::isfan, self::db, self::isfan, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
|
|
|
134 |
}
|
|
|
135 |
return FALSE;
|
|
|
136 |
}
|
|
|
137 |
}
|