Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 7 → Rev 8

/trunk/services/modules/0.1/commun/MetaDonnees.php
2,14 → 2,14
/**
* Description :
* Classe MetaDonnees.php fournit des informations sur le projet.
* Le but étant de fournir un ensemble minimal d'information comprenant :
* Le but étant de fournir un ensemble minimal d'information comprenant :
* la version, la langue, le nom, le créateur et l'éditeur du projet.
* Si l'url finit par /meta-donnees on retourne une liste de termes (seulement les 100 premières par défaut).
* L'url peut contenir des paramètres optionnels passés après le ? : /meta-donnees?param1=val1&param2=val2&...
*
* Les paramètres de requête disponibles sont : masque, , recherche,
*
* Les paramètres de requête disponibles sont : masque, , recherche,
* distinct, retour.format, navigation.depart et navigation.limite.
*
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
* @package framework-v3
21,7 → 21,7
*/
 
class MetaDonnees extends Commun {
 
protected $requete_champ = '*';
protected $requete_condition = null;
protected $retour_format = 'max';
28,24 → 28,24
protected $table_retour = array();
protected $format_reponse = 'metaDonnees';
protected $table_ressources;
 
 
public function consulter($ressources, $parametres) {
$this->service = 'meta-donnees';
$resultat_formate = '';
// on traite en premier la version dans le cas ou un langage est demandé pr une version
$this->traiterRessourceVersion($ressources);
$this->traiterRessourceVersion($ressources);
$this->traiterParametres($parametres);
$this->traiterRessources($ressources);
if ($this->corps_http == '' && $this->entete_http == '') {
$requete_meta = $this->assemblerLaRequete();
$resultat_meta = $this->getBdd()->recupererTous($requete_meta);
$requete_meta = $this->assemblerLaRequete();
$resultat_meta = $this->getBdd()->recupererTous($requete_meta);
$resultat_formate = $this->testerResultat($resultat_meta, $requete_meta);
}
return $this->formerReponseHTTP($resultat_formate);
}
 
 
public function testerResultat($resultat_meta, $requete_meta) {
if ($resultat_meta == '') {
$e = 'La requête formée comporte une erreur!';
60,16 → 60,16
}
return $resultat_formate;
}
 
//--------------------FONCTIONS TRAITEMENT DES PARAMETRES---------------------------------------------------------------
 
public function traiterParametres($parametres) {
if (isset($parametres) && !empty($parametres)) {
foreach ($parametres as $param => $val) {
switch ($param) {
case 'retour_langue' : $this->rechercherLangueDispo($val); break;
case 'retour_format' : $this->retour_format = $val; break;
default :
switch ($param) {
case 'retour.langue' : $this->rechercherLangueDispo($val); break;
case 'retour.format' : $this->retour_format = $val; break;
default :
$e = 'Erreur dans les paramètres de recherche de votre requête : </br> Le paramètre " '
.$param.' " n\'existe pas.';
$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
78,9 → 78,9
}
}
}
 
//----------------------FONCTIONS TRAITEMENT DES RESSOURCES-------------------------------------------------------------
 
public function traiterRessources($ressources) {
// /meta-donnees (liste des meta-données. Toutes les info de la table sont affichées) ou /meta-donnees/#champ
if (isset($ressources) && !empty($ressources)) {
87,29 → 87,29
$this->table_ressources = $ressources;
if (isset($ressources) && !empty($ressources)) {
$this->format_reponse = 'metaDonnees/champ';
}
}
}
}
/** Détermine quelles métadonnées doivent etre retournées :
 
/** Détermine quelles métadonnées doivent etre retournées :
* - "*" : (/#projet/* /meta-donnees) Renvoi les meta-données de toutes les versions du projet
* - "numero de la version" : (/#projet/2.00/meta-donnees) Renvoi les meta-données de la version 2.00 du projet
* - non renseignée : (/#projet/meta-donnees) Renvoi les meta-données de la dernière version du projet
* Cette info est stockée dans par la classe RestServeur dans la variable $ressources ($ressources[0])
*/
*/
public function traiterRessourceVersion(&$ressources) {
if (isset($ressources[0]) && !empty($ressources[0])) {
if (preg_match('/(?:[0-9]+(?:_|[.])[0-9]+|[*]| )/', $ressources[0])) {
$this->version_projet = array_shift($ressources);
$this->version_projet = array_shift($ressources);
if ($this->version_projet == ' ') $this->version_projet = '+';
}
switch ($this->version_projet) {
case '+' :
$this->requete_condition[] = 'version = (SELECT MAX(version) FROM '.Config::get('bdd_table_meta').')';
case '+' :
$this->requete_condition[] = 'version = (SELECT MAX(version) FROM '.Config::get('bdd_table_meta').')';
break;
case '*' :
case '*' :
break;
default :
default :
if (is_numeric($this->version_projet)) {
$res_version = $this->rechercherVersionsDispo($this->version_projet);
}
116,12 → 116,12
break;
}
}
 
}
 
 
/**
* Vérifie que le numéro de la version passée en paramètre correspond à une version existante.
* Vérifie que le numéro de la version passée en paramètre correspond à une version existante.
* Si oui remplit la condition de la requete SQL
*/
public function rechercherVersionsDispo($val) {
132,7 → 132,7
$versions_dispo[] = $version['version'];
}
if (in_array($val, $versions_dispo)) {
$this->requete_condition[] = 'version = '.$this->getBdd()->proteger($val);
$this->requete_condition[] = 'version = '.$this->getBdd()->proteger($val);
} else {
$e = 'La version demandée n\'existe pas actuellement. </br>Les versions disponibles sont : '
.implode($versions_dispo);
140,8 → 140,8
}
return $res_version;
}
 
 
/** Vérifie que les meta-donnees existe dans la langue passée en paramètre, Si oui remplit la condition de la requete SQL */
public function rechercherLangueDispo($val) {
//on recherche les langues_meta disponibles pour la version demandée : (d'ou ajout de la condition)
153,7 → 153,7
$langue_dispo[] = $langue['langue_meta'];
}
if (in_array($val, $langue_dispo)) {
$this->requete_condition[] = 'langue_meta = '.$this->getBdd()->proteger($val);
$this->requete_condition[] = 'langue_meta = '.$this->getBdd()->proteger($val);
} else {
$e = 'La langue demandée n\'existe pas actuellement. </br>Les langues disponibles sont : '
.implode($langue_dispo);
160,20 → 160,20
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
}
}
 
