Subversion Repositories eFlore/Applications.cel

Rev

Rev 2939 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2939 Rev 3509
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service générique permettant de manipuler les Images.
4
 * Service générique permettant de manipuler les Images.
5
 *
5
 *
6
 * Cas d'utilisation GET :
6
 * Cas d'utilisation GET :
7
 * /CelImage/liste-ids?obsId=[0-9]+ : ids des images liées à l'observation possédant l'identifiant 'obsId'.
7
 * /CelImage/liste-ids?obsId=[0-9]+ : ids des images liées à l'observation possédant l'identifiant 'obsId'.
8
 *
8
 *
9
 * Cas d'utilisation DELETE :
9
 * Cas d'utilisation DELETE :
10
 *
10
 *
11
 * Sortie :
11
 * Sortie :
12
 * Type de sortie : json (par défaut), HTML en cas d'erreur.
12
 * Type de sortie : json (par défaut), HTML en cas d'erreur.
13
 *
13
 *
14
 * @internal   Mininum PHP version : 5.2
14
 * @internal   Mininum PHP version : 5.2
15
 * @category   CEL
15
 * @category   CEL
16
 * @package    Services
16
 * @package    Services
17
 * @subpackage Images
17
 * @subpackage Images
18
 * @version    0.1
18
 * @version    0.1
19
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
19
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
20
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
20
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
21
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
21
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
22
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
22
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
23
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
23
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
24
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
24
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
25
 */
25
 */
