Subversion Repositories eFlore/Applications.coel

Rev

Rev 1698 | Rev 1700 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1698 Rev 1699
1
<?php
1
<?php
2
/**
2
/**
3
 * Service fournissant des informations sur les collections et les structures répondant aux critères de recherche
3
 * Service fournissant des informations sur les collections et les structures répondant aux critères de recherche
4
 * fournis en paramêtre.
4
 * fournis en paramêtre.
5
 *
5
 *
6
 * @author Raphaël Droz <raphael@tela-botanica.org>
6
 * @author Raphaël Droz <raphael@tela-botanica.org>
7
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
7
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
10
 * @copyright 2009, 2013 Tela-Botanica
10
 * @copyright 2009, 2013 Tela-Botanica
11
 */
11
 */
12
class CoelRecherche extends Coel {
12
class CoelRecherche extends Coel {
13
 
13
 
14
	/**
14
	/**
15
	 * Méthode principale appelée avec une requête de type GET.
15
	 * Méthode principale appelée avec une requête de type GET.
16
	 * Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
16
	 * Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
17
	 */
17
	 */
18
	public function getElement($param = array()) {
18
	public function getElement($param = array()) {
19
		// Initialisation des variables
19
		// Initialisation des variables
20
		$info = array();
20
		$info = array();
21
				
21
				
22
		// Nour recherchons le type de requête demandé
22
		// Nour recherchons le type de requête demandé
23
		$type = $param[0];
23
		$type = $param[0];
24
				 
24
				 
25
		$methode = 'getElement'.$type;
25
		$methode = 'getElement'.$type;
26
		if (method_exists($this, $methode)) {
26
		if (method_exists($this, $methode)) {
27
			array_shift($param);
27
			array_shift($param);
28
			$info = $this->$methode($param);
28
			$info = $this->$methode($param);
29
		} else {
29
		} else {
30
			$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
30
			$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
31
		}
31
		}
32
		
32
		
33
		// Envoie sur la sortie standard
33
		// Envoie sur la sortie standard
34
		$this->envoyer($info);
34
		$this->envoyer($info);
35
	}
35
	}
36
	
36
	
37
 	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
37
 	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
38
 	 * restrictions.
38
 	 * restrictions.
39
	 * Appelée avec les paramêtres d'url suivant :
39
	 * Appelée avec les paramêtres d'url suivant :
40
	 * /CoelRecherche/ParDefaut/_
40
	 * /CoelRecherche/ParDefaut/_
41
	 * ou les _ représentent dans l'ordre : mots
41
	 * ou les _ représentent dans l'ordre : mots
42
	 * Si un des paramêtres est absent, il prendre la valeur *
42
	 * Si un des paramêtres est absent, il prendre la valeur *
43
	 */
43
	 */
44
	public function getElementParDefaut($param) {
44
	public function getElementParDefaut($param) {
45
		// Initialisation des variables
45
		// Initialisation des variables
46
		$info = array();
46
		$info = array();
47
				
47
				
48
		// Pré traitement des paramêtres
48
		// Pré traitement des paramêtres
49
		$p = $this->pretraiterParametresUrl($param);
49
		$p = $this->pretraiterParametresUrl($param);
50
 
50
 
51
        $fromClause = $whereClause = $joinClause = array();
51
        $fromClause = $whereClause = $joinClause = array();
52
        self::construireFromEtWhere($p, $fromClause, $joinClause, $whereClause).
52
        self::construireFromEtWhere($p, $fromClause, $joinClause, $whereClause);
53
		
53
 
54
		// Construction de la requête
54
		// Construction de la requête
55
		$requete = sprintf(
55
		$requete = sprintf(
56
            'SELECT %s cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom'
56
            'SELECT %s cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom'
57
            . ' FROM %s %s'
57
            . ' FROM %s %s'
58
            . ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d',
58
            . ' WHERE %s ORDER BY %s %s -- %s:%d',
59
 
59
 
60
            $this->distinct ? 'DISTINCT' : '',
60
            $this->distinct ? 'DISTINCT' : '',
61
 
61
 
62
            implode(',', $fromClause),
62
            implode(',', $fromClause),
63
            implode(' ', $joinClause),
63
            implode(' ', $joinClause),
64
 
64
 
65
            $whereClause ? implode(" AND ", $whereClause) : TRUE,
65
            $whereClause ? implode(" AND ", $whereClause) : TRUE,
66
            is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby,
66
            is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby,
-
 
67
 
67
            $this->start, $this->limit,
68
            $this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "",
68
            __FILE__, __LINE__);
69
            __FILE__, __LINE__);
69
 
70
 
70
		
71
		
71
		// Récupération des résultats
72
		// Récupération des résultats
72
		try {
73
		try {
73
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
74
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
74
			if ($donnees === false) {
75
			if ($donnees === false) {
75
				$this->messages[] = "La requête a retourné aucun résultat.";
76
				$this->messages[] = "La requête a retourné aucun résultat.";
76
			} else {
77
			} else {
77
				$info = $donnees;
78
				$info = $donnees;
78
			}
79
			}
79
		} catch (PDOException $e) {
80
		} catch (PDOException $e) {
80
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
81
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
81
		}
82
		}
82
		return $info;
83
		return $info;
83
	}
84
	}
84
	
85
	
85
	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
86
	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
86
 	 * restrictions.
87
 	 * restrictions.
87
	 * Appelée avec les paramêtres d'url suivant :
88
	 * Appelée avec les paramêtres d'url suivant :
88
	 * /CoelRecherche/ParDefaut/_
89
	 * /CoelRecherche/ParDefaut/_
89
	 * ou les _ représentent dans l'ordre : mots
90
	 * ou les _ représentent dans l'ordre : mots
90
	 * Si un des paramêtres est absent, il prendre la valeur *
91
	 * Si un des paramêtres est absent, il prendre la valeur *
91
	 */
92
	 */
92
	public function getElementNombre($param) {
93
	public function getElementNombre($param) {
93
		// Initialisation des variables
94
		// Initialisation des variables
94
		$info = array();
95
		$info = array();
95
				
96
				
96
		// Pré traitement des paramêtres
97
		// Pré traitement des paramêtres
97
		$p = $this->pretraiterParametresUrl($param);
98
		$p = $this->pretraiterParametresUrl($param);
98
 
99
 
99
        $fromClause = $whereClause = $joinClause = array();
100
        $fromClause = $whereClause = $joinClause = array();
100
        self::construireFromEtWhere($p, $fromClause, $joinClause, $whereClause).
101
        self::construireFromEtWhere($p, $fromClause, $joinClause, $whereClause);
101
 
102
 
102
		// Construction de la requête
103
		// Construction de la requête
103
		// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
104
		// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
104
		$requete = sprintf(
105
		$requete = sprintf(
105
            'SELECT %s COUNT(cs_id_structure) AS nbre, cc_id_collection '
106
            'SELECT %s COUNT(cs_id_structure) AS nbre, cc_id_collection '
106
            . ' FROM %s %s'
107
            . ' FROM %s %s'
107
            . ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d',
108
            . ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d',
108
 
109
 
109
            $this->distinct ? 'DISTINCT' : '',
110
            $this->distinct ? 'DISTINCT' : '',
110
 
111
 
111
            implode(',', $fromClause),
112
            implode(',', $fromClause),
112
            implode(' ', $joinClause),
113
            implode(' ', $joinClause),
113
 
114
 
114
            $whereClause ? implode(" AND ", $whereClause) : TRUE,
115
            $whereClause ? implode(" AND ", $whereClause) : TRUE,
115
            is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC' : $this->orderby,
116
            is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC' : $this->orderby,
116
            $this->start, $this->limit,
117
            $this->start, $this->limit,
117
            __FILE__, __LINE__);
118
            __FILE__, __LINE__);
118
 
119
 
119
 
120
 
120
		// Récupération des résultats
121
		// Récupération des résultats
121
		try {
122
		try {
122
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
123
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
123
			if ($donnees === false) {
124
			if ($donnees === false) {
124
				$this->messages[] = "La requête a retourné aucun résultat.";
125
				$this->messages[] = "La requête a retourné aucun résultat.";
125
			} else {
126
			} else {
126
				$info = $donnees['nbre'];
127
				$info = $donnees['nbre'];
127
			}
128
			}
128
		} catch (PDOException $e) {
129
		} catch (PDOException $e) {
129
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
130
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
130
		}
131
		}
131
 
132
 
132
		return $info;
133
		return $info;
133
	}
134
	}
134
	
135
	
135
	private function pretraiterParametresUrl($param) {
136
	private function pretraiterParametresUrl($param) {
136
		// Tableau des paramêtres qui peuvent être passés dans l'url
137
		// Tableau des paramêtres qui peuvent être passés dans l'url
137
		$params_passes = array('mots' => 'str', 
138
		$params_passes = array('mots' => 'str', 
138
			'sci' => 'bool', 
139
			'sci' => 'bool', 
139
			'bot' => 'int', 
140
			'bot' => 'int', 
140
			'zg' => 'str', 
141
			'zg' => 'str', 
141
			'p' => 'str', 
142
			'p' => 'str', 
142
			'pr' => 'int',
143
			'pr' => 'int',
143
			'str-d' => 'defaut',
144
			'str-d' => 'defaut',
144
			'veg' => 'int',
145
			'veg' => 'int',
145
			'projets' => 'int');
146
			'projets' => 'int');
146
		
147
		
147
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
148
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
148
		$this->debug[] = $param;
149
		$this->debug[] = $param;
149
		foreach ($params_passes as $param_passe => $type) {
150
		foreach ($params_passes as $param_passe => $type) {
150
			if (isset($p[$param_passe])) {
151
			if (isset($p[$param_passe])) {
151
				// Suppression des éventuels espaces en début et fin de chaine
152
				// Suppression des éventuels espaces en début et fin de chaine
152
				$valeur = trim($p[$param_passe]);
153
				$valeur = trim($p[$param_passe]);
153
				
154
				
154
				// Type de paramêtre chaine
155
				// Type de paramêtre chaine
155
				if ($type == 'str') {
156
				if ($type == 'str') {
156
					// Suppression des slash
157
					// Suppression des slash
157
					$valeur = stripslashes($valeur);
158
					$valeur = stripslashes($valeur);
158
					
159
					
159
					// Utilisation d'une recherche de chaîne exacte
160
					// Utilisation d'une recherche de chaîne exacte
160
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
161
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
161
						$valeur = '%'.$match[1].'%';
162
						$valeur = '%'.$match[1].'%';
162
					} else {
163
					} else {
163
						// Recherche de mots non liés
164
						// Recherche de mots non liés
164
						$mots = explode(' ', $valeur);
165
						$mots = explode(' ', $valeur);
165
						$valeur = '%'.implode ('%', $mots).'%';
166
						$valeur = '%'.implode ('%', $mots).'%';
166
					}
167
					}
167
					// Mise en place des quotes pour l'intérogation dans la bdd
168
					// Mise en place des quotes pour l'intérogation dans la bdd
168
					$valeur = $this->bdd->quote($valeur);
169
					$valeur = $this->bdd->quote($valeur);
169
				}
170
				}
170
				// Type de paramêtre booléen
171
				// Type de paramêtre booléen
171
				if ($type == 'bool') {
172
				if ($type == 'bool') {
172
					if (preg_match('/^[0]$/', $valeur)) {
173
					if (preg_match('/^[0]$/', $valeur)) {
173
						$valeur = false;
174
						$valeur = false;
174
					} else if (preg_match('/^[1]$/', $valeur)) {
175
					} else if (preg_match('/^[1]$/', $valeur)) {
175
						$valeur = true;
176
						$valeur = true;
176
					} else {
177
					} else {
177
						$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
178
						$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
178
						$valeur = null;
179
						$valeur = null;
179
					}
180
					}
180
					
181
					
181
				}
182
				}
182
				// Type de paramêtre entier
183
				// Type de paramêtre entier
183
				if ($type == 'int') {
184
				if ($type == 'int') {
184
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
185
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
185
						$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
186
						$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
186
							"séparés par des virgules et non '$valeur'.";
187
							"séparés par des virgules et non '$valeur'.";
187
						$valeur = null;
188
						$valeur = null;
188
					}
189
					}
189
				}
190
				}
190
				
191
				
191
				$p[$param_passe] = $valeur;
192
				$p[$param_passe] = $valeur;
192
			}
193
			}
193
		}
194
		}
