35,6 → 35,11 |
protected $total_resultat; |
protected $retour_format = 'max'; |
|
|
// beaucoup plus flexible dans le cas de requêtes SQL complexes |
protected $mesChamps = ''; |
protected $mesJoinsEtConditions = ''; |
|
public function consulter($ressources, $parametres) { |
$this->ressources = $ressources; |
$this->parametres = $parametres; |
63,7 → 68,7 |
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 'retour.champs' : $this->parametres['retour_champs'] = $valeur; break; |
case 'navigation.depart' : $this->limite_requete['depart'] = $valeur; break; |
case 'navigation.limite' : $this->limite_requete['limite'] = $valeur; break; |
case 'recherche' : break; |
131,11 → 136,24 |
$this->format_reponse .= '/id'; |
//requete : /ontologies/#classe:#code (ex : /ontologies/rangTaxo:290) |
} elseif (strrpos($this->ressources[0], ':') !== false) { |
// plusieurs couples #classe:#code séparés par des virgules |
if(strrpos($this->ressources[0], ',') !== false) { |
$this->traiterMultipleRessourceId(); |
return; |
} |
|
// ou un unique couple #classe:#code |
$this->format_reponse .= '/id'; |
preg_match('/^([^:]+):([^:]+)$/', $this->ressources[0], $match); |
$this->requete_condition[] = |
' id = (SELECT id FROM '.$this->table.' WHERE code = '.$this->getBdd()->proteger($match[2]) |
' id IN (SELECT id FROM '.$this->table.' WHERE code = '.$this->getBdd()->proteger($match[2]) |
.' AND classe_id = (SELECT id FROM '.$this->table.' WHERE code = '.$this->getBdd()->proteger($match[1]).'))'; |
// TODO: optimiser, à voir: traiterMultipleRessourceId() ci-dessous |
// SELECT a.* |
// FROM $this->table a |
// LEFT JOIN $this->table b ON a.id = b.id LEFT JOIN $this->table c ON b.classe_id = c.id |
// WHERE b.code = $this->getBdd()->proteger($match[2]) |
// AND c.code = $this->getBdd()->proteger($match[1]); |
} else { |
$e = 'Erreur dans les paramètres de recherche de votre requête : </br> Le paramètre " ' |
.$this->ressources[0].' " n\'existe pas.'; |
143,7 → 161,44 |
} |
} |
|
// Requète : /ontologies/#classe:#code,[...] (ex : /ontologies/numStatus:2,numStatus:3,genreNombre:10) |
public function traiterMultipleRessourceId() { |
$this->format_reponse .= '/ids'; // noter le "s" |
$this->mesChamps = Array( |
// 'a.*' // pourquoi pas, mais alors des unset() seront nécessaire |
'a.id', |
'a.classe_id AS `classe.id`', |
'a.nom', |
'a.description', |
'a.code', |
'a.complements', |
'c.nom AS classe', // évite très simplement (un très couteux) ajouterClasseCorrespondante() |
'concat(c.code,":", b.code) AS requete'); // permet aux appelants de récupérer la valeur qu'ils recherchent |
$this->mesChamps = implode(', ', $this->mesChamps); |
|
$this->mesJoinsEtConditions = |
// alias de la table première |
" a " |
. " LEFT JOIN {$this->table} b ON a.id = b.id LEFT JOIN {$this->table} c ON b.classe_id = c.id" |
. " WHERE "; |
|
$or_stack = false; |
$tab = explode(',', $this->ressources[0]); |
foreach($tab as $couple) { |
preg_match('/^([^:]+):([^:]+)$/', $couple, $match); |
if($or_stack) { |
// une fois qu'un set de condition et présent, |
// les autres sont `OR`-ed. |
$this->mesJoinsEtConditions .= " OR "; |
} |
$this->mesJoinsEtConditions .= |
sprintf("(b.code = %s AND c.code = %s)", |
$this->getBdd()->proteger($match[2]), |
$this->getBdd()->proteger($match[1])); |
$or_stack = true; |
} |
} |
|
public function traiterRessourceRelations() { |
//requete = /ontologies/#id/relations : |
if ($this->ressources[1] == 'relations') { |
164,6 → 219,8 |
} |
|
public function formerRequeteChamp() { |
if($this->mesChamps) return $this->mesChamps; |
|
$champ[] = 'id'; |
if ($this->format_reponse == 'ontologies') { |
$champ[] = 'nom, code '; |
172,7 → 229,7 |
$champs_recherches = explode(',', $this->parametres['retour_champs']); |
$champs_possibles = $this->rechercherChampsPossibles(); |
foreach ($champs_recherches as $champ_recherche) { |
if ($this->verifierValiditeChamp($champ_recherche)) { |
if ($this->verifierValiditeChamp($champ_recherche, $champs_possibles)) { |
$champ[] = (preg_match('/classe/', $champ_recherche)) ? 'classe_id' : $champ_recherche; |
} |
} |
207,6 → 264,8 |
} |
|
public function retournerRequeteCondition() { |
if($this->mesJoinsEtConditions) return $this->mesJoinsEtConditions; |
|
$condition = ''; |
if ($this->requete_condition !== null) { |
$condition = ' WHERE '.implode(' AND ', $this->requete_condition); |
251,6 → 310,7 |
switch ($this->format_reponse) { |
case 'ontologies' : $reponse = $this->formaterOntologies($resultat); break; |
case 'ontologies/id' : $reponse = $this->formaterOntologiesId($resultat[0]); break; |
case 'ontologies/ids' : $reponse = $this->formaterMultipleOntologiesId($resultat); break; |
case 'ontologies/id/relations' : $reponse = $this->formaterOntologiesIdRelations($resultat); break; |
default : break; |
} |
293,42 → 353,75 |
return $entete; |
} |
|
public function __anonyme1($val) { return $val != ''; } |
|
public function formaterOntologiesId($resultat) { |
$table_retour = array(); |
foreach ($resultat as $key => $valeur) { |
if ($valeur != '') { |
$table_retour = array_merge($table_retour, $this->afficherDonnees($key, $valeur)); |
$table_retour = array_filter($resultat, array($this, '__anonyme1')); |
$this->calculerClassID($table_retour); |
return $table_retour; |
} |
|
public function formaterMultipleOntologiesId($resultats) { |
$result = Array(); |
foreach($resultats as $k => $resultat) { |
$id = $resultat['requete']; |
$result[$id] = array_filter($resultat, array($this, '__anonyme1')); |
unset($result[$id]['requete']); |
$this->calculerClassID($result[$id]); |
} |
return $table_retour; |
return $result; |
} |
|
public function afficherDonnees($champ, $valeur) { |
$retour[$champ] = $valeur; |
if ($this->retour_format == 'max') { |
if ($champ == 'classe_id') { |
unset($retour[$champ]); // remplacer par classe.id |
if ($valeur != "0") { // pas de parent |
if (isset($this->parametres['retour_champs'])) { |
switch ($this->parametres['retour_champs']) { |
case 'classe' : $retour['classe'] = $this->ajouterClasseCorrespondante($valeur); break; |
case 'classe.id' : $retour['classe.id'] = $valeur; break; |
case 'classe.href' : $retour['classe.href'] = $this->ajouterHref('ontologies', $valeur); break; |
case 'classe.*' : $retour['classe.id'] = $valeur; $retour['classe.href'] = $this->ajouterHref('ontologies', $valeur); break; |
public function calculerClassID(&$resultat) { |
// commenté: pourquoi restreindre le choix des champs au format "max", |
// ça ne semble pas logique... |
// if ($this->retour_format != 'max') return; |
|
// question: pourquoi ne pas passer les infos relatives aux ontologies 0 ? |
// et que signifie ce commentaire: "pas de parent" |
if (@$resultat['classe_id'] == '0') return; |
|
$valeur = isset($resultat['classe_id']) ? $resultat['classe_id'] : $resultat['classe.id']; |
if(! isset($resultat['classe.id'])) { |
$resultat['classe.id'] = $resultat['classe_id']; |
unset($resultat['classe_id']); |
} |
} else { |
|
// max-format et pas de champs spécifiques demandés ? |
// Alors on rempli "classe" et "classe.href" |
// Mais ne pas recalculer (surtout la classe) si ce n'est pas nécessaire |
// (c'est le cas si l'on a demandé plusieurs critère [provenons de formaterMultipleOntologiesId()]) |
if (! isset($this->parametres['retour_champs'])) { |
if(! isset($resultat['classe'])) { |
$nom_classe = $this->ajouterClasseCorrespondante($valeur); |
if (isset($nom_classe)) $retour['classe'] = $nom_classe; |
$retour['classe.id'] = $valeur; |
$retour['classe.href'] = $this->ajouterHref('ontologies', $valeur); |
if (isset($nom_classe)) $resultat['classe'] = $nom_classe; |
} |
if(! isset($resultat['classe.href'])) { |
$resultat['classe.href'] = $this->ajouterHref('ontologies', $valeur); |
} |
return; |
} |
|
// cas où des champs sont demandés |
$champs = explode(',', $this->parametres['retour_champs']); |
if(in_array('classe', $champs) && ! isset($resultat['classe'])) { |
$this->ajouterClasseCorrespondante($valeur); |
} |
return $retour; |
|
if(in_array('classe.id', $champs) && ! isset($resultat['classe.id'])) { |
$resultat['classe.id'] = $valeur; |
} |
|
if(in_array('classe.href', $champs) && ! isset($resultat['classe.href'])) { |
$resultat['classe.href'] = $this->ajouterHref('ontologies', $valeur); |
} |
|
if(in_array('classe.*', $champs) && (! isset($resultat['classe.href']) || ! isset($resultat['classe.id']))) { |
$resultat['classe.id'] = $valeur; |
$resultat['classe.href'] = $this->ajouterHref('ontologies', $valeur); |
} |
} |
|
/** Recherche par interrogation de la base, le nom de la classe à partir de son identifiant (classe.id) */ |
public function ajouterClasseCorrespondante($classe_id) { |
$nom = null; |