Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 857 → Rev 858

/trunk/services/modules/0.1/coste/Textes.php
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