194
		
195
		
195
		return $p;
196
		return $p;
196
	}
197
	}
197
	
198
	
198
	static function construireFromEtWhere($p, &$from, &$join, &$where) {
199
	static function construireFromEtWhere($p, &$from, &$join, &$where) {
199
        $from = array('coel_collection');
200
        $from = array('coel_collection');
200
        $join = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)');
201
        $join = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)');
201
		$where = array();
202
		$where = array();
202
 
203
 
203
		// Gestion du from en fonction des paramêtres
204
		// Gestion du from en fonction des paramêtres
204
		if (isset($p['str-d'])) {// ATTENTION : Remplace $from, doit être situé en première position!
205
		if (isset($p['str-d'])) {// ATTENTION : Remplace $from, doit être situé en première position!
205
			$from = array('coel_structure');
206
			$from = array('coel_structure');
206
            $join = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)');
207
            $join = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)');
207
		}
208
		}
208
		
209
		
209
		// Construire from et where en fonction des paramêtres 
210
		// Construire from et where en fonction des paramêtres 
210
		if (isset($p['mots'])) {
211
		if (isset($p['mots'])) {
211
			$where[] = '(' . implode(' OR ', array(
212
			$where[] = '(' . implode(' OR ', array(
212
				"cc_nom LIKE {$p['mots']}",
213
				"cc_nom LIKE {$p['mots']}",
213
				"cc_truk_nom_alternatif LIKE {$p['mots']}",
214
				"cc_truk_nom_alternatif LIKE {$p['mots']}",
214
				"cc_truk_code LIKE {$p['mots']}",
215
				"cc_truk_code LIKE {$p['mots']}",
215
				"cc_description LIKE {$p['mots']}",
216
				"cc_description LIKE {$p['mots']}",
216
				"cc_description_specialiste LIKE {$p['mots']}",
217
				"cc_description_specialiste LIKE {$p['mots']}",
217
				"cc_historique LIKE {$p['mots']}",
218
				"cc_historique LIKE {$p['mots']}",
218
				"cs_nom LIKE {$p['mots']}",
219
				"cs_nom LIKE {$p['mots']}",
219
				"cs_truk_nom_alternatif LIKE {$p['mots']}",
220
				"cs_truk_nom_alternatif LIKE {$p['mots']}",
220
				"cs_description LIKE {$p['mots']}",
221
				"cs_description LIKE {$p['mots']}",
221
				"cs_adresse_01 LIKE {$p['mots']}",
222
				"cs_adresse_01 LIKE {$p['mots']}",
222
				"cs_adresse_02 LIKE {$p['mots']}",
223
				"cs_adresse_02 LIKE {$p['mots']}",
223
				"cs_ville LIKE {$p['mots']}",
224
				"cs_ville LIKE {$p['mots']}",
224
				"cs_truk_identifiant_alternatif LIKE {$p['mots']}",
225
				"cs_truk_identifiant_alternatif LIKE {$p['mots']}",
225
				"cs_condition_acces LIKE {$p['mots']}",
226
				"cs_condition_acces LIKE {$p['mots']}",
226
				"cs_condition_usage LIKE {$p['mots']}",
227
				"cs_condition_usage LIKE {$p['mots']}",
227
				"cs_truk_telephone LIKE {$p['mots']}",
228
				"cs_truk_telephone LIKE {$p['mots']}",
228
				"cs_courriel LIKE {$p['mots']}",
229
				"cs_courriel LIKE {$p['mots']}",
229
				"cs_truk_url LIKE {$p['mots']}") . ')');
230
				"cs_truk_url LIKE {$p['mots']}") . ')');
230
		}
231
		}
