Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 864 | Rev 933 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 864 Rev 918
Line 124... Line 124...
124
 
124
 
125
		// parser la requête et filtrer les paramètres valides
125
		// parser la requête et filtrer les paramètres valides
126
		// en cas d'accès HTTP
126
		// en cas d'accès HTTP
127
		if(array_key_exists('QUERY_STRING', $_SERVER)) {
127
		if (array_key_exists('QUERY_STRING', $_SERVER)) {
128
			self::requestParse($uri, $params);
-
 
129
		}
128
			self::requestParse($uri, $params);
130
		// en cas d'accès phpunit
-
 
131
		else {
129
		} else {// en cas d'accès phpunit
132
			$uri = $ressources;
130
			$uri = $ressources;
Line 133... Line 131...
133
		}
131
		}
134
 
132
 
-
 
133
		// renvoie du plain/text d'aide (cf fin de programme)
-
 
134
		if (count($uri) == 1 && $uri[0] == 'aide') {
Line 135... Line 135...
135
		// renvoie du plain/text d'aide (cf fin de programme)
135
			return self::aide();
-
 
136
		}
-
 
137
 
136
		if(count($uri) == 1 && $uri[0] == 'aide') return self::aide();
138
 
137
 
139
		if (is_null($parametres)) {
138
 
140
			$parametres = Array();
139
		if(is_null($parametres)) $parametres = Array();
141
		}
Line 166... Line 168...
166
		// reformate les résultats pour les indexer par coste:nn par défaut
168
		// reformate les résultats pour les indexer par coste:nn par défaut
167
		// cependant le paramètre retour.indexBy permet de choisir une indexation par num_nom de bdtfx
169
		// cependant le paramètre retour.indexBy permet de choisir une indexation par num_nom de bdtfx
168
		$clef_index = $params['retour.indexBy'] == 'coste' ? 'coste:nn' : 'bdtfx:nn';
170
		$clef_index = $params['retour.indexBy'] == 'coste' ? 'coste:nn' : 'bdtfx:nn';
169
		$res2 = array();
171
		$res2 = array();
170
		foreach($res as $v) {
172
		foreach ($res as $v) {
-
 
173
			if (!$v[$clef_index]) {
171
			if(!$v[$clef_index]) throw new Exception('format error: index NULL, use retour.indexBy=coste', 409);
174
				throw new Exception('format error: index NULL, use retour.indexBy=coste', 409);
-
 
175
			}
172
			$res2[$v[$clef_index]] = $v;
176
			$res2[$v[$clef_index]] = $v;
173
		}
177
		}
Line 174... Line 178...
174
 
178
 
175
		// l'appelant s'occupera du json_encode()
179
		// l'appelant s'occupera du json_encode()
176
		// même si ça démange d'exit'er ici
180
		// même si ça démange d'exit'er ici
-
 
181
		header("Content-Type: application/json; charset=utf-8");
177
		header("Content-Type: application/json; charset=utf-8");
