Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 917 → Rev 918

/trunk/services/modules/0.1/coste/Textes.php
117,7 → 117,7
 
// contrainte du point d'entrée d'API webservice Tela lors d'un GET
public function consulter($ressources, $parametres, $db = NULL) {
if(!$db) {
if (!$db) {
// http_response_code(500);
throw new Exception('no DB', 500);
}
124,19 → 124,21
 
// parser la requête et filtrer les paramètres valides
// en cas d'accès HTTP
if(array_key_exists('QUERY_STRING', $_SERVER)) {
if (array_key_exists('QUERY_STRING', $_SERVER)) {
self::requestParse($uri, $params);
}
// en cas d'accès phpunit
else {
} else {// en cas d'accès phpunit
$uri = $ressources;
}
 
// renvoie du plain/text d'aide (cf fin de programme)
if(count($uri) == 1 && $uri[0] == 'aide') return self::aide();
if (count($uri) == 1 && $uri[0] == 'aide') {
return self::aide();
}
 
 
if(is_null($parametres)) $parametres = Array();
if (is_null($parametres)) {
$parametres = Array();
}
$params = self::requestFilterParams($parametres);
// les contraintes liées aux ids (passés comme composants d'URL)
// sont ajoutées aux params [sans être accepté comme paramètre d'URL]
148,7 → 150,7
 
$res = $db->recupererTous($req);
$err = mysql_error();
if(!$res && $err) {
if (!$res && $err) {
// http_response_code(400);
// if(defined('DEBUG') && DEBUG) header("X-Debug: $req");
throw new Exception('not found', 400);
157,7 → 159,7
// rapide formatage des résultats:
$matches = 0;
 
if($res) {
if ($res) {
// nombre de matches (sans LIMIT) utilisé pour l'en-tête
$matches = $db->recuperer('SELECT FOUND_ROWS() AS total');
$matches = intval($matches['total']);
167,8 → 169,10
// cependant le paramètre retour.indexBy permet de choisir une indexation par num_nom de bdtfx
$clef_index = $params['retour.indexBy'] == 'coste' ? 'coste:nn' : 'bdtfx:nn';
$res2 = array();
foreach($res as $v) {
if(!$v[$clef_index]) throw new Exception('format error: index NULL, use retour.indexBy=coste', 409);
foreach ($res as $v) {
if (!$v[$clef_index]) {
throw new Exception('format error: index NULL, use retour.indexBy=coste', 409);
}
$res2[$v[$clef_index]] = $v;
}
 
175,11 → 179,12
// l'appelant s'occupera du json_encode()
// même si ça démange d'exit'er ici
header("Content-Type: application/json; charset=utf-8");
return array('entete' => array('depart' => $params['navigation.depart'],
'limite' => $params['navigation.limite'],
'total' => count($res2),
'match' => $matches),
'resultats' => $res2);
return array('entete' => array(
'depart' => $params['navigation.depart'],
'limite' => $params['navigation.limite'],
'total' => count($res2),
'match' => $matches),
'resultats' => $res2);
 
}
 
197,32 → 202,28
 
// joins:
$other_join = self::sqlAddJoins($params, $champs_valides_non_formattes);
$req = sprintf(<<<EOF
SELECT SQL_CALC_FOUND_ROWS %s
FROM tb_eflore.coste_v2_00 c
LEFT JOIN tela_prod_wikini.florecoste_pages dsc ON c.page_wiki_dsc = dsc.tag AND dsc.latest = 'Y'
LEFT JOIN tela_prod_wikini.florecoste_pages cle ON c.page_wiki_cle = cle.tag AND cle.latest = 'Y'
%s
WHERE %s ORDER BY c.num_nom LIMIT %u, %u -- %s
EOF
,
$champs_valides, // dans le SELECT (parmi champs coste_v2_00)
// autre join, si nécessaire
$other_join ? $other_join : '',
// where
$constraints ? implode(' AND ', $constraints) : '1',
$requete_tpl = "SELECT SQL_CALC_FOUND_ROWS %s".
"FROM tb_eflore.coste_v2_00 c ".
" LEFT JOIN tela_prod_wikini.florecoste_pages dsc ON c.page_wiki_dsc = dsc.tag AND dsc.latest = 'Y' ".
" LEFT JOIN tela_prod_wikini.florecoste_pages cle ON c.page_wiki_cle = cle.tag AND cle.latest = 'Y' ".
" %s ".
"WHERE %s ORDER BY c.num_nom LIMIT %u, %u -- %s ";
$req = sprintf($requete_tpl,
$champs_valides, // dans le SELECT (parmi champs coste_v2_00)
// autre join, si nécessaire
$other_join ? $other_join : '',
 
// limit
$params['navigation.depart'],
$params['navigation.limite'],
__FILE__ . ':' . __LINE__);
// where
$constraints ? implode(' AND ', $constraints) : '1',
 
// limit
$params['navigation.depart'],
$params['navigation.limite'],
__FILE__ . ':' . __LINE__);
 
return $req;
}
 
 
 
 
// SQL helpers
// le préfix de coste_v2_00 est "c"
// le préfix de florecoste_pages sur la description est est "dsc"
229,15 → 230,16
// le préfix de florecoste_pages sur la clef de détermination est est "cle"
static function sqlAddConstraint($params, $db) {
$stack = array();
if(!empty($params['masque.ns'])) {
if($params['recherche'] == 'etendue')
$stack[] = 'c.nom_sci LIKE ' . $db->proteger('%' . trim($params['masque.ns']) . '%');
elseif($params['recherche'] == 'floue')
if (!empty($params['masque.ns'])) {
if ($params['recherche'] == 'etendue') {
$stack[] = 'c.nom_sci LIKE '.$db->proteger('%' . trim($params['masque.ns']).'%');
} elseif($params['recherche'] == 'floue') {
$stack[] = sprintf(self::$soundex_scheme,
'c.nom_sci',
$db->proteger('%' . trim($params['masque.ns']) . '%'));
else
$stack[] = 'c.nom_sci = ' . $db->proteger(trim($params['masque.ns']));
'c.nom_sci',
$db->proteger('%'.trim($params['masque.ns']).'%'));
} else {
$stack[] = 'c.nom_sci = '.$db->proteger(trim($params['masque.ns']));
}
}
 
// le masque sur texte est toujours un LIKE() "étendue", sauf si "floue" spécifié
244,11 → 246,11
if(!empty($params['masque.txt'])) {
if($params['recherche'] == 'floue') {
$stack[] = sprintf(self::$soundex_scheme,
'dsc.body',
$db->proteger('%' . trim($params['masque.txt']) . '%'));
'dsc.body',
$db->proteger('%'.trim($params['masque.txt']).'%'));
}
else {
$stack[] = 'dsc.body LIKE ' . $db->proteger('%' . trim($params['masque.txt']) . '%');
$stack[] = 'dsc.body LIKE '.$db->proteger('%'.trim($params['masque.txt']).'%');
}
}
 
255,42 → 257,44
if(!empty($params['masque.titre'])) {
if($params['recherche'] == 'stricte') {
$stack[] = sprintf('(dsc.tag = %1$s OR cle.tag = %1$s)',
$db->proteger(trim($params['masque.titre'])));
$db->proteger(trim($params['masque.titre'])));
}
else {
$stack[] = sprintf('(dsc.tag LIKE %1$s OR cle.tag LIKE %1$s)',
$db->proteger('%' . trim($params['masque.titre']) . '%'));
$db->proteger('%'.trim($params['masque.titre']).'%'));
}
}
 
if(array_key_exists('masque.famille', $params)) {
$stack[] = 'b.famille LIKE ' . $db->proteger(trim($params['masque.famille']));
$stack[] = 'b.famille LIKE '.$db->proteger(trim($params['masque.famille']));
}
 
if(array_key_exists('masque.page', $params)) {
$stack[] = 'c.page = ' . intval($params['masque.page']);
$stack[] = 'c.page = '.intval($params['masque.page']);
}
 
if(array_key_exists('masque.tome', $params)) {
$stack[] = 'c.tome = ' . intval($params['masque.tome']);
$stack[] = 'c.tome = '.intval($params['masque.tome']);
}
 
if(array_key_exists('masque.nt', $params)) {
$stack[] = 'c.flore_bdtfx_nt = ' . intval($params['masque.nt']);
$stack[] = 'c.flore_bdtfx_nt = '.intval($params['masque.nt']);
}
 
// ajout de la contrainte sur coste:nn ou bdtfx:nn si un composant d'URL supplémentaire
// comportant un #id existe, cf self::requestFilterIds()
$o_stack = array();
if(array_key_exists('_ids', $params) && $params['_ids']) {
if($params['_ids']['coste']) {
if (array_key_exists('_ids', $params) && $params['_ids']) {
if ($params['_ids']['coste']) {
$o_stack[] = sprintf("c.num_nom IN (%s)", implode(',', $params['_ids']['coste']));
}
if($params['_ids']['bdtfx']) {
if ($params['_ids']['bdtfx']) {
$o_stack[] = sprintf("c.flore_bdtfx_nn IN (%s)", implode(',', $params['_ids']['bdtfx']));
}
}
if($o_stack) $stack[] = '(' . implode(' OR ', $o_stack) . ')';
if ($o_stack) {
$stack[] = '(' . implode(' OR ', $o_stack) . ')';
}
 
return $stack;
}
303,10 → 307,9
$champs = $params['retour.champs'];
// champs coste_v2_00
$c = self::addSQLToFieldSynonym(explode(',', $champs));
if(isset($c['*'])) {
if (isset($c['*'])) {
$t = array_diff_key(self::$allow_champs, array_flip(self::$special_champs));
}
else {
} else {
// just loop below
$t = $c;
}
329,7 → 332,7
// XXX: PHP-5.3
$ret = array();
foreach($t as $k => $v) {
if(strpos($k, ':') !== FALSE) {
if (strpos($k, ':') !== FALSE) {
$ret[] = "$v AS \"$k\"";
} else {
$ret[] = "$v AS $k";
393,30 → 396,35
// TODO: use filter_input(INPUT_GET);
// renvoie FALSE ou NULL si absent ou invalide
$p['navigation.limite'] = filter_var(@$params['navigation.limite'],
FILTER_VALIDATE_INT,
array('options' => array('default' => NULL,
'min_range' => 1,
'max_range' => _COSTE_TEXTE_MAX_RESULT_LIMIT)));
FILTER_VALIDATE_INT,
array('options' => array(
'default' => NULL,
'min_range' => 1,
'max_range' => _COSTE_TEXTE_MAX_RESULT_LIMIT)));
$p['navigation.depart'] = filter_var(@$params['navigation.depart'],
FILTER_VALIDATE_INT,
array('options' => array('default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_COSTE_NN)));
FILTER_VALIDATE_INT,
array('options' => array(
'default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_COSTE_NN)));
$p['masque.page'] = filter_var(@$params['masque.page'],
FILTER_VALIDATE_INT,
array('options' => array('default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_COSTE_PAGE)));
FILTER_VALIDATE_INT,
array('options' => array(
'default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_COSTE_PAGE)));
$p['masque.tome'] = filter_var(@$params['masque.tome'],
FILTER_VALIDATE_INT,
array('options' => array('default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_COSTE_TOME)));
FILTER_VALIDATE_INT,
array('options' => array(
'default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_COSTE_TOME)));
$p['masque.nt'] = filter_var(@$params['masque.nt'],
FILTER_VALIDATE_INT,
array('options' => array('default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_BDTFX_NT)));
FILTER_VALIDATE_INT,
array('options' => array(
'default' => NULL,
'min_range' => 0,
'max_range' => _COSTE_TEXTE_MAX_BDTFX_NT)));
 
// on filtre les NULL, FALSE et '', mais pas les 0, d'où le callback()
// TODO: PHP-5.3
443,8 → 451,8
}
 
return array(
'coste' => array_slice($ids_coste, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT/2) ),
'bdtfx' => array_slice($ids_bdtfx, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT/2) )
'coste' => array_slice($ids_coste, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT / 2) ),
'bdtfx' => array_slice($ids_bdtfx, 0, intval(_COSTE_TEXTE_MAX_RESULT_LIMIT / 2) )
);
}
 
466,16 → 474,16
* le paramètre \"recherche\" affecte les masques \"ns\" et \"texte\"
* le paramètre \"famille\" est traité via LIKE et accepte les caractères '_' et '%'
* le paramètre \"retour.format\" est inutilisé pour l'instant",
implode(',', array_keys(self::$allow_champs)),
implode(',', self::$allow_params),
self::$default_params['retour.champs']
implode(',', array_keys(self::$allow_champs)),
implode(',', self::$allow_params),
self::$default_params['retour.champs']
);
}
 
static function getNNCoste($refnn) {
if(is_numeric($refnn)) {
if (is_numeric($refnn)) {
$t = intval($refnn);
if($t >= 1 && $t < _COSTE_TEXTE_MAX_COSTE_NN) return $t;
if ($t >= 1 && $t < _COSTE_TEXTE_MAX_COSTE_NN) return $t;
}
return FALSE;
}