Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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) {
2046 aurelien 52
			$gestion_mots_cles = new GestionMotsClesChemin($this->config, 'obs');
53
			// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
54
			$supp_liaison_mot_cle = $gestion_mots_cles->supprimerLiaisonPourMotCleEtIdElementLie($obsKeywordDelete, $id, $utilisateur);
55
			// TODO : quel impact de la valeur de retour ?
1870 raphael 56
			header("Content-Type: text/plain; charset=utf-8");
57
			die("OK"); // attention, compatibilité avec ValiderDetermination.php de DEL !
1502 aurelien 58
		}
1877 raphael 59
		// cf TODO: n'arrivera pas tant que l'UPDATE ajoutera systématiquement date_modification = now()
1870 raphael 60
		elseif($modification === 0) {
1906 raphael 61
            header("HTTP/1.0 304 Not Modified"); // XXX: PHP 5.4 // http_response_code(304); // Not Modified
1870 raphael 62
			header("Content-Type: text/plain; charset=utf-8");
63
			die("Not Modified");
64
		}
65
		else {
1906 raphael 66
			header("HTTP/1.0 500 Internal Server Error"); // XXX: PHP: 5.4 // http_response_code(500); // Internal Server Error
1870 raphael 67
			header("Content-Type: text/plain; charset=utf-8");
68
			die("Impossible de modifier l'observation associée à cet identifiant " . mysql_error());
69
		}
1502 aurelien 70
	}
71
 
1870 raphael 72
	static function verifierParametresObligatoires($uid, $params) {
73
		if(!@intval($uid[0]) || !@intval($params['id_observation'])) {
74
			header("Content-Type: text/plain; charset=utf-8");
75
			die("L'identifiant d'observation doit être un entier");
1502 aurelien 76
		}
1870 raphael 77
 
78
		// TODO: check sur 'id_observation' en tant que param est superflu ?
1877 raphael 79
		// TODO: avec l'apparition de CelTaxonNomFrom, "nom_sel" devrait être optionnel
80
		// puisque nous regénérons des données valides avant l'update et puisque
81
		// seul un nom_sel_nn *valide* a pu nous provenir depuis une validation de proposition de la part de DEL.
82
		$params_obligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');
1502 aurelien 83
		foreach($params_obligatoires as $param) {
1870 raphael 84
			if(@trim($params[$param])) continue;
1906 raphael 85
            header("HTTP/1.0 412 Precondition Failed"); // XXX: PHP: 5.4 // http_response_code(412); // Precondition Failed
1870 raphael 86
			header("Content-Type: text/plain; charset=utf-8");
87
			die(sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $params_obligatoires)));
1502 aurelien 88
		}
89
	}
90
}
1877 raphael 91
 
92
// pour les modifications touchants aux nom_sel(nn)/nom_ret(nn)/...
93
// les clefs du tableau (= les aliases de champs) correspondent aux champs attendus
94
// par tb_cel.cel_obs afin de pouvoir array_merger() et passer le résultat à modifierObservationPublique()
95
class CelTaxonNomFrom {
96
  const db = 'tb_eflore';
97
  const bdtfx = 'bdtfx_v2_00';
98
  const bdtxa = 'bdtxa_v1_01';
99
  const isfan = 'isfan_v2013';
2122 mathias 100
  const bdtao = 'bdtao_v1_00';
1877 raphael 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);
2122 mathias 134
	case "bdtao":
135
	  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".
136
								" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
137
								" FROM %s.%s o".
138
								" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
139
								" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtao,  self::db, self::bdtao, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
1877 raphael 140
	}
141
	return FALSE;
142
  }
143
}