26
class CelImage extends Cel {
26
class CelImage extends Cel {
27
 
27
 
28
	/**
28
	/**
29
	 * Méthode appelée avec une requête de type GET.
29
	 * Méthode appelée avec une requête de type GET.
30
	 */
30
	 */
31
	public function getElement($params) {
31
	public function getElement($params) {
32
		$parametres = $this->traiterParametres(array('mode'), $params, false);
32
		$parametres = $this->traiterParametres(array('mode'), $params, false);
33
		extract($parametres);
33
		extract($parametres);
34
		$contenu = '';
34
		$contenu = '';
35
 
35
 
36
		$retour = null;
36
		$retour = null;
37
		if (isset($mode)) {
37
		if (isset($mode)) {
38
			$methode = $this->traiterNomMethodeGet($mode);
38
			$methode = $this->traiterNomMethodeGet($mode);
39
			if (method_exists($this, $methode)) {
39
			if (method_exists($this, $methode)) {
40
				$this->parametres = array_shift($params);
40
				$this->parametres = array_shift($params);
41
				$retour = $this->$methode();
41
				$retour = $this->$methode();
42
			} else {
42
			} else {
43
				$service = get_class($this);
43
				$service = get_class($this);
44
				$this->messages[] = "Ce type de mode '$mode' pour le service '$service' n'est pas disponible.";
44
				$this->messages[] = "Ce type de mode '$mode' pour le service '$service' n'est pas disponible.";
45
			}
45
			}
46
		} else {
46
		} else {
47
			$this->messages[] = "Vous devez indiquer un type de mode d'interrogation.";
47
			$this->messages[] = "Vous devez indiquer un type de mode d'interrogation.";
48
		}
48
		}
49
 
49
 
50
		if (is_null($retour)) {
50
		if (is_null($retour)) {
51
			$this->messages[] = "Un problème est survenu lors de l'appel au service CelImage";
51
			$this->messages[] = "Un problème est survenu lors de l'appel au service CelImage";
52
		}
52
		}
53
		$this->envoyerJson($retour);
53
		$this->envoyerJson($retour);
54
	}
54
	}
55
 
55
 
56
	private function getImage() {
56
	private function getImage() {
57
		$image = null;
57
		$image = null;
58
		if (isset($_GET['imgId'])) {
58
		if (isset($_GET['imgId'])) {
59
			$recherche = new RechercheImage($this->config);
59
			$recherche = new RechercheImage($this->config);
60
			$params = array('id_image' => $_GET['imgId'], 'transmission' => "1");
60
			$params = array('id_image' => $_GET['imgId'], 'transmission' => "1");
61
			$image = $recherche->rechercherImages(null, $params, 0, 1);
61
			$image = $recherche->rechercherImages(null, $params, 0, 1);
62
			if(!empty($image)) {
62
			if(!empty($image)) {
63
				$image = $image[0];
63
				$image = $image[0];
64
			}
64
			}
65
		}
65
		}
66
		return $image;
66
		return $image;
67
	}
67
	}
68
 
68
 
69
	/**
69
	/**
70
	 * Service fournissant la liste des ids des images liées à une observation.
70
	 * Service fournissant la liste des ids des images liées à une observation.
71
	 * Format de l'url du WS :
71
	 * Format de l'url du WS :
72
	 * /CelImage/liste-ids?obsId=[0-9]+ : ids des images liées à l'observation possédant l'identifiant 'obsId'.
72
	 * /CelImage/liste-ids?obsId=[0-9]+ : ids des images liées à l'observation possédant l'identifiant 'obsId'.
73
	 */
73
	 */
74
	private function getListeIds() {
74
	private function getListeIds() {
75
		$ids = array();
75
		$ids = array();
76
 
76
 
77
		if (isset($_GET['obsId'])) {
77
		if (isset($_GET['obsId'])) {
78
			$observations = $this->traiterValeursMultiples($_GET['obsId']);
78
			$observations = $this->traiterValeursMultiples($_GET['obsId']);
79
 
79
 
80
			if (! is_null($observations)) {
80
			if (! is_null($observations)) {
81
				$requete = 	'SELECT ce_observation, id_image '.
81
				$requete = 	'SELECT occurrence_id as ce_observation, id as id_image '.
82
							'FROM cel_images '.
82
							'FROM photo '.
83
							"WHERE ce_observation IN ($observations) ";
83
							"WHERE occurrence_id IN ($observations) ";
84
 
84
 
85
				$resultats = Cel::db()->requeter($requete);
85
				$resultats = Cel::db()->requeter($requete);
86
 
86
 
87
				$infos = array();
87
				$infos = array();
88
				if (is_array($resultats)) {
88
				if (is_array($resultats)) {
89
					$infos = $resultats;
89
					$infos = $resultats;
90
				}
90
				}
91
 
91
 
92
				foreach ($infos as $info) {
92
				foreach ($infos as $info) {
93
					if (is_numeric($info['id_image'])) {
93
					if (is_numeric($info['id_image'])) {
94
						$ids[$info['ce_observation']][] = (int) $info['id_image'];
94
						$ids[$info['ce_observation']][] = (int) $info['id_image'];
95
					}
95
					}
96
				}
96
				}
97
			}
97
			}
98
		}
98
		}
99
		return $ids;
99
		return $ids;
100
	}
100
	}
101
 
101
 
102
	/**
102
	/**
103
	 * Service permettant de recréer les miniatures pour des ids d'images
103
	 * Service permettant de recréer les miniatures pour des ids d'images
104
	 * fournis en entrée - @NOTE devrait peut-être être fait avec DELETE ? 
104
	 * fournis en entrée - @NOTE devrait peut-être être fait avec DELETE ? 
105
	 */
105
	 */
106
	protected function getRegenererMiniatures() {
106
	protected function getRegenererMiniatures() {
107
		$idsImages = array();
107
		$idsImages = array();
108
		$idsObs = array();
108
		$idsObs = array();
109
		// par image
109
		// par image
110
		if (!empty($_GET['ids-img'])) {
110
		if (!empty($_GET['ids-img'])) {
111
			$idsImages = explode(',', $_GET['ids-img']);
111
			$idsImages = explode(',', $_GET['ids-img']);
112
			$idsImages = array_unique($idsImages);
112
			$idsImages = array_unique($idsImages);
113
		} elseif (!empty($_GET['ids-obs'])) { // par obs
113
		} elseif (!empty($_GET['ids-obs'])) { // par obs
114
			$idsObs = explode(',', $_GET['ids-obs']);
114
			$idsObs = explode(',', $_GET['ids-obs']);
115
			$idsObs = array_unique($idsObs);
115
			$idsObs = array_unique($idsObs);
116
			// get id images selon id obs
116
			// get id images selon id obs
117
			$req = "SELECT DISTINCT id_image FROM cel_images WHERE ce_observation IN (";
117
			$req = "SELECT DISTINCT id as id_image FROM photo WHERE occurrence_id IN (";
118
			$req .= implode(',', $idsObs);
118
			$req .= implode(',', $idsObs);
119
			$req .= ");";
119
			$req .= ");";
120
			//var_dump($req);
120
			//var_dump($req);
121
			$resultats = Cel::db()->requeter($req);
121
			$resultats = Cel::db()->requeter($req);
122
			//var_dump($resultats);
122
			//var_dump($resultats);
123
			$idsImages = array();
123
			$idsImages = array();
124
			if ($resultats) {
124
			if ($resultats) {
125
				foreach ($resultats as $res) {
125
				foreach ($resultats as $res) {
126
					$idsImages[] = $res["id_image"];
126
					$idsImages[] = $res["id_image"];
127
				}
127
				}
128
			}
128
			}
129
		}
129
		}
130
		// a-t-on trouvé au moins une image ?
130
		// a-t-on trouvé au moins une image ?
131
		if (empty($idsImages)) {
131
		if (empty($idsImages)) {
132
			$this->envoyerMessageErreur(500, "Erreur: aucune image trouvée - avez-vous bien fourni des valeurs corrected pour un des paramètres \"ids-img\" ou \"ids-obs\" ?");
132
			$this->envoyerMessageErreur(500, "Erreur: aucune image trouvée - avez-vous bien fourni des valeurs corrected pour un des paramètres \"ids-img\" ou \"ids-obs\" ?");
133
			return false; // aucun id fourni
133
			return false; // aucun id fourni
134
		}
134
		}
135
		//var_dump($idsImages);
135
		//var_dump($idsImages);
136
 
136
 
137
		$lib = new ImageRecreation($this->config);
137
		$lib = new ImageRecreation($this->config);
138
		foreach ($idsImages as $id) {
138
		foreach ($idsImages as $id) {
139
			if (! is_numeric($id)) {
139
			if (! is_numeric($id)) {
140
				continue; // @TODO faire plutot un array_filter avant
140
				continue; // @TODO faire plutot un array_filter avant
141
			}
141
			}
142
			$id = intval($id);
142
			$id = intval($id);
143
			//echo "Regen [$id]\n";
143
			//echo "Regen [$id]\n";
144
			$lib->regenererMiniaturesPourId(array($id));
144
			$lib->regenererMiniaturesPourId(array($id));
145
		}
145
		}
146
		return "ok"; // aucune garantie, c'est juste pour faire style
146
		return "ok"; // aucune garantie, c'est juste pour faire style
147
	}
147
	}
148
 
148
 
149
	/**
149
	/**
150
	 * Méthode appelée avec une requête de type DELETE.
150
	 * Méthode appelée avec une requête de type DELETE.
151
	 * Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre
151
	 * Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre
152
	 * Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules
152
	 * Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules
153
	 *
153
	 *
154
	 * @param int uid[0] id utilisateur
154
	 * @param int uid[0] id utilisateur
155
	 * @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules
155
	 * @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules
156
	 *
156
	 *
157
	 */
157
	 */
158
	public function deleteElement($uid){
158
	public function deleteElement($uid){
159
		$this->controlerAccessibiliteWs();
159
		$this->controlerAccessibiliteWs();
160
		$this->controleAppelIpAutorisee();
160
		$this->controleAppelIpAutorisee();
161
 
161
 
162
		$idImage = isset($uid[0]) ? $uid[0] : '';
162
		$idImage = isset($uid[0]) ? $uid[0] : '';
163
		$this->verifierIdentifiantImage($idImage);
163
		$this->verifierIdentifiantImage($idImage);
164
		$idsImages = explode(',', $idImage);
164
		$idsImages = explode(',', $idImage);
165
 
165
 
166
		$gestionnaireImage = new GestionImage($this->config);
166
		$gestionnaireImage = new GestionImage($this->config);
167
		$suppressionImage = $gestionnaireImage->supprimerImage($idsImages);
167
		$suppressionImage = $gestionnaireImage->supprimerImage($idsImages);
168
 
168
 
169
		if ($suppressionImage) {
169
		if ($suppressionImage) {
170
			$this->envoyer('OK');
170
			$this->envoyer('OK');
171
		} else {
171
		} else {
172
			$this->envoyer("Au moins une image « $idImage » n'a pu être supprimée");
172
			$this->envoyer("Au moins une image « $idImage » n'a pu être supprimée");
173
		}
173
		}
174
	}
174
	}
175
 
175
 
176
	private function verifierIdentifiantImage($chaine) {
176
	private function verifierIdentifiantImage($chaine) {
177
		$ok = preg_match('/^(?:[0-9]+,)*[0-9]+$/', $chaine);
177
		$ok = preg_match('/^(?:[0-9]+,)*[0-9]+$/', $chaine);
178
		if ($ok == false) {
178
		if ($ok == false) {
179
			$msg = "Indiquer un ou plusieurs identifiants d'image séparés par des virgules.";
179
			$msg = "Indiquer un ou plusieurs identifiants d'image séparés par des virgules.";
180
			$this->envoyerMessageErreur(412, $msg);// Precondition Failed
180
			$this->envoyerMessageErreur(412, $msg);// Precondition Failed
181
		}
181
		}
182
		return $ok;
182
		return $ok;
183
	}
183
	}
184
}
184
}