Subversion Repositories eFlore/Applications.coel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1497 jpm 1
<?php
2
/**
3
* Service fournissant la liste des relations "publication à personne".
4
* Encodage en entrée : utf8
5
* Encodage en sortie : utf8
6
*
1510 jpm 7
* @category PHP 5.2
8
* @package jrest
9
* @author Aurélien PERONNET <aurelien@tela-botanica.org>
10
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
* @copyright © 2009, Tela Botanica
12
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
* @version $Id$
15
* @link /doc/jrest/
1497 jpm 16
*/
17
class CoelPublicationAPersonne extends Coel {
18
 
19
	const ROLE_AUTEUR = 2360;
20
 
21
	/** Contient les infos sur les tables gérées par ce service.
22
	 * Bien respecter l'ordre avec en premier les tables liées et en dernier la table établissant la relation. */
23
	protected $tables = array(	119 => array(	'nom' => 'coel_publication_a_personne',
24
												'prefixe' => 'cpuap',
25
												'id' => array('cpuap_id_personne', 'cpuap_id_publication', 'cpuap_id_role')));
26
 
27
	/**
28
	 * Méthode appelée avec une requête de type GET.
29
	 */
30
	public function getElement($param = array()) {
31
		// Initialisation des variables
32
		$info = array();
33
 
34
		// Pré traitement des paramêtres
35
		$p = $this->traiterParametresUrl(array('id_publication', 'id_personne', 'id_role'), $param, false);
36
 
37
		// Construction de la requête
38
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT ' : 'SELECT ').
39
					'	cpu.*, cpuap.*, cp_id_personne, cp_ce_projet, cp_prenom, cp_nom, cp_fmt_nom_complet, cp_code_postal, cp_truk_courriel, cp_ville '.
40
					'FROM coel_publication_a_personne AS cpuap '.
41
					'	LEFT JOIN coel_meta_historique_ligne ON (cpuap_ce_meta = cmhl_id_historique_ligne) '.
42
					'	LEFT JOIN coel_personne AS cp ON (cpuap_id_personne = cp_id_personne) '.
43
					'	LEFT JOIN coel_publication AS cpu ON (cpuap_id_publication = cpu_id_publication) '.
44
					((count($p) != 0) ? 'WHERE ' : '').
45
					(isset($p['id_personne']) 		? "AND cpuap_id_personne IN ({$p['id_personne']}) " : '').
46
					(isset($p['id_publication']) 	? "AND cpuap_id_publication = '{$p['id_publication']}' " : '').
47
					(isset($p['id_role'])			? "AND cpuap_id_role IN ({$p['id_role']}) " : '').
48
					'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cpuap_ce_meta DESC').' ';
49
		$requete = str_replace('WHERE AND', 'WHERE', $requete);
50
		$requeteCount = $requete;
51
		$requete .= "LIMIT $this->start, $this->limit ";
52
 
53
		// Récupération des résultats
54
		try {
55
			$donnees = (count($p) == 3) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll();
56
			if ($donnees === false) {
57
				$this->messages[] = "La requête n'a retourné aucun résultat.";
58
			}
59
			$nbElements = $this->bdd->query($requeteCount)->rowCount();
60
 
61
			$info['nbElements'] = $nbElements;
62
			$info['publicationsAPersonne'] = $donnees;
63
 
64
		} catch (PDOException $e) {
65
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
66
		}
67
 
68
		// Envoie sur la sortie standard
69
		$this->envoyer($info);
70
	}
71
 
72
	/**
73
	 * Méthode appelée pour ajouter un élément.
74
	 */