231
 
232
 
232
		if (isset($p['sci'])) {
233
		if (isset($p['sci'])) {
233
			if ($p['sci'] === true) {
234
			if ($p['sci'] === true) {
234
				$where[] = 'csv_mark_visite_avec_motif = 1';
235
				$where[] = 'csv_mark_visite_avec_motif = 1';
235
			} else if ($p['sci'] === false) {
236
			} else if ($p['sci'] === false) {
236
				$where[] = 'csv_mark_acces_ss_motif = 1';
237
				$where[] = 'csv_mark_acces_ss_motif = 1';
237
			}
238
			}
238
		}
239
		}
239
 
240
 
240
		if (isset($p['bot'])) {
241
		if (isset($p['bot'])) {
241
			$where[] = "ccb_ce_truk_type IN ({$p['bot']})";
242
			$where[] = "ccb_ce_truk_type IN ({$p['bot']})";
242
		}
243
		}
243
		if (isset($p['zg'])) {
244
		if (isset($p['zg'])) {
244
			$where[] = "cc_truk_couverture_lieu LIKE {$p['zg']}";
245
			$where[] = "cc_truk_couverture_lieu LIKE {$p['zg']}";
245
		}
246
		}
246
		if (isset($p['p'])) {
247
		if (isset($p['p'])) {
247
			$where[] = "cp_fmt_nom_complet LIKE {$p['p']}";
248
			$where[] = "cp_fmt_nom_complet LIKE {$p['p']}";
248
		}
249
		}
