25,12 → 25,9 |
// Un caractère de concaténation entre le projet et le service. |
// Ce caractère ne doit pas faire partie d'aucun des noms de service ou projet |
define('RES_VAL_SEP', '@'); |
define('SPE_INDEX_NVJFL', '_result_ontologies' . RES_VAL_SEP . 'nvjfl'); |
|
class NomsVernaculaires extends Commun { |
|
static $onto_multi_support = array('conseil_emploi', 'genre'); |
static $champ_infos = array( |
protected $champ_infos = array( |
'taxon' => array('service' => 'taxons', 'ressource' => 'nt:', 'projet' => 'bdtfx', 'nom' => 'nom_sci', |
// utilisés par ajouterChampsOntologieLigneResultat() |
'intitule' => 'taxon.code', // intitulé du champ tel qu'il sera renvoyé en JSON |
429,34 → 426,24 |
|
/** |
* Ajoute les champs d'ontologie supplémentaires si necéssaire |
* en faisant appels aux web services associés. |
* Les appels peuvent être fait individuellement (pour un couple <ontologie:valeur>) ou bien |
* regroupés, **si le webservice correspondant le supporte**. |
* |
* Nous disposons à ce jour de 3 (trois) webservices d'ontologies correspondant aux noms vernaculaires (cf $champ_infos) |
* Mais 2 d'entre eux sont identiques, il s'agit de /nvjfl/ontologies/. Or ce webservice supporte le multi-critère. |
* Nous pouvons donc factorisé l'appel pour "conseil_emploi" et "genre", mais pas pour "taxon". |
* |
* en faisant appels aux web services associés |
* @param array in/out $resultats: tous les résultats |
*/ |
public function ajouterChampsOntologieLigneTousResultats(&$resultats) { |
$champs_sup = array_intersect($this->champs_supp, array_keys(self::$champ_infos)); |
foreach($this->champ_infos as $cle => $champs_supplementaires) { |
if(!in_array($cle, $this->champs_supp)) continue; |
|
// La regroupement des toutes les valeurs recherchées (pour tous les |
// résultats), pour "les" onotologies supportant le multi-critère est effectué ci-dessous. |
// Dans les faits ce n'est le cas que pour nvjfl. |
$ontologieParamPending = self::NvjflOntologieIndex($resultats, $champs_sup); |
// TODO: n'activer QUE lorsque le webservice ontologie Nvjfl supportera le multi-critère |
// cf: services/modules/0.1/commun/Ontologies.php |
if($cle == 'conseil_emploi') { |
// la factorisation des toutes les valeurs recherchées (pour tous les |
// résultats, peut [potentiellement] être effectuée ci-dessous) |
$ontologieParamPending = self::NvjflOntologieIndex($resultats, $champs_supplementaires); |
$this->NvjflOntologieExpand($ontologieParamPending); |
self::NvjflOntologieCombine($resultats); |
self::NvjflOntologieCombine($resultats, $champs_supplementaires); |
continue; |
} |
|
// pour les ontologies multi-critères, on vient de le régler ci-dessus |
$champs_sup = array_diff($champs_sup, self::$onto_multi_support); |
|
|
// ici, $champs_sup ne peut contenir, au plus, que "taxon". |
// code historique: |
foreach($champs_sup as $cle) { |
$champs_supplementaires = self::$champ_infos[$cle]; |
// extrait, depuis un élément de $champ_infos: |
// $service, $ressource, $projet, $nom, $intitule, $bdd_champ |
extract($champs_supplementaires); |
476,28 → 463,17 |
Aggrège les valeurs dans le tableau retourné. |
Une référence vers l'index du tableau (NULL pour l'instant) est laissée dans |
un élément du résultat. */ |
static function NvjflOntologieIndex(&$resultats, $champs_sup) { |
// nous ne supportons le multi-critère que sur les ontologies nvjfl, et nous |
// avons précisé celles qui sont concernées dans self::$onto_multi_support |
$champs_sup = array_intersect($champs_sup, self::$onto_multi_support); |
static function NvjflOntologieIndex(&$resultats, $champs_infos) { |
$ontologieParamPending = Array(); |
extract($champs_infos); |
foreach($resultats as &$resultat) { |
foreach($champs_sup as $v) { |
// de cet extract() nous n'utilisons que $bdd_champ et $ressource |
extract(self::$champ_infos[$v]); |
if(!isset($resultat[$bdd_champ])) continue; |
|
$valeur_recherche = $resultat[$bdd_champ]; |
$valeur_recherche = $resultat[$bdd_champ]; // NvjflOntologieIndex uniquement pour "conseil_emploi", donc $bdd_champ = 'num_statut' |
if(!trim($valeur_recherche)) continue; |
|
// XXX: $ressource contient déjà ':' comme suffixe |
$critere = $ressource . $valeur_recherche; |
$ontologieParamPending[$critere] = NULL; |
$ontologieParamPending[$ressource . $valeur_recherche] = NULL; |
// placeholder pour le résultat |
$resultat[SPE_INDEX_NVJFL][$v][$critere] = |
&$ontologieParamPending[$critere]; |
$resultat['_result_ontologies' . RES_VAL_SEP . 'nvjfl'] = |
&$ontologieParamPending[$ressource . $valeur_recherche]; |
} |
} |
return $ontologieParamPending; |
} |
|
505,16 → 481,15 |
/* À partir d'un aggrégat des critère de requêtes d'ontologies, spécifiques à NVJFL, |
créé une URL multi-critère. |
Celle-ci, dans ce cas précis, n'est que la concaténation, par des virgules, |
des couples <ressource:ValeurRecherchée>. |
L'URL est appelée et la valeur correspondante est remplacée dans $criteres_requete. |
des couples <ressource - valeur recherchée>. |
L'URL est appelée et la valeur correspondante, dans $criteres_requete, remplacée. |
|
Note: dans le cadre du tryptique index/expand/combine pour lequel cette fonction existe, |
la valeur est référencée par un élément d'une ou plusieurs lignes de $resultat correspondantes. |
la valeur est référencée par une élément d'une ou plusieurs lignes de $resultat correspondantes. |
Celle(s)-ci sera[ont] donc changée(s) dans la foulée. */ |
public function NvjflOntologieExpand(&$criteres_requete) { |
// équivalent spécifique de ajouterHrefAutreProjet() |
$valeurs_requises = implode(',', array_keys($criteres_requete)); |
// en vérité, nous ne supportons ceci ici que pour nvjfl et non n'importe quel url_service |
$url = Config::get('url_service').'/ontologies/'.$valeurs_requises; |
$val = $this->consulterHref($url); |
|
527,51 → 502,24 |
return; |
} |
|
// subtilité, cette affectation modifie par conséquent les valeurs dans |
// $resultats[X][SPE_INDEX_NVJFL] |
// subtilité, cette affectation modifie par conséquent $resultats[X]['_result_ontologies' . RES_VAL_SEP . 'nvjfl'] |
// dont la référence pointe toujours sur $v |
foreach($val as $k => $v) $criteres_requete[$k] = $val->$k; |
} |
|
/* Fonction finale du tryptique: réordonne les valeurs obtenues auprès du web-service |
NVJFL en adéquation avec les champs attendus en sortie. |
Dès l'indexation des critères, nous avons associé une (ou plusieurs) référence(s) du |
tableau de résultats vers le tableau de retour des ontologies à l'aide d'un index |
particulier l'index SPE_INDEX_NVJFL qui contient comme élément(s) |
un ou plusieurs ontologies (les indexes de self::$champ_infos) qui elles-mêmes contiennent |
une ou plusieurs valeurs représentant les valeurs recherchées appartement à cette ontologies. |
Celui-ci est supprimé après avoir été correctement copié. */ |
/** |
* @param array in/out $resultats: tous les résultats |
* @param array in $critere: tableau des ontologies:valeur demandées, de la forme [ numStatut:1, genreNombre:11, ... ] |
*/ |
static function NvjflOntologieCombine(&$resultats, $criteres) { |
NVJFL en adéquation avec les champs attendus en sortie. Pour ce faire, $champs_infos |
est nécessaire. D'autre part, l'index spécifique '_result_ontologies' . RES_VAL_SEP . 'nvjfl' |
est supprimé après avoir été correctement copié. */ |
static function NvjflOntologieCombine(&$resultats, $champs_infos) { |
extract($champs_infos); |
foreach($resultats as &$resultat) { |
if(!array_key_exists(SPE_INDEX_NVJFL, $resultat)) continue; |
|
/* Note: la complétude d'un résultat peut dépendre de plusieurs ontologies différentes, |
d'où cette boucle. Cependant une seule valeur sera demandé pour cette ontologie, c'est pourquoi |
$resultat[SPE_INDEX_NVJFL][$onto_name], s'il existe, ne contiendra toujours qu'un seul élément. |
Puisque par définition un résultat contenant des valeurs d'ontologie n'aura jamais qu'un seul et unique |
attribut num_genre (ou num_statut, ou autre) */ |
foreach(self::$onto_multi_support as $onto_name) { |
/* $onto_name est un nom d'ontologie (l'une des clefs, parmi conseil_emploi et genre, |
cf la boucle sur $champs_sup dans NvjflOntologieIndex() |
de cet extract() nous n'utilisons que $intitule et $nom */ |
extract(self::$champ_infos[$onto_name]); |
|
// equivalent de l'affectation finale de chercherSignificationCode() |
// (utilisé lors de recherches d'ontologies en mono-critère) |
// XXX: PHP-5.3 pas de récupération d'attribut sur fonction |
$r = current($resultat[SPE_INDEX_NVJFL][$onto_name]); |
$resultat[$intitule] = $r->$nom; |
|
// XXX: certes nous pourrions nous contenter du unset() final |
unset($resultat[SPE_INDEX_NVJFL][$onto_name]); |
if(!array_key_exists('_result_ontologies' . RES_VAL_SEP . 'nvjfl', $resultat)) continue; |
// equivalent de chercher signification |
$resultat[$intitule] = $resultat['_result_ontologies' . RES_VAL_SEP . 'nvjfl']->$nom; |
unset($resultat['_result_ontologies' . RES_VAL_SEP . 'nvjfl']); |
} |
unset($resultat[SPE_INDEX_NVJFL]); |
} |
} |
|
/** |
* Ajoute les champs d'ontologie supplémentaires si necéssaire |
581,7 → 529,7 |
* @return array la ligne modifiée |
*/ |
public function ajouterChampsOntologieLigneResultat($ligne_resultat) { |
foreach(self::$champ_infos as $cle => $champs_supplementaires) { |
foreach($this->champ_infos as $cle => $champs_supplementaires) { |
if(!in_array($cle, $this->champs_supp)) continue; |
// extrait, depuis un élément de $champ_infos: |
// $service, $ressource, $projet, $nom, $intitule, $bdd_champ |
690,8 → 638,8 |
} |
|
public function afficherPointCode($nomChamp, $langue, $num_nom, $valeur) { |
if (isset(self::$champ_infos[$nomChamp])) { |
extract(self::$champ_infos[$nomChamp]); |
if (isset($this->champ_infos[$nomChamp])) { |
extract($this->champ_infos[$nomChamp]); |
} |
|
if ($this->retour_format == 'max') { |
775,8 → 723,8 |
public function afficherPoint($champ, $valeur, $langue, $num_nom) { |
preg_match('/^(.*)\.code$/', $champ, $match); |
$champ = $match[1]; |
if (isset(self::$champ_infos[$champ])) { |
extract(self::$champ_infos[$champ]); |
if (isset($this->champ_infos[$champ])) { |
extract($this->champ_infos[$champ]); |
$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet); |
$projet .= '.'; |
} |