Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 831 | Rev 848 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 831 Rev 832
Line 23... Line 23...
23
*/
23
*/
Line 24... Line 24...
24
 
24
 
25
// Un caractère de concaténation entre le projet et le service.
25
// Un caractère de concaténation entre le projet et le service.
26
// Ce caractère ne doit pas faire partie d'aucun des noms de service ou projet
26
// Ce caractère ne doit pas faire partie d'aucun des noms de service ou projet
-
 
27
define('RES_VAL_SEP', '@');
Line 27... Line 28...
27
define('RES_VAL_SEP', '@');
28
define('SPE_INDEX_NVJFL', '_result_ontologies' . RES_VAL_SEP . 'nvjfl');
-
 
29
 
-
 
30
class NomsVernaculaires extends Commun {
28
 
31
 
29
class NomsVernaculaires extends Commun {
32
	static $onto_multi_support = array('conseil_emploi', 'genre');
30
	protected $champ_infos = array(
33
	static $champ_infos = array(
31
		'taxon' => array('service' => 'taxons', 'ressource' => 'nt:', 'projet' => 'bdtfx', 'nom' => 'nom_sci',
34
		'taxon' => array('service' => 'taxons', 'ressource' => 'nt:', 'projet' => 'bdtfx', 'nom' => 'nom_sci',
32
						 // utilisés par ajouterChampsOntologieLigneResultat()
35
						 // utilisés par ajouterChampsOntologieLigneResultat()
33
						 'intitule' => 'taxon.code', // intitulé du champ tel qu'il sera renvoyé en JSON
36
						 'intitule' => 'taxon.code', // intitulé du champ tel qu'il sera renvoyé en JSON
Line 424... Line 427...
424
		return $table_retour_json;
427
		return $table_retour_json;
425
	}
428
	}
Line 426... Line 429...
426
	
429
	
427
	/**
430
	/**
428
	 * Ajoute les champs d'ontologie supplémentaires si necéssaire
431
	 * Ajoute les champs d'ontologie supplémentaires si necéssaire
-
 
432
	 * en faisant appels aux web services associés.
-
 
433
	 * Les appels peuvent être fait individuellement (pour un couple <ontologie:valeur>) ou bien
-
 
434
	 * regroupés, **si le webservice correspondant le supporte**.
-
 
435
	 *
-
 
436
	 * Nous disposons à ce jour de 3 (trois) webservices d'ontologies correspondant aux noms vernaculaires (cf $champ_infos)
-
 
437
	 * Mais 2 d'entre eux sont identiques, il s'agit de /nvjfl/ontologies/. Or ce webservice supporte le multi-critère.
-
 
438
	 * Nous pouvons donc factorisé l'appel pour "conseil_emploi" et "genre", mais pas pour "taxon".
429
	 * en faisant appels aux web services associés
439
	 *
430
	 * @param array in/out $resultats: tous les résultats
440
	 * @param array in/out $resultats: tous les résultats
431
	 */
441
	 */
432
	public function ajouterChampsOntologieLigneTousResultats(&$resultats) {
-
 
433
		foreach($this->champ_infos as $cle => $champs_supplementaires) {
442
	public function ajouterChampsOntologieLigneTousResultats(&$resultats) {
434
			if(!in_array($cle, $this->champs_supp)) continue;
-
 
435
 
-
 
436
			// TODO: n'activer QUE lorsque le webservice ontologie Nvjfl supportera le multi-critère
-
 
437
			// cf: services/modules/0.1/commun/Ontologies.php
-
 
438
			if($cle == 'conseil_emploi') {
-
 
439
				// la factorisation des toutes les valeurs recherchées (pour tous les
-
 
440
				// résultats, peut [potentiellement] être effectuée ci-dessous)
-
 
441
				$ontologieParamPending = self::NvjflOntologieIndex($resultats, $champs_supplementaires);
-
 
442
				$this->NvjflOntologieExpand($ontologieParamPending);
-
 
443
				self::NvjflOntologieCombine($resultats, $champs_supplementaires);
-
 
444
				continue;
-
 
Line -... Line 443...
-
 
443
		$champs_sup = array_intersect($this->champs_supp, array_keys(self::$champ_infos));
-
 
444
 
-
 
445
		// La regroupement des toutes les valeurs recherchées (pour tous les
-
 
446
		// résultats), pour "les" onotologies supportant le multi-critère est effectué ci-dessous.
-
 
447
		// Dans les faits ce n'est le cas que pour nvjfl.
-
 
448
		$ontologieParamPending = self::NvjflOntologieIndex($resultats, $champs_sup);
-
 
449
		$this->NvjflOntologieExpand($ontologieParamPending);
-
 
450
		self::NvjflOntologieCombine($resultats);
-
 
451
 
-
 
452
		// pour les ontologies multi-critères, on vient de le régler ci-dessus
-
 
453
		$champs_sup = array_diff($champs_sup, self::$onto_multi_support);
-
 
454
 
-
 
455
 
-
 
456
		// ici, $champs_sup ne peut contenir, au plus, que "taxon".
-
 
457
		// code historique:
445
			}
458
		foreach($champs_sup as $cle) {
446
 
459
			$champs_supplementaires = self::$champ_infos[$cle];
447
			// extrait, depuis un élément de $champ_infos:
460
			// extrait, depuis un élément de $champ_infos:
Line 448... Line 461...
448
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
461
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
Line 461... Line 474...
461
	/* Récupère les valeurs recherchées pour une liste de résultats, (plus ou moins)
474
	/* Récupère les valeurs recherchées pour une liste de résultats, (plus ou moins)
462
	   spécifiquement au service d'Ontologies de NVJFL.
475
	   spécifiquement au service d'Ontologies de NVJFL.
463
	   Aggrège les valeurs dans le tableau retourné.
476
	   Aggrège les valeurs dans le tableau retourné.
464
	   Une référence vers l'index du tableau (NULL pour l'instant) est laissée dans
477
	   Une référence vers l'index du tableau (NULL pour l'instant) est laissée dans
465
	   un élément du résultat. */
478
	   un élément du résultat. */
466
	static function NvjflOntologieIndex(&$resultats, $champs_infos) {
479
	static function NvjflOntologieIndex(&$resultats, $champs_sup) {
-
 
480
		// nous ne supportons le multi-critère que sur les ontologies nvjfl, et nous
-
 
481
		// avons précisé celles qui sont concernées dans self::$onto_multi_support
-
 
482
		$champs_sup = array_intersect($champs_sup, self::$onto_multi_support);
467
		$ontologieParamPending = Array();
483
		$ontologieParamPending = Array();
468
		extract($champs_infos);
-
 
469
		foreach($resultats as &$resultat) {
484
		foreach($resultats as &$resultat) {
-
 
485
			foreach($champs_sup as $v) {
470
			$valeur_recherche = $resultat[$bdd_champ]; // NvjflOntologieIndex uniquement pour "conseil_emploi", donc $bdd_champ = 'num_statut'
486
				// de cet extract() nous n'utilisons que $bdd_champ et $ressource
-
 
487
				extract(self::$champ_infos[$v]);
-
 
488
				if(!isset($resultat[$bdd_champ])) continue;
-
 
489
 
-
 
490
				$valeur_recherche = $resultat[$bdd_champ];
471
			if(!trim($valeur_recherche)) continue;
491
				if(!trim($valeur_recherche)) continue;
-
 
492
 
-
 
493
				// XXX: $ressource contient déjà ':' comme suffixe
-
 
494
				$critere = $ressource . $valeur_recherche;
472
			$ontologieParamPending[$ressource . $valeur_recherche] = NULL;
495
				$ontologieParamPending[$critere] = NULL;
473
			// placeholder pour le résultat
496
				// placeholder pour le résultat
474
			$resultat['_result_ontologies' . RES_VAL_SEP . 'nvjfl'] =
497
				$resultat[SPE_INDEX_NVJFL][$v][$critere] =
475
				&$ontologieParamPending[$ressource . $valeur_recherche];
498
					&$ontologieParamPending[$critere];
-
 
499
			}
476
		}
500
		}
477
		return $ontologieParamPending;
501
		return $ontologieParamPending;
478
	}
502
	}
Line 479... Line 503...
479
 
503
 
480
	// TODO: switch to static si il peut en être de même pour ajouterHrefAutreProjet()
504
	// TODO: switch to static si il peut en être de même pour ajouterHrefAutreProjet()
481
	/* À partir d'un aggrégat des critère de requêtes d'ontologies, spécifiques à NVJFL,
505
	/* À partir d'un aggrégat des critère de requêtes d'ontologies, spécifiques à NVJFL,
482
	   créé une URL multi-critère.
506
	   créé une URL multi-critère.
483
	   Celle-ci, dans ce cas précis, n'est que la concaténation, par des virgules,
507
	   Celle-ci, dans ce cas précis, n'est que la concaténation, par des virgules,
484
	   des couples <ressource - valeur recherchée>.
508
	   des couples <ressource:ValeurRecherchée>.
Line 485... Line 509...
485
	   L'URL est appelée et la valeur correspondante, dans $criteres_requete, remplacée.
509
	   L'URL est appelée et la valeur correspondante est remplacée dans $criteres_requete.
486
 
510
 
487
	   Note: dans le cadre du tryptique index/expand/combine pour lequel cette fonction existe,
511
	   Note: dans le cadre du tryptique index/expand/combine pour lequel cette fonction existe,
488
	   la valeur est référencée par une élément d'une ou plusieurs lignes de $resultat correspondantes.
512
	   la valeur est référencée par un élément d'une ou plusieurs lignes de $resultat correspondantes.
489
	   Celle(s)-ci sera[ont] donc changée(s) dans la foulée. */
513
	   Celle(s)-ci sera[ont] donc changée(s) dans la foulée. */
490
	public function NvjflOntologieExpand(&$criteres_requete) {
514
	public function NvjflOntologieExpand(&$criteres_requete) {
-
 
515
		// équivalent spécifique de ajouterHrefAutreProjet()
491
		// équivalent spécifique de ajouterHrefAutreProjet()
516
		$valeurs_requises = implode(',', array_keys($criteres_requete));
492
		$valeurs_requises = implode(',', array_keys($criteres_requete));
517
		// en vérité, nous ne supportons ceci ici que pour nvjfl et non n'importe quel url_service
Line 493... Line 518...
493
		$url = Config::get('url_service').'/ontologies/'.$valeurs_requises;
518
		$url = Config::get('url_service').'/ontologies/'.$valeurs_requises;
494
		$val = $this->consulterHref($url);
519
		$val = $this->consulterHref($url);
Line 500... Line 525...
500
			$k = key($criteres_requete);
525
			$k = key($criteres_requete);
501
			$criteres_requete[$k] = $val;
526
			$criteres_requete[$k] = $val;
502
			return;
527
			return;
503
		}
528
		}
Line 504... Line 529...
504
 
529
 
-
 
530
		// subtilité, cette affectation modifie par conséquent les valeurs dans
505
		// subtilité, cette affectation modifie par conséquent $resultats[X]['_result_ontologies' . RES_VAL_SEP . 'nvjfl']
531
		// $resultats[X][SPE_INDEX_NVJFL]
506
		// dont la référence pointe toujours sur $v
532
		// dont la référence pointe toujours sur $v
507
		foreach($val as $k => $v) $criteres_requete[$k] = $val->$k;
533
		foreach($val as $k => $v) $criteres_requete[$k] = $val->$k;
Line 508... Line 534...
508
	}
534
	}
509
 
535
 
-
 
536
	/* Fonction finale du tryptique: réordonne les valeurs obtenues auprès du web-service
510
	/* Fonction finale du tryptique: réordonne les valeurs obtenues auprès du web-service
537
	   NVJFL en adéquation avec les champs attendus en sortie.
-
 
538
	   Dès l'indexation des critères, nous avons associé une (ou plusieurs) référence(s) du
-
 
539
	   tableau de résultats vers le tableau de retour des ontologies à l'aide d'un index
-
 
540
	   particulier l'index SPE_INDEX_NVJFL qui contient comme élément(s)
511
	   NVJFL en adéquation avec les champs attendus en sortie. Pour ce faire, $champs_infos
541
	   un ou plusieurs ontologies (les indexes de self::$champ_infos) qui elles-mêmes contiennent
-
 
542
	   une ou plusieurs valeurs représentant les valeurs recherchées appartement à cette ontologies.
-
 
543
	   Celui-ci est supprimé après avoir été correctement copié. */
-
 
544
	/**
-
 
545
	 * @param array in/out $resultats: tous les résultats
512
	   est nécessaire. D'autre part, l'index spécifique '_result_ontologies' . RES_VAL_SEP . 'nvjfl'
546
	 * @param array in $critere: tableau des ontologies:valeur demandées, de la forme [ numStatut:1, genreNombre:11, ... ]
513
	   est supprimé après avoir été correctement copié. */
-
 
514
	static function NvjflOntologieCombine(&$resultats, $champs_infos) {
547
	 */
515
		extract($champs_infos);
548
	static function NvjflOntologieCombine(&$resultats, $criteres) {
-
 
549
		foreach($resultats as &$resultat) {
-
 
550
			if(!array_key_exists(SPE_INDEX_NVJFL, $resultat)) continue;
-
 
551
 
-
 
552
			/* Note: la complétude d'un résultat peut dépendre de plusieurs ontologies différentes,
-
 
553
			   d'où cette boucle. Cependant une seule valeur sera demandé pour cette ontologie, c'est pourquoi
-
 
554
			   $resultat[SPE_INDEX_NVJFL][$onto_name], s'il existe, ne contiendra toujours qu'un seul élément.
-
 
555
			   Puisque par définition un résultat contenant des valeurs d'ontologie n'aura jamais qu'un seul et unique
-
 
556
			   attribut num_genre (ou num_statut, ou autre) */
-
 
557
			foreach(self::$onto_multi_support as $onto_name) {
-
 
558
				/* $onto_name est un nom d'ontologie (l'une des clefs, parmi conseil_emploi et genre,
-
 
559
				   cf la boucle sur $champs_sup dans  NvjflOntologieIndex()
-
 
560
				   de cet extract() nous n'utilisons que $intitule et $nom */
516
		foreach($resultats as &$resultat) {
561
				extract(self::$champ_infos[$onto_name]);
517
			if(!array_key_exists('_result_ontologies' . RES_VAL_SEP . 'nvjfl', $resultat)) continue;
562
 
-
 
563
				// equivalent de l'affectation finale de chercherSignificationCode()
-
 
564
				// (utilisé lors de recherches d'ontologies en mono-critère)
-
 
565
				// XXX: PHP-5.3 pas de récupération d'attribut sur fonction
-
 
566
				$r = current($resultat[SPE_INDEX_NVJFL][$onto_name]);
-
 
567
				$resultat[$intitule] = $r->$nom;
518
			// equivalent de chercher signification
568
 
-
 
569
				// XXX: certes nous pourrions nous contenter du unset() final
-
 
570
				unset($resultat[SPE_INDEX_NVJFL][$onto_name]);
519
			$resultat[$intitule] = $resultat['_result_ontologies' . RES_VAL_SEP . 'nvjfl']->$nom;
571
			}
520
			unset($resultat['_result_ontologies' . RES_VAL_SEP . 'nvjfl']);
572
			unset($resultat[SPE_INDEX_NVJFL]);
Line 521... Line 573...
521
		}
573
		}
522
	}
574
	}
Line 527... Line 579...
527
	 * @param array $ligne_resultat
579
	 * @param array $ligne_resultat
528
	 * 
580
	 * 
529
	 * @return array la ligne modifiée
581
	 * @return array la ligne modifiée
530
	 */
582
	 */
531
	public function ajouterChampsOntologieLigneResultat($ligne_resultat) {
583
	public function ajouterChampsOntologieLigneResultat($ligne_resultat) {
532
		foreach($this->champ_infos as $cle => $champs_supplementaires) {
584
		foreach(self::$champ_infos as $cle => $champs_supplementaires) {
533
			if(!in_array($cle, $this->champs_supp)) continue;
585
			if(!in_array($cle, $this->champs_supp)) continue;
534
			// extrait, depuis un élément de $champ_infos:
586
			// extrait, depuis un élément de $champ_infos:
535
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
587
			// $service, $ressource, $projet, $nom, $intitule, $bdd_champ
536
			extract($champs_supplementaires);
588
			extract($champs_supplementaires);
537
			$valeur_recherche = $ligne_resultat[$bdd_champ];
589
			$valeur_recherche = $ligne_resultat[$bdd_champ];
Line 636... Line 688...
636
			$this->table_retour[$champ] = $valeur;
688
			$this->table_retour[$champ] = $valeur;
637
		}
689
		}
638
	}
690
	}
Line 639... Line 691...
639
 
691
 
640
	public function afficherPointCode($nomChamp, $langue, $num_nom, $valeur) {
692
	public function afficherPointCode($nomChamp, $langue, $num_nom, $valeur) {
641
		if (isset($this->champ_infos[$nomChamp])) {
693
		if (isset(self::$champ_infos[$nomChamp])) {
642
			extract($this->champ_infos[$nomChamp]);
694
			extract(self::$champ_infos[$nomChamp]);
Line 643... Line 695...
643
		}
695
		}
644
 
696
 
645
		if ($this->retour_format == 'max') {
697
		if ($this->retour_format == 'max') {
Line 721... Line 773...
721
	}
773
	}
Line 722... Line 774...
722
 
774
 
723
	public function afficherPoint($champ, $valeur, $langue, $num_nom) {
775
	public function afficherPoint($champ, $valeur, $langue, $num_nom) {
724
		preg_match('/^(.*)\.code$/', $champ, $match);
776
		preg_match('/^(.*)\.code$/', $champ, $match);
725
		$champ = $match[1];
777
		$champ = $match[1];
726
		if (isset($this->champ_infos[$champ])) {
778
		if (isset(self::$champ_infos[$champ])) {
727
			extract($this->champ_infos[$champ]);
779
			extract(self::$champ_infos[$champ]);
728
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet);
780
			$url = $this->ajouterHrefAutreProjet($service, $ressource, $valeur, $projet);
729
			$projet .= '.';
781
			$projet .= '.';
Line 730... Line 782...
730
		}
782
		}