16,6 → 16,10 |
* |
*/ |
|
// affecte le nombre d'ids autorisés dans le dernier segment d'URL |
// *et* la valeur maximale autorisée pour navigation.limite. |
define('_COSTE_TEXTE_MAX_RESULT_LIMIT', 500); |
|
/*restore_error_handler(); |
error_reporting(E_ALL);*/ |
class Textes { |
103,30 → 107,20 |
$uri = $ressources; |
} |
|
if(is_null($parametres)) $parametres = Array(); |
$params = self::requestFilterParams($parametres); |
|
// renvoie du plain/text d'aide (cf fin de programme) |
if(count($uri) == 1 && $uri[0] == 'aide') return self::aide(); |
|
$id = 0; |
// getNN renvoie le num_nom passé comme segment d'URI |
// ou bien l'extrait du pattern bdtfx.nn:#id |
if(count($uri) == 1) $id = self::getNN($uri[0]); |
|
|
// en cas d'échec (id invalide), bail-out |
// note: NULL is ok, mais FALSE est le retour de getNN() |
if($id === FALSE || count($uri) > 1) { |
// http_response_code(500); |
throw new Exception('not supported', 500); |
} |
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] |
$params['_ids'] = self::requestFilterIds($uri); |
|
// XXX: temporaires, pour chopper $db dans l'instance |
// (non disponibles dans nos helpers statics) |
$GLOBALS[__FILE__] = $db; |
$req = self::getCosteInfo($params, $id); |
unset($GLOBALS[__FILE__]); |
// XXX: temporaires, passage de $db aux fonctions |
// de toolkits |
$req = self::getCosteInfo($params, $db); |
|
$res = $db->recupererTous($req); |
$err = mysql_error(); |
if(!$res && $err) { |
164,16 → 158,11 |
|
// la fonction central: récupère les infos à partir de paramètres |
// et une optionnel contrainte de num_nom |
static function getCosteInfo(array $params, $id = NULL) { |
assert('is_int($id)'); |
|
static function getCosteInfo(array $params, $db) { |
// contraintes (WHERE): |
$constraints = self::sqlAddConstraint($params); |
// ajout de la contrainte sur num_nom si un composant d'URL supplémentaire |
// comportant un #id existe |
if($id) array_unshift($constraints, "c.num_nom = $id"); |
$constraints = self::sqlAddConstraint($params, $db); |
// XXX: que faire en l'absence de contrainte ? pour l'instant : "WHERE 1" |
|
|
// champs: |
$champs_valides_non_formattes = NULL; |
$champs_valides = self::sqlSelectFields($params, $champs_valides_non_formattes); |
211,19 → 200,17 |
// le préfix de coste_v2_00 est "c" |
// le préfix de florecoste_pages sur la description est est "dsc" |
// le préfix de florecoste_pages sur la clef de détermination est est "cle" |
static function sqlAddConstraint($params) { |
$q = $GLOBALS[__FILE__]; |
|
static function sqlAddConstraint($params, $db) { |
$stack = array(); |
if(!empty($params['masque.ns'])) { |
if($params['recherche'] == 'etendue') |
$stack[] = 'c.nom_sci LIKE ' . $q->proteger('%' . trim($params['masque.ns']) . '%'); |
$stack[] = 'c.nom_sci LIKE ' . $db->proteger('%' . trim($params['masque.ns']) . '%'); |
elseif($params['recherche'] == 'floue') |
$stack[] = sprintf(self::$soundex_scheme, |
'c.nom_sci', |
$q->proteger('%' . trim($params['masque.ns']) . '%')); |
$db->proteger('%' . trim($params['masque.ns']) . '%')); |
else |
$stack[] = 'c.nom_sci = ' . $q->proteger(trim($params['masque.ns'])); |
$stack[] = 'c.nom_sci = ' . $db->proteger(trim($params['masque.ns'])); |
} |
|
// le masque sur texte est toujours un LIKE() "étendue", sauf si "floue" spécifié |
231,10 → 218,10 |
if($params['recherche'] == 'floue') { |
$stack[] = sprintf(self::$soundex_scheme, |
'dsc.body', |
$q->proteger('%' . trim($params['masque.txt']) . '%')); |
$db->proteger('%' . trim($params['masque.txt']) . '%')); |
} |
else { |
$stack[] = 'dsc.body LIKE ' . $q->proteger('%' . trim($params['masque.txt']) . '%'); |
$stack[] = 'dsc.body LIKE ' . $db->proteger('%' . trim($params['masque.txt']) . '%'); |
} |
} |
|
241,16 → 228,16 |
if(!empty($params['masque.titre'])) { |
if($params['recherche'] == 'stricte') { |
$stack[] = sprintf('(dsc.tag = %1$s OR cle.tag = %1$s)', |
$q->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)', |
$q->proteger('%' . trim($params['masque.titre']) . '%')); |
$db->proteger('%' . trim($params['masque.titre']) . '%')); |
} |
} |
|
if(array_key_exists('masque.famille', $params)) { |
$stack[] = 'b.famille LIKE ' . $q->proteger(trim($params['masque.famille'])); |
$stack[] = 'b.famille LIKE ' . $db->proteger(trim($params['masque.famille'])); |
} |
|
if(array_key_exists('masque.page', $params)) { |
261,6 → 248,12 |
$stack[] = 'c.tome = ' . intval($params['masque.tome']); |
} |
|
// ajout de la contrainte sur num_nom si un composant d'URL supplémentaire |
// comportant un #id existe, cf self::requestFilterIds() |
if(array_key_exists('_ids', $params) && $params['_ids']) { |
$stack[] = sprintf("c.num_nom IN (%s)", implode(',', $params['_ids'])); |
} |
|
return $stack; |
} |
|
350,7 → 343,7 |
FILTER_VALIDATE_INT, |
array('options' => array('default' => NULL, |
'min_range' => 1, |
'max_range' => 500))); |
'max_range' => _COSTE_TEXTE_MAX_RESULT_LIMIT))); |
$p['navigation.depart'] = filter_var(@$params['navigation.depart'], |
FILTER_VALIDATE_INT, |
array('options' => array('default' => NULL, |
365,6 → 358,22 |
return $p; |
} |
|
static function requestFilterIds($uri) { |
if(count($uri) != 1) return NULL; |
|
// getNN renvoie le num_nom passé comme segment d'URI |
// ou bien l'extrait du pattern bdtfx.nn:(#id) |
$ids = array_filter(array_map(array(__CLASS__, 'getNN'), explode(',', $uri[0]))); |
|
// en cas d'échec (tous les id sont invalides), bail-out |
if(!$ids) { |
// http_response_code(500); |
throw new Exception('not supported', 500); |
} |
|
return array_slice($ids, 0, _COSTE_TEXTE_MAX_RESULT_LIMIT); |
} |
|
static function aide() { |
header("Content-Type: text/plain; charset=utf-8"); |
return sprintf(" |
373,10 → 382,9 |
Retourne des informations (choisies) à propos de taxons recherchés (à partir de divers critères) |
|
Usage: |
coste/textes/bdtfx.nn:#id?<params> |
coste/textes/#id?<params> |
coste/textes?<params> |
* #id étant un numéro nomenclatural d'un taxon bdtfx |
coste/textes/<liste-num_nom>?<params> |
* <liste-num_nom> étant une liste de numéros nomenclaturaux de taxons bdtfx séparés par des virgules |
au format <#id> ou <bdtfx.nn:#id> |
* retour.champs une liste de champs séparés par des virgules parmi *,%s |
* les paramètres acceptés sont les suivants: %s |
* les champs retournés par défaut sont les suivants: %s |