182
		return array('entete' => array(
178
		return array('entete' => array('depart' => $params['navigation.depart'],
183
			'depart' => $params['navigation.depart'],
179
									   'limite' => $params['navigation.limite'],
184
			'limite' => $params['navigation.limite'],
180
									   'total' => count($res2),
185
			'total' => count($res2),
181
									   'match' => $matches),
186
			'match' => $matches),
Line 195... Line 200...
195
		$champs_valides_non_formattes = NULL;
200
		$champs_valides_non_formattes = NULL;
196
		$champs_valides = self::sqlSelectFields($params, $champs_valides_non_formattes);
201
		$champs_valides = self::sqlSelectFields($params, $champs_valides_non_formattes);
Line 197... Line 202...
197
 
202
 
198
		// joins:
203
		// joins:
199
		$other_join = self::sqlAddJoins($params, $champs_valides_non_formattes);
-
 
200
		$req = sprintf(<<<EOF
204
		$other_join = self::sqlAddJoins($params, $champs_valides_non_formattes);
201
SELECT SQL_CALC_FOUND_ROWS  %s
205
		$requete_tpl = "SELECT SQL_CALC_FOUND_ROWS  %s".
202
FROM tb_eflore.coste_v2_00 c
206
			"FROM tb_eflore.coste_v2_00 c ".
203
LEFT JOIN tela_prod_wikini.florecoste_pages dsc ON c.page_wiki_dsc = dsc.tag AND dsc.latest = 'Y'
207
			"	LEFT JOIN tela_prod_wikini.florecoste_pages dsc ON c.page_wiki_dsc = dsc.tag AND dsc.latest = 'Y' ".
204
LEFT JOIN tela_prod_wikini.florecoste_pages cle ON c.page_wiki_cle = cle.tag AND cle.latest = 'Y'
208
			"	LEFT JOIN tela_prod_wikini.florecoste_pages cle ON c.page_wiki_cle = cle.tag AND cle.latest = 'Y' ".
205
%s
209
			" %s ".
206
WHERE %s ORDER BY c.num_nom LIMIT %u, %u -- %s
-
 
207
EOF
210
			"WHERE %s ORDER BY c.num_nom LIMIT %u, %u -- %s ";
208
					   ,
211
		$req = sprintf($requete_tpl,
209
					   $champs_valides, // dans le SELECT (parmi champs coste_v2_00)
212
			$champs_valides, // dans le SELECT (parmi champs coste_v2_00)
210
					   // autre join, si nécessaire
213
			// autre join, si nécessaire
-
 
214
			$other_join ? $other_join : '',
211
					   $other_join ? $other_join : '',
215
 
212
					   // where
216
			// where
Line 213... Line 217...
213
					   $constraints ? implode(' AND ', $constraints) : '1',
217
			$constraints ? implode(' AND ', $constraints) : '1',
214
 
218
 
Line 218... Line 222...
218
					   __FILE__ . ':' . __LINE__);
222
			__FILE__ . ':' . __LINE__);
Line 219... Line 223...
219
		
223
 
220
		return $req;
224
		return $req;
Line 221... Line -...
221
	}
-
 
222
 
-
 
223
 
-
 
224
 
225
	}
225
 
226
 
226
	// SQL helpers
227
	// SQL helpers
227
	// le préfix de coste_v2_00 est "c"
228
	// le préfix de coste_v2_00 est "c"
228
	// le préfix de florecoste_pages sur la description est est "dsc"
229
	// le préfix de florecoste_pages sur la description est est "dsc"
229
	// le préfix de florecoste_pages sur la clef de détermination est est "cle"
230
	// le préfix de florecoste_pages sur la clef de détermination est est "cle"
230
	static function sqlAddConstraint($params, $db) {
231
	static function sqlAddConstraint($params, $db) {
231
		$stack = array();
232
		$stack = array();
232
		if(!empty($params['masque.ns'])) {
233
		if (!empty($params['masque.ns'])) {
233
			if($params['recherche'] == 'etendue')
234
			if ($params['recherche'] == 'etendue') {
234
				$stack[] = 'c.nom_sci LIKE ' . $db->proteger('%' . trim($params['masque.ns']) . '%');
235
				$stack[] = 'c.nom_sci LIKE '.$db->proteger('%' . trim($params['masque.ns']).'%');
235
			elseif($params['recherche'] == 'floue')
236
			} elseif($params['recherche'] == 'floue') {
236
				$stack[] = sprintf(self::$soundex_scheme,
237
				$stack[] = sprintf(self::$soundex_scheme,
237
								   'c.nom_sci',
238
					'c.nom_sci',
238
								   $db->proteger('%' . trim($params['masque.ns']) . '%'));
239
					$db->proteger('%'.trim($params['masque.ns']).'%'));
239
			else
240
			} else {
-
 
241
				$stack[] = 'c.nom_sci = '.$db->proteger(trim($params['masque.ns']));
Line 240... Line 242...
240
				$stack[] = 'c.nom_sci = ' . $db->proteger(trim($params['masque.ns']));
242
			}
241
		}
243
		}
242
 
244
 
243
		// le masque sur texte est toujours un LIKE() "étendue", sauf si "floue" spécifié
245
		// le masque sur texte est toujours un LIKE() "étendue", sauf si "floue" spécifié
Line 288... Line 290...
288
			}
290
			}
289
			if($params['_ids']['bdtfx']) {
291
			if ($params['_ids']['bdtfx']) {
290
				$o_stack[] = sprintf("c.flore_bdtfx_nn IN (%s)", implode(',', $params['_ids']['bdtfx']));
292
				$o_stack[] = sprintf("c.flore_bdtfx_nn IN (%s)", implode(',', $params['_ids']['bdtfx']));
291
			}
293
			}
292
		}
294
		}
-
 
295
		if ($o_stack) {
293
		if($o_stack) $stack[] = '(' . implode(' OR ', $o_stack) . ')';
296
			$stack[] = '(' . implode(' OR ', $o_stack) . ')';
-
 
297
		}
