| 25,9 → 25,12 |
| // 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 { |
| protected $champ_infos = array( |
| |
| static $onto_multi_support = array('conseil_emploi', 'genre'); |
| static $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 |
| 426,24 → 429,34 |
| |
| /** |
| * Ajoute les champs d'ontologie supplémentaires si necéssaire |
| * en faisant appels aux web services associés |
| * 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". |
| * |
| * @param array in/out $resultats: tous les résultats |
| */ |
| public function ajouterChampsOntologieLigneTousResultats(&$resultats) { |
| foreach($this->champ_infos as $cle => $champs_supplementaires) { |
| if(!in_array($cle, $this->champs_supp)) continue; |
| $champs_sup = array_intersect($this->champs_supp, array_keys(self::$champ_infos)); |
| |
| // 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, $champs_supplementaires); |
| 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); |
| $this->NvjflOntologieExpand($ontologieParamPending); |
| self::NvjflOntologieCombine($resultats); |
| |
| // 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); |
| 463,16 → 476,27 |
| 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_infos) { |
| 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); |
| $ontologieParamPending = Array(); |
| extract($champs_infos); |
| foreach($resultats as &$resultat) { |
| $valeur_recherche = $resultat[$bdd_champ]; // NvjflOntologieIndex uniquement pour "conseil_emploi", donc $bdd_champ = 'num_statut' |
| if(!trim($valeur_recherche)) continue; |
| $ontologieParamPending[$ressource . $valeur_recherche] = NULL; |
| // placeholder pour le résultat |
| $resultat['_result_ontologies' . RES_VAL_SEP . 'nvjfl'] = |
| &$ontologieParamPending[$ressource . $valeur_recherche]; |
| 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]; |
| if(!trim($valeur_recherche)) continue; |
| |
| // XXX: $ressource contient déjà ':' comme suffixe |
| $critere = $ressource . $valeur_recherche; |
| $ontologieParamPending[$critere] = NULL; |
| // placeholder pour le résultat |
| $resultat[SPE_INDEX_NVJFL][$v][$critere] = |
| &$ontologieParamPending[$critere]; |
| } |
| } |
| return $ontologieParamPending; |
| } |
| 481,15 → 505,16 |
| /* À 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 - valeur recherchée>. |
| L'URL est appelée et la valeur correspondante, dans $criteres_requete, remplacée. |
| des couples <ressource:ValeurRecherchée>. |
| L'URL est appelée et la valeur correspondante est remplacée dans $criteres_requete. |
| |
| Note: dans le cadre du tryptique index/expand/combine pour lequel cette fonction existe, |
| la valeur est référencée par une élément d'une ou plusieurs lignes de $resultat correspondantes. |
| la valeur est référencée par un é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); |
| |
| 502,22 → 527,49 |
| return; |
| } |
| |
| // subtilité, cette affectation modifie par conséquent $resultats[X]['_result_ontologies' . RES_VAL_SEP . 'nvjfl'] |
| // subtilité, cette affectation modifie par conséquent les valeurs dans |
| // $resultats[X][SPE_INDEX_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. 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); |
| 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) { |
| foreach($resultats as &$resultat) { |
| 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']); |
| 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]); |
| } |
| unset($resultat[SPE_INDEX_NVJFL]); |
| } |
| } |
| |
| 529,7 → 581,7 |
| * @return array la ligne modifiée |
| */ |
| public function ajouterChampsOntologieLigneResultat($ligne_resultat) { |
| foreach($this->champ_infos as $cle => $champs_supplementaires) { |
| foreach(self::$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 |
| 638,8 → 690,8 |
| } |
| |
| public function afficherPointCode($nomChamp, $langue, $num_nom, $valeur) { |
| if (isset($this->champ_infos[$nomChamp])) { |
| extract($this->champ_infos[$nomChamp]); |
| if (isset(self::$champ_infos[$nomChamp])) { |
| extract(self::$champ_infos[$nomChamp]); |
| } |
| |
| if ($this->retour_format == 'max') { |
| 723,8 → 775,8 |
| public function afficherPoint($champ, $valeur, $langue, $num_nom) { |
| preg_match('/^(.*)\.code$/', $champ, $match); |
| $champ = $match[1]; |
| if (isset($this->champ_infos[$champ])) { |
| extract($this->champ_infos[$champ]); |
| if (isset(self::$champ_infos[$champ])) { |
| extract(self::$champ_infos[$champ]); |
| $url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet); |
| $projet .= '.'; |
| } |