75
	public function createElement($params) {
76
		// Identification de l'utilisateur
77
		list($id_utilisateur, $id_session) = $this->getIdentification($params);
78
 
79
		// Contrôle du non détournement de l'utilisateur
80
		if ($this->etreAutorise($id_utilisateur)) {
81
			$auteurs = $role = $ordre_des_auteurs = $publications = array();
82
			// Traitement spécial pour ajouter plusieurs personnes liées à une publication à la fois...
83
			if (isset($params['cpuap_id_auteur'])) {
84
				$auteurs = explode(',', $params['cpuap_id_auteur']);
85
				unset($params['cpuap_id_auteur']);
86
			}
87
 
88
			if (isset($params['cpuap_id_role'])) {
89
				$role = explode(',', $params['cpuap_id_role']);
90
			}
91
 
92
			if (isset($params['cpuap_ordre'])) {
93
				$ordre_des_auteurs = explode(',', $params['cpuap_ordre']);
94
				unset($params['cpuap_ordre']);
95
			}
96
 
97
			// Traitement spécial pour ajouter plusieurs publications liées à une personne à la fois...
98
			if (isset($params['cpuap_id_publication'])) {
99
				$publications = explode(',', $params['cpuap_id_publication']);
100
				if (count($publications) > 1)	{
101
					unset($params['cpuap_id_publication']);
102
				}
103
			}
104
 
105
			if (count($auteurs) != 0 || count($publications) != 0) {
106
				// Formulaire Publication : nous lions des auteurs à une publication
107
				// Cas où il y a une seule publication et un ou plusieurs auteurs ; c'est donc une liaison d'une publi a plusieurs personne avec le role "auteur"
108
				if (count($auteurs) >= 1 && count($publications) == 1 && (count($role) == 1 && $role[0] == self::ROLE_AUTEUR))	{
109
					$compteur = 0;
110
					foreach ($auteurs as $params['cpuap_id_personne']) {
111
						$params['cpuap_ordre'] = $ordre_des_auteurs[$compteur++];
112
 
113
						// Vérification des tables à vraiment mettre à jour en fonction des données passées.
114
			   			$tables_a_modifier = $this->recupererTablesAModifier($params);
115
 
116
			   			// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
117
			   			// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
118
			   			reset($tables_a_modifier);
119
						while (list($table_id, $table) = each($tables_a_modifier)) {
120
				   			if (!is_null($table['champs'])) {
121
				   				try {
122
				   					$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
123
				   				} catch (PDOException $e) {
124
									$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
125
								}
126
				   			}
127
				   		}
128
					}
129
				}
130
				// Formulaire Personne : nous lions des publications à une personne
131
				// Cas où il y a plusieurs publications ; c'est donc une liaison de plusieurs publis a une personne avec n roles
132
				else if (count($auteurs) == 1 && count($publications) >= 1 && (count($role) > 1 || (count($role) == 1 && $role[0] != self::ROLE_AUTEUR)) )	{
133
					$params['cpuap_id_personne'] = $auteurs[0];
134
					for ($i = 0; $i < count($publications); $i++ )	{
135
						$params['cpuap_id_publication'] = $publications[$i];
136
						$params['cpuap_id_role'] = $role[$i];
137
 
138
						// Vérification des tables à vraiment mettre à jour en fonction des données passées.
139
			   			$tables_a_modifier = $this->recupererTablesAModifier($params);
140
 
141
			   			// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
142
			   			// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
143
			   			reset($tables_a_modifier);
144
						while (list($table_id, $table) = each($tables_a_modifier)) {
145
				   			if (!is_null($table['champs'])) {
146
				   				try {
147
				   					$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
148
				   				} catch (PDOException $e) {
149
									$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
150
								}
151
				   			}
152
				   		}
153
					}
154
				}
155
			} else {
156
				$this->messages[] = "Aucun identifiant d'auteur ou de publication fournis";
157
			}
158
	   	} else {
159
	   		$this->messages[] = "Il faut être identifié pour accéder à ce service";
160
	   	}
161
 
162
		// Envoie sur la sortie standard
163
		$this->envoyer();
164
	}
165
 
166
	/**
167
	 * Méthode appelée pour mettre à jour un élément
168
	 */