Line 294... Line 298...
294
 
298
 
295
		return $stack;
299
		return $stack;
Line 303... Line 307...
303
		$champs = $params['retour.champs'];
307
		$champs = $params['retour.champs'];
304
		// champs coste_v2_00
308
		// champs coste_v2_00
305
		$c = self::addSQLToFieldSynonym(explode(',', $champs));
309
		$c = self::addSQLToFieldSynonym(explode(',', $champs));
306
		if(isset($c['*'])) {
310
		if (isset($c['*'])) {
307
			$t = array_diff_key(self::$allow_champs, array_flip(self::$special_champs));
311
			$t = array_diff_key(self::$allow_champs, array_flip(self::$special_champs));
308
		}
-
 
309
		else {
312
		} else {
310
			// just loop below
313
			// just loop below
311
			$t = $c;
314
			$t = $c;
312
		}
315
		}
Line 313... Line 316...
313
 
316
 
Line 392... Line 395...
392
 
395
 
393
		// TODO: use filter_input(INPUT_GET);
396
		// TODO: use filter_input(INPUT_GET);
394
		// renvoie FALSE ou NULL si absent ou invalide
397
		// renvoie FALSE ou NULL si absent ou invalide
395
		$p['navigation.limite'] = filter_var(@$params['navigation.limite'],
398
		$p['navigation.limite'] = filter_var(@$params['navigation.limite'],
396
												  FILTER_VALIDATE_INT,
399
			FILTER_VALIDATE_INT,
-
 
400
			array('options' => array(
397
												  array('options' => array('default' => NULL,
401
				'default' => NULL,
398
																		   'min_range' => 1,
402
				'min_range' => 1,
399
																		   'max_range' => _COSTE_TEXTE_MAX_RESULT_LIMIT)));
403
				'max_range' => _COSTE_TEXTE_MAX_RESULT_LIMIT)));
400
		$p['navigation.depart'] = filter_var(@$params['navigation.depart'],
404
		$p['navigation.depart'] = filter_var(@$params['navigation.depart'],
401
												  FILTER_VALIDATE_INT,
405
			FILTER_VALIDATE_INT,
-
 
406
			array('options' => array(
402
												  array('options' => array('default' => NULL,
407
				'default' => NULL,
403
																		   'min_range' => 0,
408
				'min_range' => 0,
404
																		   'max_range' => _COSTE_TEXTE_MAX_COSTE_NN)));
409
				'max_range' => _COSTE_TEXTE_MAX_COSTE_NN)));
405
		$p['masque.page'] = filter_var(@$params['masque.page'],
410
		$p['masque.page'] = filter_var(@$params['masque.page'],
406
												  FILTER_VALIDATE_INT,
411
			FILTER_VALIDATE_INT,
-
 
412
			array('options' => array(
407
												  array('options' => array('default' => NULL,
413
				'default' => NULL,
408
																		   'min_range' => 0,
414
				'min_range' => 0,
409
																		   'max_range' => _COSTE_TEXTE_MAX_COSTE_PAGE)));
415
				'max_range' => _COSTE_TEXTE_MAX_COSTE_PAGE)));
410
		$p['masque.tome'] = filter_var(@$params['masque.tome'],
416
		$p['masque.tome'] = filter_var(@$params['masque.tome'],
411
												  FILTER_VALIDATE_INT,
417
			FILTER_VALIDATE_INT,
-
 
418
			array('options' => array(
412
												  array('options' => array('default' => NULL,
419
				'default' => NULL,
413
																		   'min_range' => 0,
420
				'min_range' => 0,
414
																		   'max_range' => _COSTE_TEXTE_MAX_COSTE_TOME)));
421
				'max_range' => _COSTE_TEXTE_MAX_COSTE_TOME)));
415
		$p['masque.nt'] = filter_var(@$params['masque.nt'],
422
		$p['masque.nt'] = filter_var(@$params['masque.nt'],
416
												  FILTER_VALIDATE_INT,
423
			FILTER_VALIDATE_INT,
-
 
424
			array('options' => array(
417
												  array('options' => array('default' => NULL,
425
				'default' => NULL,
418
																		   'min_range' => 0,
426
				'min_range' => 0,
Line 419... Line 427...
419
																		   'max_range' => _COSTE_TEXTE_MAX_BDTFX_NT)));
427
				'max_range' => _COSTE_TEXTE_MAX_BDTFX_NT)));
420
 
428