249
		if (isset($p['pr'])) {
250
		if (isset($p['pr'])) {
250
			$where[] = "ccap_id_role IN ({$p['pr']})";
251
			$where[] = "ccap_id_role IN ({$p['pr']})";
251
		}
252
		}
252
		if (isset($p['str-d'])) {
253
		if (isset($p['str-d'])) {
253
			$where[] = 'cs_ce_truk_pays = 2654';
254
			$where[] = 'cs_ce_truk_pays = 2654';
254
            $where[] = "cs_code_postal LIKE '{$p['str-d']}%'";
255
            $where[] = "cs_code_postal LIKE '{$p['str-d']}%'";
255
		}
256
		}
256
 
257
 
257
		if (isset($p['veg'])) {
258
		if (isset($p['veg'])) {
258
			$veg = explode(',', $p['veg']);
259
			$veg = explode(',', $p['veg']);
259
			$veg_nbre = count($veg);
260
			$veg_nbre = count($veg);
260
			
261
			
261
			if ($veg_nbre == 1) {
262
			if ($veg_nbre == 1) {
262
				$where[] = "ccb_truk_nature LIKE '%{$p['veg']}%'";
263
				$where[] = "ccb_truk_nature LIKE '%{$p['veg']}%'";
263
			} else {
264
			} else {
264
				$recherche = array();
265
				$recherche = array();
265
				foreach ($veg as $id) {
266
				foreach ($veg as $id) {
266
					$recherche[] = "ccb_truk_nature LIKE '%$id%'";
267
					$recherche[] = "ccb_truk_nature LIKE '%$id%'";
267
				}
268
				}
268
				$where[] = '('.implode(' OR ', $recherche).') ';
269
				$where[] = '('.implode(' OR ', $recherche).') ';
269
			}
270
			}
270
		}
271
		}
271
		
272
		
272
		if (isset($p['projets'])) {
273
		if (isset($p['projets'])) {
273
			$where[] = "cc_ce_projet IN ({$p['projets']})";
274
			$where[] = "cc_ce_projet IN ({$p['projets']})";
274
            $where[] = "cs_ce_projet IN ({$p['projets']})";
275
            $where[] = "cs_ce_projet IN ({$p['projets']})";
275
		}
276
		}
276
		
277
		
277
 
278
 
278
		if (isset($p['sci'])) {
279
		if (isset($p['sci'])) {
279
			$join[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)';
280
			$join[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)';
280
		}
281
		}
281
		if (isset($p['bot']) || isset($p['veg'])) {
282
		if (isset($p['bot']) || isset($p['veg'])) {
282
			$join[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)';
283
			$join[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)';
283
		}
284
		}
284
		if (isset($p['p']) || isset($p['pr'])) {
285
		if (isset($p['p']) || isset($p['pr'])) {
285
			$join[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)';
286
			$join[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)';
286
		}
287
		}
287
		if (isset($p['p'])) {
288
		if (isset($p['p'])) {
288
			$join[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)';
289
			$join[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)';
289
		}
290
		}
290
    }
291
    }
291
}
292
}