169
	public function updateElement($uid, $params) {
170
		// Vérification de la présence des id passés par l'url
171
		if (!isset($uid[0]) && !isset($uid[1]) && !isset($uid[2])) {
172
			$this->messages[] = 'Aucun identifiant de publication, personne et role a été passé. Vous ne devriez pas avoir accès à ce service.';
173
		} else {
174
			// Identification de l'utilisateur
175
			list($id_utilisateur, $id_session) = $this->getIdentification($params);
176
			// Contrôle du non détournement de l'utilisateur
177
			if ($this->etreAutorise($id_utilisateur)) {
178
				// Vérification des tables à vraiment mettre à jour en fonction des données passées.
179
   				$tables_a_modifier = $this->recupererTablesAModifier($params);
180
 
181
   				$id_publication = $params['cpuap_id_publication'];
182
   				$auteurs = explode(',', $params['cpuap_id_auteur']);
183
   				$id_role = $params['cpuap_id_role'];
184
   				$ordre = explode(',', $params['cpuap_ordre']);
185
 
186
   				if (count($auteurs) != 0 && $params['cpuap_id_publication'] != '') {
187
   					$compteur = 0;
188
					foreach ($auteurs as $auteur) {
189
		   				$params = array('cpuap_id_publication' => $id_publication,
190
		   					'cpuap_id_personne' => $auteur,
191
		   					'cpuap_id_role' => $id_role,
192
		   					'cpuap_ordre' => $ordre[$compteur++]);
193
 
194
						$tables_a_modifier = $this->recupererTablesAModifier($params);
195
						$table = $tables_a_modifier[119];
196
 
197
						if ($this->avoirEnregistrement($table)) {
198
							$resultat = $this->supprimer($table);
199
							if ($resultat === true) {
200
								// Historisation (Ajout des méta-données)
201
								$cle = $this->recupererCle($table);
202
								$this->historiser(119, $cle, 'NULL', $id_utilisateur, 3, $id_session);
203
							}
204
						}
205
 
206
				   		reset($tables_a_modifier);
207
						while (list($table_id, $table) = each($tables_a_modifier)) {
208
				   			if (!is_null($table['champs'])) {
209
				   				try {
210
					   				$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
211
				   				} catch (PDOException $e) {
212
									$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
213
								}
214
				   			}
215
				   		}
216
					}
217
				} else {
218
					$this->messages[] = "Aucun identifiant d'auteur et de publication fournis";
219
				}
220
			} else {
221
	   			$this->messages[] = "Il faut être identifié pour accéder à ce service";
222
	   		}
223
	   	}
224
 
225
		// Envoie sur la sortie standard
226
		$this->envoyer();
227
	}
228
 
229
	/**
230
	 * Méthode appelée pour supprimer un élément
231
	 */
232
	public function deleteElement($uid) {
233
	   	// NOTES : la suppression ne supprime pas les personnes mais seulements les relations
234
 
235
	    // Vérification de la présence des id passés par l'url
236
		if (!isset($uid[0]) || !isset($uid[1])) {
237
				$this->messages[] = "Identifiant de relations ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
238
		} else {
239
			// Identification de l'utilisateur
240
			list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
241
 
242
			// Contrôle du non détournement de l'utilisateur
243
			if ($this->etreAutorise($id_utilisateur)) {
244
				// Récupération des identifiant à supprimer
245
				$identifiants = array();
246
				$identifiants_agreges = explode(',', rtrim($uid[1], ','));
247
				foreach ($identifiants_agreges as $identifiant) {
248
					$identifiants[] = explode('-', $identifiant);
249
				}
250
 
251
		   		if (count($identifiants) == 0) {
252
		   			$this->messages[] = "Aucun enregistrement n'a été supprimé.";
253
		   		} else {
254
			   		try {
255
				   		foreach ($identifiants as $id) {
256
				   			if (count($id) == 1) { // Seulement des id de publication
257
					   			// Suppression en une seule fois toutes les relations d'une publication
258
				   				$params = array('cpuap_id_publication' => $id[0]);
1571 jpm 259
					   		} else if (count($id) == 3) { // Tous les id...
1497 jpm 260
				   				// Suppression d'une seule relation particulière
261
					   			$params = array('cpuap_id_publication' => $id[0], 'cpuap_id_personne' => $id[1], 'cpuap_id_role' => $id[2]);
262
					   		}
263
 
264
							$tables_a_modifier = $this->recupererTablesAModifier($params);
265
							$table = $tables_a_modifier[119];
266
 
267
							if ($this->avoirEnregistrement($table)) {
268
								$resultat = $this->supprimer($table);
269
								if ($resultat === true) {
270
									// Historisation (Ajout des méta-données)
271
									$cle = $this->recupererCle($table);
272
									$this->historiser(119, $cle, 'NULL', $id_utilisateur, 3, $id_session);
273
								}
274
							}
275
			   			}
276
				   	} catch (PDOException $e) {
277
						$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
278
					}
279
		   		}
280
			}
281
		}
282
 
283
		// Envoie sur la sortie standard
284
		$this->envoyer();
285
	}
286
}
287
?>