//------------------------------Fonction d'assemblage de la requete------------------------------------------------------
 
public function assemblerLaRequete() {
$condition = '';
if (isset($this->requete_condition)) {
$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
}
}
$req = 'SELECT '.$this->requete_champ.' FROM '.Config::get('bdd_table_meta').$condition;
return $req;
}
 
//--------------------------------------Fonction de formatage des resultats ---------------------------------------------
 
public function formaterResultat($resultat) {
switch ($this->format_reponse) {
case 'metaDonnees/champ' : $reponse = $this->formaterMetaDonneesChamp($resultat); break;
181,65 → 181,65
default : break;
}
return json_encode($reponse);
}
}
 
//--------------------------------------Fonction de formatage des resultats de /metaDonnees/----------------------------
 
public function formaterMetaDonnees($resultat) {
foreach ($resultat as $version) {
foreach ($version as $key => $val) {
if ($val != '') {
$this->afficherDonnees($key, $val);
}
}
}
if ($this->retour_format == 'max' && $this->version_projet == '*') {
$this->table_retour['href'] = Config::get('url_service_base').Config::get('nom_projet')
.'/'.$version['version'].'/'.$this->service;
}
}
$table[] = $this->table_retour;
$this->table_retour = array();
}
return $table;
}
 
 
public function afficherDonnees($key, $valeur) {
if ($valeur != '') {
$tab = array();
if ($this->retour_format == 'min') {
if (in_array($key, array('editeur','createurs', 'contributeurs','couverture_spatiale','couverture_temporelle'))) {
//Pour les données comprenant plusieurs infos (...=...,...=...;...)
//Pour les données comprenant plusieurs infos (...=...,...=...;...)
$tab = $this->recupererTableauResultat($valeur);
$this->afficherConcatenationValeur($key, $tab);
} else {
$this->table_retour[$key] = trim($valeur);
$this->table_retour[$key] = trim($valeur);
}
} else {
if (in_array($key, array('editeur','createurs', 'contributeurs','couverture_spatiale','couverture_temporelle','langue','langue_meta'))) {
$tab = $this->recupererTableauResultat($valeur);
if (in_array($key, array('editeur','createurs', 'contributeurs','couverture_spatiale','couverture_temporelle','langue','langue_meta'))) {
$tab = $this->recupererTableauResultat($valeur);
$this->afficherConcatenationValeur($key, $tab);
$this->afficherDonneesMax($key,$valeur,$tab);
} else {
$this->table_retour[$key] = trim($valeur);
}
}
}
}
}
 
