Rev 559 | Go to most recent revision | Blame | Last modification | View Log | RSS feed
<?php
class Images extends Del {
private $format = 'json';
private $debut = 0;
private $limite = 50;
private $champ_tri = 'date_observation';
private $protocole_tri = 0;
private $ordre = 'desc';
private $tri_demande = false;
private $criteres_acceptes = array(
"recherche",
"dpt",
"taxon",
"genre",
"mot_clef",
"date",
"commune",
"famille",
"tag",
"auteur"
);
private $criteres = array();
/**
* Méthode appelée avec une requête de type GET avec une url de la forme
* http://localhost/jrest/ExempleService/
*
* Sert normalement à renvoyer la description des possibilités du service
*
*/
public function getRessource() {
return $this->getElement(array());
}
/**
* Méthode appelée avec une requête de type GET avec une url de la forme
* http://localhost/jrest/ExempleService/uid[0]/$uid[1]/ etc...
*
* Sert normalement à ramener un élément précis indiqué par un identifiant
* qui se situe dans l'url après le nom du service
* Le filtrage, le format de retour, les paramètres optionnels ... sont normalement indiqués
* dans le tableau $_GET
* Pour obtenir l'élément 2501 dans le format HTML cela pourrait donner
* http://localhost/jrest/ExempleService/2501?format=HTML
*
* @param $uid un tableau contenant les élements passés dans l'url après le nom du service
*
*/
public function getElement($uid)
{
$this->collecterCriteresRecherche();
switch ($this->format) {
case 'html':
case 'json':
$images = $this->obtenirImagesAvecObservations();
if(!empty($this->criteres)) {
$images_filtrees = array();
foreach($images as $ligne_image) {
if($this->ligneCorrespondAuxCriteres($ligne_image)) {
$images_filtrees[] = $ligne_image;
}
}
} else {
$images_filtrees = $images;
}
$total = count($images_filtrees);
if($this->tri_demande) {
usort($images_filtrees, array($this,'comparerObservations'));
}
$tranche = array_slice($images_filtrees,$this->debut,$this->limite);
$retour = array('total' => $total,
'contenu' => $tranche
);
$retour = json_encode($retour);
$mime = 'application/json';
break;
case 'xml':
break;
}
$this->envoyer($retour,$mime);
}
private function ajouterVoteProtocoleAleatoire() {
$vote = array('id_protocole' => round(rand(1,2)),
'vote' => round(rand(0,5)),
'contributeur' => $this->getAuteurPif(),
'date' => date('Y-m-d')
);
return $vote;
}
private function collecterCriteresRecherche() {
$this->debut = isset($_GET['debut']) ? $_GET['debut'] : $this->debut;
$this->limite = isset($_GET['limite']) ? $_GET['limite'] : $this->limite;
$this->champ_tri = isset($_GET['tri']) ? $_GET['tri'] : $this->champ_tri;
$this->ordre = isset($_GET['ordre']) ? $_GET['ordre'] : $this->ordre;
$this->tri_demande = isset($_GET['tri']) ? true : false;
$this->protocole_tri = isset($_GET['id_protocole']) ? $_GET['id_protocole'] : $this->protocole_tri;
if(isset($_GET['format'])) {
$this->format = strtolower($_GET['format']);
}
foreach($_GET as $cle => $valeur) {
if(in_array(strtolower(trim($cle)), $this->criteres_acceptes)) {
$this->criteres[$cle] = $valeur;
}
}
}
private function ligneCorrespondAuxCriteres($ligne_image) {
$correspond = true;
foreach($this->criteres as $critere => $valeur) {
$valeur = trim($valeur);
switch($critere) {
case "recherche":
$correspond = $this->correspondAChampDepartement($ligne_image, $valeur) |
$this->commencePar($valeur, $ligne_image->observation->nom_sel) |
$this->commencePar($ligne_image->observation->nom_ret, $valeur) |
$this->commencePar($ligne_image->observation->nom_sel, $valeur) |
$this->commencePar($ligne_image->observation->nom_ret, $valeur) |
$this->commencePar($ligne_image->observation->mots_cles_texte, $valeur) |
$this->commencePar($ligne_image->observation->date_observation, $valeur) |
$this->commencePar($ligne_image->date_prise_de_vue, $valeur) |
$this->commencePar($ligne_image->observation->zone_geo, $valeur) |
$this->commencePar($ligne_image->observation->famille, $valeur) |
$this->commencePar($ligne_image->observation->milieu, $valeur) |
$this->commencePar($ligne_image->mots_cles_texte, $valeur) |
$this->correspondAChampNomOuPrenom($ligne_image, $valeur) |
$this->commencePar($ligne_image->courriel_utilisateur, $valeur);
break;
case "dpt":
$correspond = $this->correspondAChampDepartement($ligne_image, $valeur);
break;
case "taxon":
$correspond = stristr($ligne_image->observation->nom_sel, $valeur) != '' |
stristr($ligne_image->observation->nom_ret, $valeur) != '';
break;
case "genre":
$correspond = stristr($ligne_image->observation->nom_sel, $valeur) != '' |
stristr($ligne_image->observation->nom_ret, $valeur) != '';
break;
case "mot_clef":
$correspond = stristr($ligne_image->observation->mot_cles_texte, $valeur);
break;
case "date":
$correspond = stristr($ligne_image->observation->date_observation, $valeur) != '' |
stristr($ligne_image->date_prise_de_vue, $valeur) != '';
break;
case "commune":
$correspond = stristr($ligne_image->observation->zone_geo, $valeur);
break;
case "famille":
$correspond = stristr($ligne_image->observation->famille, $valeur);
break;
case "tag":
$correspond = stristr($ligne_image->mots_cles_texte, $valeur);
break;
case "auteur":
$correspond = $this->correspondAChampNomOuPrenom($ligne_image, $valeur) |
stristr($ligne_image->courriel_utilisateur, $valeur) != '' ;
break;
}
if(!$correspond) break;
}
return $correspond;
}
private function commencePar($botte, $aiguille) {
return mb_substr($botte, 0, mb_strlen($aiguille)) == $aiguille;
}
private function correspondAChampDepartement($ligne_image, $valeur) {
$correspond = false;
if(!is_numeric($valeur)) {
$valeur = $this->obtenirCodeDepartementPourNom($valeur);
}
if($valeur) {
$correspond = (substr($ligne_image->observation->ce_zone_geo, 0, 2) == $valeur) |
$ligne_image->observation->ce_zone_geo == $valeur;
}
return $correspond;
}
private function correspondAChampNomOuPrenom($ligne_image, $valeur) {
while(substr_count($valeur, ' ') > 0) {
$valeur = str_replace(' ',' ', $valeur);
}
$chaine_nom_prenom = strtolower($ligne_image->nom_utilisateur).' '.strtolower($ligne_image->prenom_utilisateur);
$chaine_nom_prenom = trim($chaine_nom_prenom);
$chaine_prenom_nom = strtolower($ligne_image->prenom_utilisateur).' '.strtolower($ligne_image->nom_utilisateur);
$chaine_prenom_nom = trim($chaine_prenom_nom);
$valeur = strtolower($valeur);
$correspond = stristr($ligne_image->prenom_utilisateur, $valeur) != '' |
stristr($ligne_image->nom_utilisateur, $valeur) != '' |
stristr($chaine_nom_prenom, $valeur) != '' |
stristr($chaine_prenom_nom, $valeur) != '';
return $correspond;
}
private function obtenirCodeDepartementPourNom($nom) {
$nom = $this->formaterChaineMinusculeSansAccents($nom);
$tableau_communes = (array)$this->getTableauCorrespondanceDepartement();
$code = isset($tableau_communes[$nom]) ? $tableau_communes[$nom] : false;
return $code;
}
private function getTableauCorrespondanceDepartement() {
return json_decode(file_get_contents(realpath(dirname(__FILE__)).'/mocks/departementsmock.json'));
}
private function comparerObservations($image_a, $image_b) {
$valeur_tri = null;
switch($this->champ_tri) {
case 'date_observation':
$valeur_tri = $this->comparerDate($image_a, $image_b);
break;
case 'nb_votes':
$valeur_tri = $this->comparerNbVote($image_a, $image_b);
break;
}
return $valeur_tri;
}
private function comparerDate($image_a, $image_b) {
$champ_tri = 'date_observation';
$champ_a_comparer_a = isset($image_a->observation->$champ_tri) ? $image_a->observation->$champ_tri : 0;
$champ_a_comparer_b = isset($image_b->observation->$champ_tri) ? $image_b->observation->$champ_tri : 0;
if($this->ordre == 'asc') {
return $champ_a_comparer_a > $champ_a_comparer_b;
} else {
return $champ_a_comparer_a < $champ_a_comparer_b;
}
}
private function comparerNbVote($image_a, $image_b) {
$id_protocole = $this->protocole_tri;
$votes_a = 0;
$votes_b = 0;
if(isset($image_a->votes)) {
foreach($image_a->votes as $vote_a) {
$votes_a += $vote_a->id_protocole == $id_protocole ? 1 : 0;
}
}
if(isset($image_b->votes)) {
foreach($image_b->votes as $vote_b) {
$votes_b += $vote_b->id_protocole == $id_protocole ? 1 : 0;
}
}
if ($votes_a == $votes_b) {
return 0;
}
if($this->ordre == 'asc') {
return ($votes_a < $votes_b) ? -1 : 1;
} else {
return ($votes_a > $votes_b) ? -1 : 1;
}
}
private function obtenirImagesAvecObservations() {
return json_decode(file_get_contents(realpath(dirname(__FILE__)).'/mocks/imagesmock.json'));
}
}
?>