/**
* Recupère à partir de la valeur du champ les différentes informations séparées par ';' (stocke ds un tableau)
* pour éditeurs, créateurs, contributeurs,...
* (ex : nom=Tela Botanica,guid=urn:lsid:tela-botanica.org,courriel=accueil@tela-botanica.org,...
*/
*/
public function recupererTableauResultat($val) {
$tab = array();
$tab = array();
$num_entite = 0;
// découpe chaque participant
$tab_entites = explode(';', $val);
$tab_entites = explode(';', $val);
foreach ($tab_entites as $entite) {
$tab[$num_entite] = array();
if ($entite != '') { // découpe les informations du participant
$entite_detail = explode(',', $entite);
$entite_detail = explode(',', $entite);
foreach ($entite_detail as $detail) {
if ($detail != '') {
if (preg_match('/^([^=]+)=([^=]*)$/', $detail, $match)) {
254,10 → 254,10
}
return $tab;
}
/** Retourne :
* - le nom de l'editeur
 
 
/** Retourne :
* - le nom de l'editeur
* - les coordonnées de l'éditeur sous la forme [latitude]N,[longitude]S [datum]
* - la couverture temporelle sous la forme xxxx à xxxx
* - la concaténation des noms pour les contributeurs et les créateurs (machin chouette, truc bidule...)
275,10 → 275,10
$concat .= ', '.$this->ajouterSignification($champ, $val);
} else {
if (strrpos($key, '.prenom') !== false) {
$concat .= ', '.$val;
$concat .= ', '.$val;
} elseif (strrpos($key, 'nom') !== false) {
$concat .= ' '.$val;
 
$concat .= ' '.$val;
break;
}
}
290,8 → 290,8
$this->table_retour[$champ] = $res;
}
}
 
 
public function afficherDonneesMax($champ,$valeur,$tab) {
switch ($champ) {
case 'couverture_temporelle' : $this->afficherInfosPrecises($champ, 'start,end', $valeur, $tab); break;
304,40 → 304,40
default : $this->table_retour[$champ] = $valeur; break;
}
}
public function afficherEditeur($key, $tab) {
// infos générales sur l'éditeur
 
 
public function afficherEditeur($key, $tab) {
// infos générales sur l'éditeur
foreach ($tab[0] as $k => $val) {
if ((strrpos($k, 'contact.') === false) && (strrpos($k, '.wgs84') === false)) {
$this->table_retour[$key.'.'.$k] = $val;
$this->table_retour[$key.'.'.$k] = $val;
}
}
//on récupère dans un premier temps les tableaux des coordonnées.
}
//on récupère dans un premier temps les tableaux des coordonnées.
$table_coordonnees = $this->recupererTableCoordonnees($tab);
//on affiche les informations sur les coordonnees : concaténation + détails
//on affiche les informations sur les coordonnees : concaténation + détails
if ($table_coordonnees[0] != array()) {
$this->afficherConcatenationValeur($key.'.coordonnees', $table_coordonnees);
if (isset($table_coordonnees[0]['datum'])) {
$this->afficherInfosPrecises($key.'.coordonnees.datum',
$this->afficherInfosPrecises($key.'.coordonnees.datum',
'signification,code,href',$table_coordonnees[0]['datum'],
$table_coordonnees);
}
}
$table_contact = $this->recupererTableContact($tab);
}
$table_contact = $this->recupererTableContact($tab);
//on affiche le premier contact en dehors de la table de détail:
if ($table_contact[0] != array()) {
$this->table_retour[$key.'.contact'] = '';
$this->table_retour[$key.'.contact'] = '';
foreach ($table_contact as $info => $valeur) {
$this->table_retour[$key.'.contact'] .= $valeur['contact.prenom']." ".$valeur['contact.nom'];
}
//on affiche les détails des autres contacts :
$this->afficherTableDetails($key.'.contact', $table_contact);
}
//on affiche les détails des autres contacts :
$this->afficherTableDetails($key.'.contact', $table_contact);
}
}
 
 
 
public function afficherInfosPrecises($champ, $pts, $val, $tab = null) {
//permet d'afficher les informations précises telles que les .details, .start, .end...
$pts = explode(',', $pts);
346,7 → 346,7
case 'start' : $this->table_retour[$champ.'.start'] = $tab['start']; break;
case 'end' : $this->table_retour[$champ.'.end'] = $tab[' end']; break;
case 'code' : $this->table_retour[$champ.'.code'] = $val; break;
case 'href' : $this->table_retour[$champ.'.href'] =
case 'href' : $this->table_retour[$champ.'.href'] =
$this->ajouterHrefAutreProjet($champ, '', $val); break;
case 'signification' : $this->table_retour[$champ] = $this->ajouterSignification($champ, $val); break;
case 'details' : if ($champ == 'couverture_spatiale') {
358,15 → 358,15
}
}
}
 
 
 
public function afficherCouvertureSpatiale($key, $tab) {
$res = $this->table_retour;
$this->table_retour = array();
foreach ($tab as $iso) {
foreach ($iso as $val) {
$this->afficherInfosPrecises($key, 'signification,code,href',$val);
$this->afficherInfosPrecises($key, 'signification,code,href',$val);
$res[$key.'.detail'][] = $this->table_retour;
$this->table_retour = array();
}
373,16 → 373,16
}
$this->table_retour = $res;
}
 
public function afficherTableDetails($champ, $tab) {
$res = $this->table_retour;
$this->table_retour = array();
foreach ($tab as $num_entite => $entite) { // $t et $type valent p ou o
$t = '';
$type = '.';
$type = '.';
foreach ($entite as $key => $infos) {
list($type, $info) = explode('.', trim($key));
if ($type == 'contact') $type = 'p';
if ($type == 'contact') $type = 'p';
if ($type != $t) { // cherche et ajoute la signification du type
$this->afficherInfosPrecises('type', 'signification,code,href', trim($type));
foreach ($this->table_retour as $k => $val) {
391,7 → 391,7
$table_retour = array();
$this->table_retour = array(); // rempli par afficherInfosPrecises
$t = $type;
}
}
$res[$champ.'.details'][$num_entite][$key] = $infos;
}
}
412,8 → 412,8
}
return $res ;
}
 
 
public function recupererTableContact(&$tab) {
$res = array();
foreach ($tab[0] as $key => $val) {
426,8 → 426,8
$resultat[0] = $res;
return $resultat;
}
 
 
public function recupererTableCoordonnees(&$tab) {
$res = array();
foreach ($tab[0] as $key => $val) {
440,9 → 440,9
$resultat[0] = $res;
return $resultat;
}
 
//-------------------------------------Fonction de formatage des resultats de /metaDonnees/#champs+champs----------------
 
public function formaterMetaDonneesChamp($resultat) {
$this->recupererNomChamp(Config::get('bdd_table_meta'));
//On récupère dans un premier temps toutes les données existantes puis on pioche les champs recherchés
451,7 → 451,7
//on affiche les informations par defaut : la version, la langue_meta et le guid :
$this->afficherVersionLangueMetaGuid($version);
$tab_ress = explode(' ', $this->table_ressources[0]);
foreach ($tab_ress as $champ) {//on recupere le radical pour comparaison avec les nom des champs de la bdd :
foreach ($tab_ress as $champ) {//on recupere le radical pour comparaison avec les nom des champs de la bdd :
$this->afficherChampRecherche($champ, $version);
}
$table[] = $this->table_retour;
459,7 → 459,7
}
return $table;
}
 
public function afficherChampRecherche(&$champ, &$version) {
preg_match('/^([^.]+)(?:[.][^.]+)?$/', $champ, $match);
if (preg_match('/(.+)[.][*]$/', $champ, $match_2)) {
466,9 → 466,9
$this->afficherPointEtoile($match_2, $version, $champ);
} elseif (array_key_exists($champ, $version)) {
$this->table_retour[$champ] = $version[$champ];
} elseif (in_array($match[1], $this->champs_table)) {
} elseif (in_array($match[1], $this->champs_table)) {
//si le champ est vide dans cette version on retourne null (comparaison avec les champs existants)
$this->table_retour[$champ] = null;
$this->table_retour[$champ] = null;
} else {
$champs = implode('</li><li>', array_keys($version));
$e = 'Erreur dans votre requête : </br> Le champ "'.$champ.'" n\'existe pas'.
476,7 → 476,7
$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
}
}
 
public function afficherPointEtoile($match, $version, $ressource) {
$existe = false;
foreach ($version as $key => $valeur) {
484,7 → 484,7
$this->table_retour[$key] = $valeur;
$existe = true;
}
}
}
if (!$existe) {
$champs = implode('</li><li>', array_keys($version));
$e = 'Erreur dans votre requête : </br> Le champ " '.$ressource.' " n\'existe pas dans la version '
492,11 → 492,11
$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);
}
}
 
public function afficherVersionLangueMetaGuid(&$version) {
$this->table_retour['version'] = $version['version'];
$this->table_retour['version'] = $version['version'];
$this->table_retour['langue_meta'] = $version['langue_meta'];
$this->table_retour['guid'] = $version['guid'];
$this->table_retour['guid'] = $version['guid'];
}
 
 
/trunk/services/modules/0.1/commun/Ontologies.php
40,13 → 40,13
foreach ($this->parametres as $param => $valeur) {
switch ($param) {
case 'masque' : $this->ajouterLeFiltreMasque('masque', $valeur); break;
case 'masque_code' : $this->ajouterLeFiltreMasque('code', $valeur); break;
case 'masque_nom' : $this->ajouterLeFiltreMasque('nom', $valeur); break;
case 'masque_description' : $this->ajouterLeFiltreMasque('description', $valeur); break;
case 'retour_format' : $this->retour_format = $valeur; break;
case 'retour_champs' : break;
case 'navigation_depart' : $this->limite_requete['depart'] = $valeur; break;
case 'navigation_limite' : $this->limite_requete['limite'] = $valeur; break;
case 'masque.code' : $this->ajouterLeFiltreMasque('code', $valeur); break;
case 'masque.nom' : $this->ajouterLeFiltreMasque('nom', $valeur); break;
case 'masque.description' : $this->ajouterLeFiltreMasque('description', $valeur); break;
case 'retour.format' : $this->retour_format = $valeur; break;
case 'retour.champs' : break;
case 'navigation.depart' : $this->limite_requete['depart'] = $valeur; break;
case 'navigation.limite' : $this->limite_requete['limite'] = $valeur; break;
case 'recherche' : break;
default :
$e = 'Erreur dans les parametres de recherche de votre requête : </br> Le paramètre " '