Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1788 → Rev 1793

/trunk/services/modules/0.1/syndication/SyndicationCommentaires.php
21,7 → 21,7
private $masque = array();
private $mappingFiltre = array();
private $conteneur = null;
private $gestionBdd = null;
private $bdd = null;
private $navigation = null;
 
public function __construct(Conteneur $conteneur = null) {
29,7 → 29,7
$this->conteneur->chargerConfiguration('config_syndication_commentaires.ini');
$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $conteneur->getBdd();
$this->navigation = $conteneur->getNavigation();
}
 
245,7 → 245,7
'ORDER BY dc.date DESC '.
'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite().' ';
 
$elements = $this->gestionBdd->getBdd()->recupererTous($requete);
$elements = $this->bdd->recupererTous($requete);
return $elements;
}
 
260,8 → 260,8
foreach ($tableauMasque as $idMasque => $valeurMasque) {
$idMasque = str_replace('masque.', '', $idMasque);
$champ = $this->mappingFiltre[$idMasque];
$valeurMasquePattern = $this->gestionBdd->getBdd()->proteger($valeurMasque.'%');
$valeurMasqueProtegee = $this->gestionBdd->getBdd()->proteger($valeurMasque);
$valeurMasquePattern = $this->bdd->proteger($valeurMasque.'%');
$valeurMasqueProtegee = $this->bdd->proteger($valeurMasque);
 
switch ($idMasque) {
case 'espece':
288,14 → 288,14
if (is_numeric($auteurId)) {
$whereAuteur = " dc.ce_utilisateur = $auteurId ";
} else {
$auteurIdMotif = $this->gestionBdd->getBdd()->proteger($auteurId.'%');
$auteurIdMotif = $this->bdd->proteger($auteurId.'%');
 
if (strpos($auteurId, '@') === false) {
$tableauNomPrenom = explode(' ', $auteurId, 2);
if (count($tableauNomPrenom) == 2) {
// on teste potentiellement un nom prenom ou bien un prénom nom
$nomMotif = $this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%');
$prenomMotif = $this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%');
$nomMotif = $this->bdd->proteger($tableauNomPrenom[0].'%');
$prenomMotif = $this->bdd->proteger($tableauNomPrenom[1].'%');
 
$whereAuteur = ' ('.
"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
/trunk/services/modules/0.1/syndication/SyndicationTagsParProtocole.php
25,7 → 25,7
private $masque = array();
private $mappingFiltre = array();
private $conteneur = null;
private $gestionBdd = null;
private $bdd = null;
private $navigation = null;
private $type_rss = null;
 
38,7 → 38,7
$this->conteneur->chargerConfiguration('config_syndication_tagsparprotocole.ini');
$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $conteneur->getBdd();
$this->navigation = $conteneur->getNavigation();
}
 
286,7 → 286,7
$this->chargerClauseWhere().' '.
'ORDER BY date DESC '.
'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite();
$elements = $this->gestionBdd->getBdd()->recupererTous($requete);
$elements = $this->bdd->recupererTous($requete);
return $elements;
}
 
300,7 → 300,7
foreach ($tableauMasque as $idMasque => $valeurMasque) {
$idMasque = str_replace('masque.', '', $idMasque);
$champMasque = $this->mappingFiltre[$idMasque];
$masqueMotif = $this->gestionBdd->getBdd()->proteger($valeurMasque);
$masqueMotif = $this->bdd->proteger($valeurMasque);
 
switch ($idMasque) {
case 'image':
/trunk/services/modules/0.1/syndication/SyndicationVotesParProtocole.php
24,7 → 24,7
private $masque = array();
private $mappingFiltre = array();
private $conteneur = null;
private $gestionBdd = null;
private $bdd = null;
private $navigation = null;
private $type_rss = null;
 
37,7 → 37,7
$this->conteneur->chargerConfiguration('config_syndication_votesparprotocole.ini');
$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $conteneur->getBdd();
$this->navigation = $conteneur->getNavigation();
}
 
276,7 → 276,7
'ORDER BY divo.date DESC '.
'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite();
 
$elements = $this->gestionBdd->getBdd()->recupererTous($requete);
$elements = $this->bdd->recupererTous($requete);
return $elements;
}
 
291,13 → 291,13
$idMasque = str_replace('masque.', '', $idMasque);
switch ($idMasque) {
case 'image':
$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque);
$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->bdd->proteger($valeurMasque);
break;
case 'protocole':
$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque).' ';
$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->bdd->proteger($valeurMasque).' ';
break;
default:
$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->gestionBdd->getBdd()->proteger($valeurMasque);
$where[] = ' '.$this->mappingFiltre[$idMasque].' = '.$this->bdd->proteger($valeurMasque);
break;
}
}
320,19 → 320,19
if(count($tableauNomPrenom) == 2) {
// on teste potentiellement un nom prenom ou bien un prénom nom
$masque = '('.
'(dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%').' AND '.
'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%').') OR '.
'(dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%').' AND '.
'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%').')'.
'(dc.utilisateur_nom LIKE '.$this->bdd->proteger($tableauNomPrenom[0].'%').' AND '.
'dc.utilisateur_prenom LIKE '.$this->bdd->proteger($tableauNomPrenom[1].'%').') OR '.
'(dc.utilisateur_nom LIKE '.$this->bdd->proteger($tableauNomPrenom[1].'%').' AND '.
'dc.utilisateur_prenom LIKE '.$this->bdd->proteger($tableauNomPrenom[0].'%').')'.
')';
} else {
$masque = '(
(dc.utilisateur_nom LIKE '.$this->gestionBdd->getBdd()->proteger($auteurId.'%').' OR '.
'dc.utilisateur_prenom LIKE '.$this->gestionBdd->getBdd()->proteger($auteurId.'%').')'.
(dc.utilisateur_nom LIKE '.$this->bdd->proteger($auteurId.'%').' OR '.
'dc.utilisateur_prenom LIKE '.$this->bdd->proteger($auteurId.'%').')'.
')';
}
} else {
$masque = " do.utilisateur_courriel LIKE ".$this->gestionBdd->getBdd()->proteger($valeurMasque.'%')." ";
$masque = " do.utilisateur_courriel LIKE ".$this->bdd->proteger($valeurMasque.'%')." ";
}
}
return $masque;
/trunk/services/modules/0.1/plantnet/Changements.php
1,11 → 1,11
<?php
/**
* Le web service plantnet récupère toutes les image de la table v_del_image
* Le web service plantnet récupère toutes les image de la table v_del_image
* ordonées par date de modification
* Les images sont regroupées en observations
* Les tags, les votes et les propositions de determinations sont intégrés à l'observation
*
*
*
* @category php 5.2
* @author Samuel Dufour-Kowalski <samuel.dufour@cirad.fr>
* @author Mathias Chouet <mathias@tela-botanica.org>
19,34 → 19,32
*/
 
class Changements {
 
private $indexImagesIds = array();
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
private $date_defaut = '1900-01-01';
 
public function __construct(Conteneur $conteneur = null) {
 
/* restore_exception_handler(); */
/* restore_error_handler(); */
/* ini_set("display_errors", "1"); */
 
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_plantnet.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
* Méthode principale de la classe.
* Lance la récupération des images dans la base et les place dans un objet ResultatService
* Lance la récupération des images dans la base et les place dans un objet ResultatService
* pour l'afficher.
* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
* @param array $parametres les paramètres situés après le ? dans l'url
57,13 → 55,13
// initialiserRessourcesEtParametres()
$this->ressources = $ressources;
$this->parametres = $parametres;
 
 
if(!isset($parametres['date'])) {
$this->parametres['date'] = $this->date_defaut;
}
 
 
// Lancement du service
$liaisons = $this->chargerLiaisons();
$images = array();
72,7 → 70,7
if($liaisons) {
$compte = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');
$total = (int) $compte['nbre'];
 
$imgdata = $this->recupererDonneeObs($liaisons);
$obs = $this->regrouperObs($liaisons, $imgdata);
 
79,18 → 77,18
$obs = $this->chargerPropositionPlusProbable($obs);
$obs = $this->orderArray($obs);
}
 
$this->navigation->setTotal($total);
 
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
//$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);
$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $obs);
 
return $resultat;
}
 
 
private function orderArray(&$obs) {
 
$ret = array();
102,12 → 100,12
function cmp($a, $b) {
return ($a['date_changement'] < $b['date_changement']) ? 1 : -1;
}
 
usort($ret, 'cmp');
return $ret;
}
/*-------------------------------------------------------------------------------
CHARGEMENT DES IMAGES
CHARGEMENT DES IMAGES
--------------------------------------------------------------------------------*/
private function chargerLiaisons() {
 
116,10 → 114,10
$limite = @min(intval($this->parametres['navigation.limite']), 1000);
$limite = $limite ? $limite : 10; // 0 => 10
$depart = intval(@$this->parametres['navigation.depart']);
 
 
$requete_sql =
 
$requete_sql =
'select SQL_CALC_FOUND_ROWS vdi.id_observation, vdi.id_image, '.
 
'GROUP_CONCAT(del_image_vote.valeur) as votes, GROUP_CONCAT(DISTINCT tag) as tags, '.
145,7 → 143,7
'having MAX(vdi.date_creation) >= '.$date_debut.' or '.
' MAX(vdi.date_modification) >= '.$date_debut.' or '.
' MAX(del_image_tag.date) >= '.$date_debut.' or '.
' MAX(del_image_tag.date_modification) >= '.$date_debut.' or '.
' MAX(del_image_tag.date_modification) >= '.$date_debut.' or '.
' MAX(del_image_vote.date) >= '.$date_debut.' or '.
' MAX(del_commentaire.date) >= '.$date_debut.' or '.
' MAX(del_commentaire_vote.date) >= '.$date_debut.' '.
155,16 → 153,16
//echo $requete_sql; exit;
 
return $this->bdd->recupererTous($requete_sql);
 
 
 
// GROUP BY (très couteux) car multiples observations associées à une image
// charlie est ici :-)
// charlie est ici :-)
// eg: 16150,16185,16245,16246,118995,129989
 
}
 
 
// recupere les donnée associées (fait en 2 requetes pour optimiser)
private function recupererDonneeObs(&$liaisons) {
 
174,7 → 172,7
$id = $img['id_image'];
$ids[] = $id;
}
 
// recuperer les donnees
$resultats = $this->bdd->recupererTous(sprintf(
'SELECT '.
181,13 → 179,13
'vdi.id_observation, vdi.id_image, '.
'vdi.nom_sel, '.
'vdi.nom_referentiel, vdi.nom_ret, vdi.nom_ret_nn, vdi.nt, vdi.famille, '.
'vdi.zone_geo, vdi.latitude, vdi.longitude, '.
'vdi.date_observation, vdi.date_creation, vdi.date_transmission, '.
'vdi.mots_cles_texte as mots_cles_texte, '.
'vdi.i_mots_cles_texte as mots_cles_texte_image, '.
'vdi.zone_geo, vdi.latitude, vdi.longitude, '.
'vdi.date_observation, vdi.date_creation, vdi.date_transmission, '.
'vdi.mots_cles_texte as mots_cles_texte, '.
'vdi.i_mots_cles_texte as mots_cles_texte_image, '.
 
'vdi.ce_utilisateur as ce_utilisateur, '.
'vdi.prenom_utilisateur, vdi.courriel_utilisateur, vdi.nom_utilisateur, vdi.nom_original as nom_image '.
'vdi.prenom_utilisateur, vdi.courriel_utilisateur, vdi.nom_utilisateur, vdi.nom_original as nom_image '.
 
'FROM v_del_image as vdi '.
'WHERE vdi.id_image IN (%s) '.
215,7 → 213,7
$idimg = $img['id_image'];
 
$imgdata = $imgdatas[$idimg];
 
if (!isset($obs[$idobs])) {
$obs[$idobs] = array();
}
227,7 → 225,7
$obs[$idobs]['auteur_courriel'] = $imgdata['courriel_utilisateur'];
 
$obs[$idobs]['mots_cles_obs_cel'] = $this->formaterMotsClesCel($imgdata['mots_cles_texte']);
 
$obs[$idobs]['date_observation'] = $imgdata['date_observation'];
$obs[$idobs]['date_publication'] = $imgdata['date_transmission'];
$obs[$idobs]['date_creation'] = $imgdata['date_creation'];
243,8 → 241,8
$obs[$idobs]['zone_geo'] = $imgdata['zone_geo'];
$obs[$idobs]['latitude'] = floatval($imgdata['latitude']);
$obs[$idobs]['longitude'] = floatval($imgdata['longitude']);
 
 
if (!isset($obs[$idobs]['images'])) {
$obs[$idobs]['images'] = array();
}
261,11 → 259,11
$obs[$idobs]['images'][] = $img_obj;
 
}
 
return $obs;
 
}
 
/**
* Charger les votes pour chaque image
**/
281,9 → 279,9
'AND del_commentaire.id_commentaire=del_commentaire_vote.ce_proposition '.
'', implode(',', $obsIds)));
 
 
$votes = array(); // map ce_proposition -> score
 
// calcul des votes
// un vote identifié a un facteur de 3
// additionne tous les vote par ce_proposition
294,15 → 292,15
$valeur = ($vote['valeur'] == 1) ? 1 : -1;
$votes[$vote['id_commentaire']] += is_numeric($vote['ce_utilisateur']) ? 3 * $valeur : $valeur;
}
 
foreach($resultats as $vote) {
$idobs = $vote['ce_observation'];
 
if(!isset($obs[$idobs]['determinations'])) {
$obs[$idobs]['determinations'] = array();
}
 
$obs[$idobs]['determinations'][$vote['id_commentaire']] =
$obs[$idobs]['determinations'][$vote['id_commentaire']] =
array('nom_sel' => $vote['nom_sel'],
'nom_ret' => $vote['nom_ret'],
'score' => $votes[$vote['id_commentaire']],
309,12 → 307,12
'nn' => $vote['nom_sel_nn']
);
}
 
 
return $obs;
}
 
 
/*-------------------------------------------------------------------------------
FORMATER ET METTRE EN FORME
--------------------------------------------------------------------------------*/
339,5 → 337,5
$ret = explode(',', implode(',', $result));
return $ret;
}
 
}
/trunk/services/modules/0.1/determinations/ListeImagesDeterminationsProbables.php
22,7 → 22,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
36,8 → 35,7
$this->conteneur->chargerConfiguration('config_determinations.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
/trunk/services/modules/0.1/determinations/ValiderDetermination.php
18,7 → 18,6
class ValiderDetermination {
 
private $conteneur;
private $gestionBdd;
private $bdd;
private $idObs = null;
private $idProposition = null;
28,8 → 27,7
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_determinations.ini');
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
public function modifier($ressources, $parametres) {
45,7 → 43,7
}
return 'OK';
}
 
private function validateurEstPresent($parametres) {
return isset($parametres['validateur.id']) && is_numeric($parametres['validateur.id']) && $parametres['validateur.id'] != 0;
}
61,11 → 59,11
if (!isset($parametres['auteur.id'])) {
$erreurs[] = "- le paramètre 'auteur.id' est manquant";
}
// Le paramètre validateur.id (id de la personne validant la détemrinatiuon)
// est là pour éviter que le $_POST ne soit vide
if (isset($parametres['validateur.id']) && !is_numeric($parametres['validateur.id'])) {
$erreurs[] = "- le paramètre 'validateur.id' doit être un entier";
 
// Le paramètre validateur.id (id de la personne validant la détemrinatiuon)
// est là pour éviter que le $_POST ne soit vide
if (isset($parametres['validateur.id']) && !is_numeric($parametres['validateur.id'])) {
$erreurs[] = "- le paramètre 'validateur.id' doit être un entier";
}
 
if ($erreurs) {
131,7 → 129,7
$controleAcces = $this->conteneur->getControleAcces();
$utilisateurInfos = $controleAcces->getInfosUtilisateurConnecte();
$utilisateurId = $utilisateurInfos['id_utilisateur'];
 
// si l'utilisateur connecté n'est ni auteur de l'observation, ni au moins administrateur de niveau 1
if (($this->idAuteurObs != $utilisateurId) && $utilisateurInfos['admin'] < 1) {
$msg = "Seul l'utilisateur ayant saisi l'observation, un administrateur ou un validateur peut la valider : veuillez vous identifier.\n";
/trunk/services/modules/0.1/commentaires/ListeCommentaires.php
20,7 → 20,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
31,8 → 30,7
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
154,9 → 152,9
* */
private function chargerCommentaires() {
 
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS * FROM del_commentaire ';
$requeteLiaisons .= $this->chargerClauseWhere();
$requeteLiaisons .= $this->gestionBdd->getLimitSql();
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS * FROM del_commentaire '.
$this->chargerClauseWhere().
' LIMIT '.$this->navigation->getDepart().', '.$this->navigation->getLimite();
return $this->bdd->recupererTous($requeteLiaisons);
}
 
/trunk/services/modules/0.1/commentaires/SupprimerCommentaire.php
20,7 → 20,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
34,8 → 33,7
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
/trunk/services/modules/0.1/commentaires/AjouterCommentaire.php
1,18 → 1,18
<?php
// declare(encoding='UTF-8');
/**
* Le web service image récupère toutes les données de la table del_obs_images
* pour retourner une liste d'images associée à une observation
* Permet d'ajouter un commentaire.
*
* @category php 5.2
* @package del
* @subpackage images
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
* @category DEL
* @package Services
* @subpackage Commentaires
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
 
class AjouterCommentaire {
20,7 → 20,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
27,14 → 26,13
 
private $commentaire;
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
public function __construct(Conteneur $conteneur) {
$this->conteneur = $conteneur;
$this->conteneur->chargerConfiguration('config_commentaires.ini');
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
257,5 → 255,4
 
return implode(', ', $valeurs);
}
}
?>
}
/trunk/services/modules/0.1/commentaires/ConsulterCommentaire.php
20,7 → 20,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
32,8 → 31,7
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
170,9 → 168,9
* Chargement depuis la bdd de tous les commentaires
* */
private function chargerCommentaires() {
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS * FROM del_commentaire ';
$requeteLiaisons .= $this->chargerClauseWhere();
$requeteLiaisons .= $this->gestionBdd->getLimitSql();
$requeteLiaisons = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS * FROM del_commentaire '.
$this->chargerClauseWhere().
' LIMIT '.$this->navigation->getDepart().', '.$this->navigation->getLimite();
return $this->bdd->recupererTous($requeteLiaisons);
}
 
/trunk/services/modules/0.1/motscles/AjouterMotCle.php
17,15 → 17,14
require_once('MotClePictoflora.php');
 
class AjouterMotCle {
 
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
 
private $commentaire;
 
public function __construct(Conteneur $conteneur = null) {
32,11 → 31,9
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
* Ajoute un mot-clé si les objets fournis en paramètres sont valides
* pour l'afficher.
45,46 → 42,46
* */
public function ajouter($ressources, $parametres) {
$this->initialiserRessourcesEtParametres($ressources, $parametres);
 
// Gestion des configuration du script
$this->verifierConfiguration();
$insertion = $this->insererMotCle($this->parametres);
 
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
$resultat->corps = array('id_mot_cle' => $insertion);
 
return $resultat;
}
 
private function initialiserRessourcesEtParametres($ressources, $parametres) {
$this->ressources = $ressources;
$this->parametres = $parametres;
$this->parametres = $parametres;
}
 
/*-------------------------------------------------------------------------------
CONFIGURATION DU SERVICE
--------------------------------------------------------------------------------*/
--------------------------------------------------------------------------------*/
/**
* Vérifier que le service est bien configuré
* Vérifier que le service est bien configuré
* */
public function verifierConfiguration() {
$erreurs = array();
 
if (!isset($this->parametres['image'])) {
$erreurs[] = ' - impossible d\'ajouter un mot clé sans image associée ;';
} else if(!is_numeric($this->parametres['image'])) {
$erreurs[] = ' - l\'identifiant d\'image doit être un entier ;';
}
 
if (!isset($this->parametres['mot_cle'])) {
$erreurs[] = ' - impossible d\'ajouter un mot clé sans le mot clé ;';
}
 
if (!isset($this->parametres['auteur.id'])) {
$erreurs[] = ' - impossible d\'ajouter un mot clé sans auteur associé ;';
}
 
if (!empty($erreurs)) {
$e = 'Erreur de configuration :';
$e = implode("\n", $erreurs);
92,10 → 89,10
throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
}
}
 
/*-------------------------------------------------------------------------------
INSERTION DES MOTS CLES
--------------------------------------------------------------------------------*/
INSERTION DES MOTS CLES
--------------------------------------------------------------------------------*/
/**
* Insère un mot clé dans la table
* @param $mot_cle array la liste des paramètres
104,9 → 101,9
$id_image = intval($mot_cle['image']);
$id_auteur = $mot_cle['auteur.id'];
$mots_cles = explode(",", $mot_cle['mot_cle']);
array_walk($mots_cles, create_function('&$val', '$val = trim($val);'));
array_walk($mots_cles, create_function('&$val', '$val = trim($val);'));
 
$valeurs_a_inserer = array();
$valeurs_a_inserer = array();
foreach ($mots_cles as $mot_cle_a_inserer) {
$mot_cle_normalise = MotClePictoflora::normaliserMotCle($mot_cle_a_inserer);
$valeurs_a_inserer[] = sprintf('(%d, %s, %s, %s, NOW(), 1, NOW())',
/trunk/services/modules/0.1/motscles/ListeMotsCles.php
19,7 → 19,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
30,8 → 29,7
$this->conteneur->chargerConfiguration('config_mapping_mots_cles.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
/trunk/services/modules/0.1/motscles/SupprimerMotCle.php
17,15 → 17,14
require_once('MotClePictoflora.php');
 
class SupprimerMotCle {
 
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
 
private $motCleId;
 
public function __construct(Conteneur $conteneur = null) {
32,10 → 31,9
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
* Supprime un mot-clé si les objets fournis en paramètres sont valides
* pour l'afficher.
44,37 → 42,37
* */
public function supprimer($ressources, $parametres) {
$this->initialiserRessourcesEtParametres($ressources, $parametres);
 
// Gestion des configuration du script
$this->verifierConfiguration();
$insertion = $this->supprimerMotCle($this->motCleId);
 
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
 
return $resultat;
}
 
private function initialiserRessourcesEtParametres($ressources, $parametres) {
$this->ressources = $ressources;
$this->parametres = $parametres;
$this->parametres = $parametres;
}
 
/*-------------------------------------------------------------------------------
CONFIGURATION DU SERVICE
--------------------------------------------------------------------------------*/
--------------------------------------------------------------------------------*/
/**
* Vérifier que le service est bien configuré
* Vérifier que le service est bien configuré
* */
public function verifierConfiguration() {
$erreurs = array();
 
if (!isset($this->ressources[0])) {
$erreurs[] = ' - impossible de supprimer un mot clé sans l\'identifiant associé ;';
} else if(!is_numeric($this->ressources[0])) {
$erreurs[] = ' - l\'identifiant de mot clé doit être un entier ;';
}
 
if (!empty($erreurs)) {
$e = 'Erreur de configuration :';
$e = implode("\n", $erreurs);
84,10 → 82,10
$this->motCleId = $this->ressources[0];
}
}
 
/*-------------------------------------------------------------------------------
SUPPRESSION DES MOTS CLES
--------------------------------------------------------------------------------*/
SUPPRESSION DES MOTS CLES
--------------------------------------------------------------------------------*/
/**
* Supprime un mot clé dans la table
* @param $id_mot_cle string identifiant de mot clé
/trunk/services/modules/0.1/protocoles/ListeProtocoles.php
19,7 → 19,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
protected $bdd;
private $parametres = array();
private $ressources = array();
29,8 → 28,7
$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
/trunk/services/modules/0.1/Images.php
235,5 → 235,4
$classeNom = str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
return $classeNom;
}
}
?>
}
/trunk/services/modules/0.1/utilisateurs/Preferences.php
17,7 → 17,6
class Preferences {
 
private $conteneur;
private $gestionBdd;
private $bdd;
 
public function __construct(Conteneur $conteneur = null) {
24,8 → 23,7
session_start();
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_utilisateurs.ini');
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
/trunk/services/modules/0.1/images/ListeImages.php
125,7 → 125,7
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_images.ini');
$this->bdd = $conteneur->getGestionBdd()->getBdd();
$this->bdd = $conteneur->conteneur->getBdd();
}
 
public function consulter($ressources, $parametres) {
/trunk/services/modules/0.1/images/VotesImage.php
21,7 → 21,6
private $conteneur;
private $navigation;
private $masque;
protected $gestionBdd;
protected $bdd;
private $ressources;
private $parametres;
32,8 → 31,7
$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
/trunk/services/modules/0.1/nomstaxons/ListeTaxons.php
16,25 → 16,23
*/
 
class ListeTaxons {
 
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
private $requete = null;
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_nomstaxons.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
* Méthode principale de la classe.
* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
42,7 → 40,7
* */
public function consulter($ressources, $parametres) {
$this->initialiserRessourcesEtParametres($ressources, $parametres);
 
// Lancement du service
$taxons = $this->chargerNoms($this->masque->getMasque('referentiel'), $this->masque->getMasque('nom'));
$total = $this->compterNoms($taxons);
49,18 → 47,18
$this->navigation->setTotal($total);
$this->conteneur->setSansLimite();
$resultat = new ResultatService();
 
$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $taxons);
return $resultat;
}
 
private function initialiserRessourcesEtParametres($ressources, $parametres) {
$this->ressources = $ressources;
$this->parametres = $parametres;
}
 
/*-------------------------------------------------------------------------------
CHARGEMENT DES COMMENTAIRES
CHARGEMENT DES COMMENTAIRES
--------------------------------------------------------------------------------*/
/**
* Chargement depuis le serveur de tous les noms
77,7 → 75,7
}
return $res_fmt;
}
 
/**
* Compter le nombre total de noms pour affichage dans entete.
* */
/trunk/services/modules/0.1/Determinations.php
4,14 → 4,17
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
* @package eflore-projets
*
* @category DEL
* @package Services
* @subpackage Determinations
* @version 0.1
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org>
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version 0.1
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Determinations extends RestService {
 
/trunk/services/modules/0.1/Commentaires.php
1,31 → 1,44
<?php
/**
* Description :
* Classe principale de chargement des services d'eFlore.
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
* @package eflore-projets
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org>
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version 0.1
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
*/
* Classe principale de chargement des services concernant les commentaires.
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* URLs possibles :
*
* GET :
* http://localhost/del/services/0.1/commentaires => liste tous les commentaires
* http://localhost/del/services/0.1/commentaires/#id => retourne le contenu d'un commentaire d'id #id
*
* PUT :
* http://localhost/del/services/0.1/commentaires => Ajoute un nouveau commentaire
*
* DELETE :
* http://localhost/del/services/0.1/commentaires/#id => supprime le commentaire d'id #id
*
* @category DEL
* @package Services
* @subpackage Commentaires
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Commentaires extends RestService {
 
private $parametres = array();
private $ressources = array();
private $methode = null;
private $projetNom = array();
private $serviceNom = array();
private $serviceNom = 'commentaires';
private $sousServiceNom = null;
private $cheminCourant = null;
 
private $conteneur;
 
/** Indique si oui (true) ou non (false), on veut utiliser les paramètres bruts. */
protected $utilisationParametresBruts = true;
 
35,29 → 48,31
 
public function consulter($ressources, $parametres) {
$this->methode = 'consulter';
$resultat = '';
$reponseHttp = new ReponseHttp();
try {
$this->initialiserRessourcesEtParametres($ressources, $parametres);
$this->conteneur = new Conteneur($this->parametres);
$resultat = $this->traiterRessources();
$reponseHttp->setResultatService($resultat);
} catch (Exception $e) {
$reponseHttp->ajouterErreur($e);
}
$reponseHttp->emettreLesEntetes();
$corps = $reponseHttp->getCorps();
return $corps;
$this->initialiserRessourcesEtParametres($ressources, $parametres);
return $this->executerService();
}
public function ajouter($ressources, $parametres) {
 
public function ajouter($ressources, $requeteDonnees) {
$this->methode = 'ajouter';
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees);
return $this->executerService();
}
 
public function supprimer($ressources) {
$this->methode = 'supprimer';
$this->initialiserRessourcesEtParametres($ressources);
return $this->executerService();
}
 
private function initialiserRessourcesEtParametres($ressources, $parametres = array()) {
$this->ressources = $ressources;
$this->parametres = $parametres;
}
 
private function executerService() {
$resultat = '';
$reponseHttp = new ReponseHttp();
try {
$this->initialiserRessourcesEtParametres($ressources, $parametres);
$this->conteneur = new Conteneur($this->parametres);
$resultat = $this->traiterRessources();
$reponseHttp->setResultatService($resultat);
64,115 → 79,92
} catch (Exception $e) {
$reponseHttp->ajouterErreur($e);
}
$reponseHttp->emettreLesEntetes();
$corps = $reponseHttp->getCorps();
return $corps;
}
public function supprimer($ressources) {
$this->methode = 'supprimer';
$resultat = '';
$reponseHttp = new ReponseHttp();
try {
$this->ressources = $ressources;
$this->conteneur = new Conteneur();
$resultat = $this->traiterRessources();
$reponseHttp->setResultatService($resultat);
} catch (Exception $e) {
$reponseHttp->ajouterErreur($e);
$reponseHttp->emettreLesEntetes();
echo $reponseHttp->getCorps();
}
}
private function initialiserRessourcesEtParametres($ressources, $parametres) {
$this->ressources = $ressources;
$this->parametres = $parametres;
}
 
private function traiterRessources() {
$retour = '';
$this->initialiserProjet();
$this->chargerConfigService();
$this->analyserRessources();
$retour = $this->initialiserService();
return $retour;
}
 
/*------------------------------------------------------------------------------------------------------------------
CONFIGURATION DU PROJET
------------------------------------------------------------------------------------------------------------------*/
private function initialiserProjet() {
$this->projetNom = 'commentaires';
$this->chargerConfigProjet();
private function chargerConfigService() {
$chemin = Config::get('chemin_configurations')."config_{$this->serviceNom}.ini";
Config::charger($chemin);
}
 
private function chargerConfigProjet() {
$projet = $this->projetNom;
$chemin = Config::get('chemin_configurations')."config_$projet.ini";
Config::charger($chemin);
private function analyserRessources() {
if ($this->methode == 'consulter') {
if (!isset($this->ressources) || empty($this->ressources)) {
$this->sousServiceNom = 'liste-commentaires';
} else if (isset($this->ressources[0]) && count($this->ressources) == 1 && is_numeric($this->ressources[0])) {
$this->sousServiceNom = 'consulter-commentaire';
}
} else if ($this->methode == 'ajouter') {
$this->sousServiceNom = 'ajouter-commentaire';
} else if ($this->methode == 'supprimer') {
if (isset($this->ressources[0]) && count($this->ressources) == 1 && is_numeric($this->ressources[0])) {
$this->sousServiceNom = 'supprimer-commentaire';
}
}
 
if ($this->sousServiceNom == null) {
$this->lancerMessageErreurRessource();
}
}
 
/*------------------------------------------------------------------------------------------------------------------
CONFIGURATION DU SERVICE
------------------------------------------------------------------------------------------------------------------*/
private function lancerMessageErreurRessource() {
$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources);
$message = "La ressource demandée '$ressource' ".
"n'est pas disponible pour le service ".$this->serviceNom." !\n".
"Les URLs disponibles sont : \n".
" - en GET : commentaires, commentaires/#id \n".
" - en PUT : commentaires".
" - en DELETE : commentaires/#id";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
 
private function initialiserService() {
$this->chargerNomService();
$classe = $this->obtenirNomClasseService($this->serviceNom);
$classe = $this->obtenirNomClasseService($this->sousServiceNom);
//echo $this->sousServiceNom.':'.$classe."\n";
//echo 'Ressources :'.print_r($this->ressources, true);
//echo 'Parametres :'.print_r($this->parametres, true);
$chemins = array();
$chemins[] = $this->cheminCourant.$this->projetNom.DS.$classe.'.php';
$chemins[] = $this->cheminCourant.$this->serviceNom.DS.$classe.'.php';
$chemins[] = $this->cheminCourant.'commun'.DS.$classe.'.php';
$retour = '';
$service = null;
foreach ($chemins as $chemin) {
if (file_exists($chemin)) {
$this->conteneur->chargerConfiguration('config_'.$this->projetNom.'.ini');
$this->conteneur->chargerConfiguration('config_'.$this->serviceNom.'.ini');
require_once $chemin;
$service = new $classe($this->conteneur);
if ($this->methode == 'consulter') {
$retour = $service->consulter($this->ressources, $this->parametres);
} elseif ($this->methode == 'ajouter') {
$retour = $service->ajouter($this->ressources, $this->parametres);
$retour = $service->ajouter($this->ressources, $this->parametres);
} elseif ($this->methode == 'supprimer') {
$retour = $service->supprimer($this->ressources, $this->parametres);
$retour = $service->supprimer($this->ressources);
}
}
}
 
if (is_null($service)) {
$message = "Le service demandé '{$this->serviceNom}' n'existe pas dans le projet {$this->projetNom} !";
$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources);
$message = "Le classe '$classe' correspondant à la ressource '$ressource' ".
"n'existe pas dans le service '{$this->serviceNom}' !";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
return $retour;
}
private function chargerNomService() {
// si la méthode est POST, on ajouter un commentaire
if ($this->methode == 'ajouter') {
$this->serviceNom = 'ajouter-commentaire';
} else if ($this->methode == 'supprimer') {
$this->serviceNom = 'supprimer-commentaire';
}
else {
//S'il n'y a pas de ressources => tous les commentaires
if (!isset($this->ressources) || empty($this->ressources)) {
$this->serviceNom = 'liste-commentaires';
} else {
if (!is_numeric($this->ressources[0])) {
$message = "La première ressource doit être un identifiant";
$code = RestServeur::HTTP_CODE_ERREUR;
throw new Exception($message, $code);
} else {
$this->serviceNom = 'consulter-commentaire';
}
}
}
}
 
private function obtenirNomClasseService($mot) {
$classeNom = str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
return $classeNom;
}
}
?>
}
/trunk/services/modules/0.1/observations/ListeObservations.php
28,31 → 28,29
 
class ListeObservations {
 
private $conteneur;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
private $conteneur;
private $bdd;
private $parametres = array();
private $ressources = array();
 
static $tris_possibles = array('date_observation');
// paramètres autorisés
static $tris_possibles = array('date_observation');
// paramètres autorisés
 
static $sql_fields_liaisons = array(
'dob' => array('id_observation', 'nom_sel AS `determination.ns`', 'nt AS `determination.nt`',
'nom_sel_nn AS `determination.nn`', 'famille AS `determination.famille`',
'nom_referentiel AS `determination.referentiel`',
'ce_zone_geo AS id_zone_geo', 'zone_geo', 'lieudit',
'station', 'milieu', 'date_observation', 'mots_cles_texte', 'date_transmission',
'ce_utilisateur AS `auteur.id`', 'prenom_utilisateur AS `auteur.prenom`',
'nom_utilisateur AS `auteur.nom`', 'courriel_utilisateur AS `auteur.courriel` ',
'commentaire'),
'di' => array('id_image', 'date_prise_de_vue AS `date`', 'hauteur',/* 'largeur','nom_original' // apparemment inutilisés */),
'du' => array('prenom', 'nom', 'courriel'),
'dc' => array('commentaire')
);
static $sql_fields_liaisons = array(
'dob' => array('id_observation', 'nom_sel AS `determination.ns`', 'nt AS `determination.nt`',
'nom_sel_nn AS `determination.nn`', 'famille AS `determination.famille`',
'nom_referentiel AS `determination.referentiel`',
'ce_zone_geo AS id_zone_geo', 'zone_geo', 'lieudit',
'station', 'milieu', 'date_observation', 'mots_cles_texte', 'date_transmission',
'ce_utilisateur AS `auteur.id`', 'prenom_utilisateur AS `auteur.prenom`',
'nom_utilisateur AS `auteur.nom`', 'courriel_utilisateur AS `auteur.courriel` ',
'commentaire'),
'di' => array('id_image', 'date_prise_de_vue AS `date`', 'hauteur',/* 'largeur','nom_original' // apparemment inutilisés */),
'du' => array('prenom', 'nom', 'courriel'),
'dc' => array('commentaire')
);
 
 
public function __construct(Conteneur $conteneur = null) {
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
$this->conteneur->chargerConfiguration('config_observations.ini');
60,38 → 58,37
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
static function reformateObservation($obs, $url_pattern = '') {
static function reformateObservation($obs, $url_pattern = '') {
$obs = array_map('array_filter', $obs);
$obs_merged = array();
foreach($obs as $o) {
$id = $o['id_observation'];
foreach ($obs as $o) {
$id = $o['id_observation'];
 
// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
if(!isset($o['auteur.id']) || !is_numeric($o['auteur.id'])) $o['auteur.id'] = "0";
if(!isset($o['auteur.nom'])) $o['auteur.nom'] = '[inconnu]';
// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
if (!isset($o['auteur.id']) || !is_numeric($o['auteur.id'])) $o['auteur.id'] = "0";
if (!isset($o['auteur.nom'])) $o['auteur.nom'] = '[inconnu]';
 
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
if(!isset($obs_merged['"' . $id . '"'])) $obs_merged['"' . $id . '"'] = $o;
$obs_merged['"' . $id . '"']['images'][] = $image;
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
if (!isset($obs_merged['"' . $id . '"'])) $obs_merged['"' . $id . '"'] = $o;
$obs_merged['"' . $id . '"']['images'][] = $image;
}
return $obs_merged;
}
 
/**
* Méthode principale de la classe.
* Lance la récupération des images dans la base et les place dans un objet ResultatService
* pour l'afficher.
* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
* @param array $parametres les paramètres situés après le ? dans l'url
**/
public function consulter($ressources, $parametres) {
/**
* Méthode principale de la classe.
* Lance la récupération des images dans la base et les place dans un objet ResultatService
* pour l'afficher.
* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
* @param array $parametres les paramètres situés après le ? dans l'url
**/
public function consulter($ressources, $parametres) {
// SELECT, à terme, pourrait affecter getInfos(), mais en aucune manière getIdObs()
$req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
 
119,318 → 116,311
// idobs est une liste (toujours ordonnée) des id d'observations recherchées
$idobs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $idobs_tab));
 
if($idobs) {
$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
if ($idobs) {
$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
 
// 2) récupération des données nécessaires pour ces observations (obs + images)
// ici les champs récupérés sont issus de self::$sql_fields_liaisons mais sans préfixes
// car tout provient de v_del_image
$obs_unfmt = self::getInfos($idobs, $db);
// 2) récupération des données nécessaires pour ces observations (obs + images)
// ici les champs récupérés sont issus de self::$sql_fields_liaisons mais sans préfixes
// car tout provient de v_del_image
$obs_unfmt = self::getInfos($idobs, $db);
 
// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
$observations = self::reformateObservation($obs_unfmt, $this->conteneur->getParametre('url_images'));
// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
$observations = self::reformateObservation($obs_unfmt, $this->conteneur->getParametre('url_images'));
 
// 4) récupération des données nécessaires pour ces observations (commentaires + votes)
// modifie $observations
$this->configurer();
$this->chargerDeterminations($observations);
// 4) récupération des données nécessaires pour ces observations (commentaires + votes)
// modifie $observations
$this->configurer();
$this->chargerDeterminations($observations);
 
// 5) restauration de l'ordre souhaité initialement
$observations = self::sortArrayByArray($observations, $idobs);
// 5) restauration de l'ordre souhaité initialement
$observations = self::sortArrayByArray($observations, $idobs);
} else {
$observations = array();
$total = 0;
$observations = array();
$total = 0;
}
 
// 6) JSON output
$resultat = new ResultatService();
$resultat->corps = array('entete' => DelTk::makeJSONHeader($total, $params, Config::get('url_service')),
'resultats' => $observations);
'resultats' => $observations);
 
return $resultat;
}
}
 
static function sortArrayByArray($array, $orderArray) {
static function sortArrayByArray($array, $orderArray) {
$ordered = array();
foreach($orderArray as $key) {
if(array_key_exists('"' . $key . '"', $array)) {
$ordered['"' . $key . '"'] = $array['"' . $key . '"'];
unset($array['"' . $key . '"']);
}
foreach ($orderArray as $key) {
if (array_key_exists('"' . $key . '"', $array)) {
$ordered['"' . $key . '"'] = $array['"' . $key . '"'];
unset($array['"' . $key . '"']);
}
}
return $ordered + $array;
}
}
 
// SQL helpers
/*
* Retourne une liste ordonnée d'id d'observation correspondant aux critères
* passés dans p et aux clauses where/join présentes dans le tableau $req
*
* @param p: $params (filtrés sauf escape-string)
* @param req: le tableau représentant les composants de la requete SQL
* @param db: l'instance de db
*/
static function getIdObs($p, $req, $db) {
$req_s = sprintf('SELECT SQL_CALC_FOUND_ROWS id_observation' .
' FROM v_del_image vdi'.
' %s' . // LEFT JOIN if any
' WHERE %s'. // where-clause ou TRUE
' %s'. // group-by
' %s'. // having (si commentaires)
' ORDER BY %s %s %s'.
' LIMIT %d, %d -- %s',
// SQL helpers
/*
* Retourne une liste ordonnée d'id d'observation correspondant aux critères
* passés dans p et aux clauses where/join présentes dans le tableau $req
*
* @param p: $params (filtrés sauf escape-string)
* @param req: le tableau représentant les composants de la requete SQL
* @param db: l'instance de db
*/
static function getIdObs($p, $req, $db) {
$req_s = sprintf('SELECT SQL_CALC_FOUND_ROWS id_observation' .
' FROM v_del_image vdi'.
' %s' . // LEFT JOIN if any
' WHERE %s'. // where-clause ou TRUE
' %s'. // group-by
' %s'. // having (si commentaires)
' ORDER BY %s %s %s'.
' LIMIT %d, %d -- %s',
 
$req['join'] ? implode(' ', $req['join']) : '',
$req['where'] ? implode(' AND ', $req['where']) : 'TRUE',
$req['join'] ? implode(' ', $req['join']) : '',
$req['where'] ? implode(' AND ', $req['where']) : 'TRUE',
 
$req['groupby'] ? ('GROUP BY ' . implode(', ', array_unique($req['groupby']))) : '',
$req['having'] ? ('HAVING ' . implode(' AND ', $req['having'])) : '',
$req['groupby'] ? ('GROUP BY ' . implode(', ', array_unique($req['groupby']))) : '',
$req['having'] ? ('HAVING ' . implode(' AND ', $req['having'])) : '',
 
$p['tri'], strtoupper($p['ordre']),
// date_transmission peut-être NULL et nous voulons de la consistence
// (sauf après r1860 de Cel)
$p['tri'] == 'date_transmission' ? ', id_observation' : '',
$p['tri'], strtoupper($p['ordre']),
// date_transmission peut-être NULL et nous voulons de la consistence
// (sauf après r1860 de Cel)
$p['tri'] == 'date_transmission' ? ', id_observation' : '',
 
$p['navigation.depart'], $p['navigation.limite'], __FILE__ . ':' . __LINE__);
$p['navigation.depart'], $p['navigation.limite'], __FILE__ . ':' . __LINE__);
 
$res = $db->recupererTous($req_s);
$err = mysql_error();
if(!$res && $err) {
// http_response_code(400);
// if(defined('DEBUG') && DEBUG) header("X-Debug: $req_s");
throw new Exception('not found', 400);
$res = $db->recupererTous($req_s);
$err = mysql_error();
if (!$res && $err) {
// http_response_code(400);
// if(defined('DEBUG') && DEBUG) header("X-Debug: $req_s");
throw new Exception('not found', 400);
}
// ordre préservé, à partir d'ici c'est important.
return $res;
}
// ordre préservé, à partir d'ici c'est important.
return $res;
}
 
/*
Champs récupérés:
Pour del_images, la vue retourne déjà ce que nous recherchons de cel_obs et cel_images
(cel_obs.* et cel_[obs_]images.{id_observation, id_image, date_prise_de_vue AS date, hauteur, largeur})
Pour del_commentaires: nous voulons *
Reste ensuite à formatter.
Note: le préfixe de table utilisé ici (vdi) n'impacte *aucune* autre partie du code car rien
n'en dépend pour l'heure. (inutilisation de $req['select'])
*/
static function getInfos($idobs, $db) {
/*$select_fields = implode(',', array_merge(
array_map(create_function('$a', 'return "vdi.".$a;'), self::$sql_fields_liaisons['dob']),
array_map(create_function('$a', 'return "vdi.".$a;'), self::$sql_fields_liaisons['di']),
array_map(create_function('$a', 'return "du.".$a;'), self::$sql_fields_liaisons['du'])));*/
$select_fields = array_merge(self::$sql_fields_liaisons['dob'],
self::$sql_fields_liaisons['di']);
$req_s = sprintf('SELECT %s FROM v_del_image vdi'.
// ' LEFT JOIN del_commentaire AS dc ON di.id_observation = dc.ce_observation AND dc.nom_sel IS NOT NULL'.
' WHERE id_observation IN (%s)',
implode(',', $select_fields),
implode(',', $idobs));
return $db->recupererTous($req_s);
}
/**
* Champs récupérés:
* Pour del_images, la vue retourne déjà ce que nous recherchons de cel_obs et cel_images
* (cel_obs.* et cel_[obs_]images.{id_observation, id_image, date_prise_de_vue AS date, hauteur, largeur})
* Pour del_commentaires: nous voulons *
* Reste ensuite à formatter.
* Note: le préfixe de table utilisé ici (vdi) n'impacte *aucune* autre partie du code car rien
* n'en dépend pour l'heure. (inutilisation de $req['select'])
*/
static function getInfos($idobs, $db) {
/*$select_fields = implode(',', array_merge(
array_map(create_function('$a', 'return "vdi.".$a;'), self::$sql_fields_liaisons['dob']),
array_map(create_function('$a', 'return "vdi.".$a;'), self::$sql_fields_liaisons['di']),
array_map(create_function('$a', 'return "du.".$a;'), self::$sql_fields_liaisons['du'])));*/
$select_fields = array_merge(self::$sql_fields_liaisons['dob'], self::$sql_fields_liaisons['di']);
$req_s = sprintf('SELECT %s FROM v_del_image vdi'.
// ' LEFT JOIN del_commentaire AS dc ON di.id_observation = dc.ce_observation AND dc.nom_sel IS NOT NULL'.
' WHERE id_observation IN (%s)',
implode(',', $select_fields),
implode(',', $idobs));
return $db->recupererTous($req_s);
}
 
/**
* Complément à DelTk::sqlAddConstraint()
*
* @param $p les paramètres (notamment de masque) passés par l'URL et déjà traités/filtrés (sauf quotes)
* @param $req le tableau, passé par référence représentant les composants de la requête à bâtir
* @param $c conteneur, utilisé soit pour l'appel récursif à requestFilterParams() en cas de param "masque"
* soit pour la définition du type (qui utilise la variable nb_commentaires_discussion)
*/
static function sqlAddConstraint($p, $db, &$req, Conteneur $c = NULL) {
if (!empty($p['masque.tag'])) {
// TODO: remove LOWER() lorsqu'on est sur que les tags sont uniformés en minuscule
// i_mots_cles_texte provient de la VIEW v_del_image
if (isset($p['masque.tag']['AND'])) {
/* Lorsque nous interprêtons la chaîne provenant du masque général (cf: buildTagsAST($p['masque'], 'OR', ' ') dans sqlAddMasqueConstraint()),
nous sommes splittés par espace. Cependant, assurons que si une virgule à été saisie, nous n'aurons pas le motif
" AND CONCAT(mots_cles_texte, i_mots_cles_texte) REGEXP ',' " dans notre requête.
XXX: Au 12/11/2013, une recherche sur tag depuis le masque général implique un OU, donc le problème ne se pose pas ici */
$subwhere = array();
foreach ($p['masque.tag']['AND'] as $tag) {
if (trim($tag) == ',') continue;
 
/**
* Complément à DelTk::sqlAddConstraint()
*
* @param $p les paramètres (notamment de masque) passés par l'URL et déjà traités/filtrés (sauf quotes)
* @param $req le tableau, passé par référence représentant les composants de la requête à bâtir
* @param $c conteneur, utilisé soit pour l'appel récursif à requestFilterParams() en cas de param "masque"
* soit pour la définition du type (qui utilise la variable nb_commentaires_discussion)
*/
static function sqlAddConstraint($p, $db, &$req, Conteneur $c = NULL) {
if(!empty($p['masque.tag'])) {
// TODO: remove LOWER() lorsqu'on est sur que les tags sont uniformés en minuscule
// i_mots_cles_texte provient de la VIEW v_del_image
if(isset($p['masque.tag']['AND'])) {
/* Lorsque nous interprêtons la chaîne provenant du masque général (cf: buildTagsAST($p['masque'], 'OR', ' ') dans sqlAddMasqueConstraint()),
nous sommes splittés par espace. Cependant, assurons que si une virgule à été saisie, nous n'aurons pas le motif
" AND CONCAT(mots_cles_texte, i_mots_cles_texte) REGEXP ',' " dans notre requête.
XXX: Au 12/11/2013, une recherche sur tag depuis le masque général implique un OU, donc le problème ne se pose pas ici */
$subwhere = array();
foreach($p['masque.tag']['AND'] as $tag) {
if(trim($tag) == ',') continue;
$subwhere[] = sprintf('LOWER(CONCAT(%s)) REGEXP %s',
DelTk::sqlAddIfNullPourConcat(array('vdi.mots_cles_texte', 'vdi.i_mots_cles_texte')),
$db->proteger(strtolower($tag)));
}
$req['where'][] = '(' . implode(' AND ', $subwhere) . ')';
} else {
$req['where'][] = sprintf('LOWER(CONCAT(%s)) REGEXP %s',
DelTk::sqlAddIfNullPourConcat(array('vdi.mots_cles_texte', 'vdi.i_mots_cles_texte')),
$db->proteger(strtolower(implode('|', $p['masque.tag']['OR']))));
}
}
 
$subwhere[] = sprintf('LOWER(CONCAT(%s)) REGEXP %s',
DelTk::sqlAddIfNullPourConcat(array('vdi.mots_cles_texte', 'vdi.i_mots_cles_texte')),
$db->proteger(strtolower($tag)));
if (!empty($p['masque.type'])) {
self::addTypeConstraints($p['masque.type'], $db, $req, $c);
}
$req['where'][] = '(' . implode(' AND ', $subwhere) . ')';
}
else {
$req['where'][] = sprintf('LOWER(CONCAT(%s)) REGEXP %s',
DelTk::sqlAddIfNullPourConcat(array('vdi.mots_cles_texte', 'vdi.i_mots_cles_texte')),
$db->proteger(strtolower(implode('|', $p['masque.tag']['OR']))));
}
}
 
if(!empty($p['masque.type'])) {
self::addTypeConstraints($p['masque.type'], $db, $req, $c);
}
}
/** Le masque fait une recherche générique parmi de nombreux champs ci-dessus.
* Nous initialisons donc ces paramètres (excepté masque biensur), et nous rappelons
* récursivement. À la seule différence que nous n'utiliserons que $or_req['where']
* imploded par des " OR ".
*/
static function sqlAddMasqueConstraint($p, $db, &$req, Conteneur $c = NULL) {
if (!empty($p['masque'])) {
$or_params = array('masque.auteur' => $p['masque'],
'masque.departement' => $p['masque'],
'masque.id_zone_geo' => $p['masque'],
'masque.tag' => $p['masque'],
'masque.ns' => $p['masque'],
'masque.famille' => $p['masque'],
'masque.date' => $p['masque'],
'masque.genre' => $p['masque'],
/* milieu: TODO ? */ );
/* Cependant les champs spécifiques ont priorité sur le masque général.
Pour cette raison nous supprimons la génération de SQL du masque général sur les
champ spécifiques qui feront l'objet d'un traitement avec une valeur propre. */
if (isset($p['masque.auteur'])) unset($or_params['masque.auteur']);
if (isset($p['masque.departement'])) unset($or_params['masque.departement']);
if (isset($p['masque.id_zone_geo'])) unset($or_params['masque.id_zone_geo']);
if (isset($p['masque.tag'])) unset($or_params['masque.tag']);
if (isset($p['masque.famille'])) unset($or_params['masque.famille']);
if (isset($p['masque.date'])) unset($or_params['masque.date']);
if (isset($p['masque.genre'])) unset($or_params['masque.genre']);
 
/* Le masque fait une recherche générique parmi de nombreux champs ci-dessus.
Nous initialisons donc ces paramètres (excepté masque biensur), et nous rappelons
récursivement. À la seule différence que nous n'utiliserons que $or_req['where']
imploded par des " OR ". */
static function sqlAddMasqueConstraint($p, $db, &$req, Conteneur $c = NULL) {
if(!empty($p['masque'])) {
$or_params = array('masque.auteur' => $p['masque'],
'masque.departement' => $p['masque'],
'masque.id_zone_geo' => $p['masque'],
'masque.tag' => $p['masque'],
'masque.ns' => $p['masque'],
'masque.famille' => $p['masque'],
'masque.date' => $p['masque'],
'masque.genre' => $p['masque'],
/* milieu: TODO ? */ );
/* Cependant les champs spécifiques ont priorité sur le masque général.
Pour cette raison nous supprimons la génération de SQL du masque général sur les
champ spécifiques qui feront l'objet d'un traitement avec une valeur propre. */
if(isset($p['masque.auteur'])) unset($or_params['masque.auteur']);
if(isset($p['masque.departement'])) unset($or_params['masque.departement']);
if(isset($p['masque.id_zone_geo'])) unset($or_params['masque.id_zone_geo']);
if(isset($p['masque.tag'])) unset($or_params['masque.tag']);
if(isset($p['masque.famille'])) unset($or_params['masque.famille']);
if(isset($p['masque.date'])) unset($or_params['masque.date']);
if(isset($p['masque.genre'])) unset($or_params['masque.genre']);
 
$or_masque = DelTk::requestFilterParams($or_params, array_keys($or_params), $c);
if (isset($or_params['masque.tag'])) {
$or_masque['masque.tag'] = DelTk::buildTagsAST($p['masque'], 'OR', ' ');
}
 
$or_masque = DelTk::requestFilterParams($or_params, array_keys($or_params), $c);
if(isset($or_params['masque.tag'])) {
$or_masque['masque.tag'] = DelTk::buildTagsAST($p['masque'], 'OR', ' ');
}
// $or_req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
$or_req = array('join' => array(), 'where' => array());
DelTk::sqlAddConstraint($or_masque, $db, $or_req);
self::sqlAddConstraint($or_masque, $db, $or_req);
 
// $or_req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
$or_req = array('join' => array(), 'where' => array());
DelTk::sqlAddConstraint($or_masque, $db, $or_req);
self::sqlAddConstraint($or_masque, $db, $or_req);
if ($or_req['where']) {
$req['where'][] = '(' . implode(' OR ', $or_req['where']) . ')';
// utile au cas ou des jointures seraient rajoutées
$req['join'] = array_unique(array_merge($req['join'], $or_req['join']));
}
}
}
 
if($or_req['where']) {
$req['where'][] = '(' . implode(' OR ', $or_req['where']) . ')';
// utile au cas ou des jointures seraient rajoutées
$req['join'] = array_unique(array_merge($req['join'], $or_req['join']));
}
private function configurer() {
$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');
$this->mappingCommentaire = $this->conteneur->getParametre('mapping_commentaire');
}
}
 
/**
* @param $req: la représentation de la requête MySQL complète, à amender.
*/
static function addTypeConstraints($val, $db, &$req, Conteneur $c) {
if (array_key_exists('adeterminer', $val)) {
// On récupère toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
// *ou* qui ont la "certitude" à ("aDeterminer" *ou* "douteux")
$req['where'][] = '(' . implode(' OR ', array(
'vdi.certitude = "aDeterminer"',
'vdi.certitude = "douteux"',
'vdi.mots_cles_texte LIKE "%aDeterminer%"',
'vdi.nom_sel_nn IS NULL',
'vdi.nom_sel_nn = 0', // il ne DEVRAIT pas y avoir d'entrées à 0, mais il y en a quand-même !!
)) . ')';
}
if (array_key_exists('validees', $val)) {
//On récupère toutes les observations ayant un commentaire doté de proposition_retenue = 1
$req['join'][] = 'INNER JOIN del_commentaire AS dc ON vdi.id_observation = dc.ce_observation AND dc.proposition_retenue = 1';
}
 
private function configurer() {
$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');
$this->mappingCommentaire = $this->conteneur->getParametre('mapping_commentaire');
}
// solution n°1: impraticable
if (false && array_key_exists('endiscussion', $val)) {
//Si on veut les observations en discussion,
// on va récupérer les ids des observations dont le nombre de commentaire est supérieur à N
$req['select'][] = 'COUNT(dc.id_commentaire) AS comm_count';
$req['join'][] = 'INNER JOIN del_commentaire AS dc ON vdi.id_observation = dc.ce_observation';
$req['groupby'][] = 'vdi.id_observation';
$req['having'][] = "COUNT(id_commentaire) > " . $c->getParametre('nb_commentaires_discussion');
}
 
 
/*
* @param $req: la représentation de la requête MySQL complète, à amender.
*/
static function addTypeConstraints($val, $db, &$req, Conteneur $c) {
if(array_key_exists('adeterminer', $val)) {
// On récupère toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
// *ou* qui ont la "certitude" à ("aDeterminer" *ou* "douteux")
$req['where'][] = '(' . implode(' OR ', array(
'vdi.certitude = "aDeterminer"',
'vdi.certitude = "douteux"',
'vdi.mots_cles_texte LIKE "%aDeterminer%"',
'vdi.nom_sel_nn IS NULL',
'vdi.nom_sel_nn = 0', // il ne DEVRAIT pas y avoir d'entrées à 0, mais il y en a quand-même !!
)) . ')';
if (array_key_exists('endiscussion', $val)) {
$req['where'][] = '(SELECT COUNT(id_commentaire) FROM del_commentaire AS dc'.
' WHERE ce_observation = id_observation) > ' . intval($c->getParametre('nb_commentaires_discussion'));
}
}
if(array_key_exists('validees', $val)) {
//On récupère toutes les observations ayant un commentaire doté de proposition_retenue = 1
$req['join'][] = 'INNER JOIN del_commentaire AS dc ON vdi.id_observation = dc.ce_observation AND dc.proposition_retenue = 1';
}
 
// solution n°1: impraticable
if(false && array_key_exists('endiscussion', $val)) {
//Si on veut les observations en discussion,
// on va récupérer les ids des observations dont le nombre de commentaire est supérieur à N
$req['select'][] = 'COUNT(dc.id_commentaire) AS comm_count';
$req['join'][] = 'INNER JOIN del_commentaire AS dc ON vdi.id_observation = dc.ce_observation';
$req['groupby'][] = 'vdi.id_observation';
$req['having'][] = "COUNT(id_commentaire) > " . $c->getParametre('nb_commentaires_discussion');
}
/**
* Récupérer toutes les déterminations et le nombre de commentaire au total
* @param array $observations la liste des observations à mettre à jour
*/
private function chargerDeterminations(&$observations) {
$idObs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $observations));
$r = sprintf('SELECT * FROM del_commentaire AS dc WHERE dc.nom_sel IS NOT NULL AND ce_observation IN (%s) -- %s',
implode(',',$idObs),
__FILE__ . ':' . __LINE__);
$propositions = $this->bdd->recupererTous($r);
if (!$propositions) return;
foreach ($propositions as $proposition) {
$idObs = $proposition['ce_observation'];
$idComment = $proposition['id_commentaire'];
$comment = $this->formaterDetermination($idComment, $proposition);
if ($comment) $observations['"' . $idObs . '"']['commentaires'][$idComment] = $comment;
 
if(array_key_exists('endiscussion', $val)) {
$req['where'][] = '(SELECT COUNT(id_commentaire) FROM del_commentaire AS dc'.
' WHERE ce_observation = id_observation) > ' . intval($c->getParametre('nb_commentaires_discussion'));
}
}
}
 
private function formaterDetermination($commentId, $proposition) {
if (!$proposition) return NULL;
 
/**
* Récupérer toutes les déterminations et le nombre de commentaire au total
* @param array $observations la liste des observations à mettre à jour
* */
private function chargerDeterminations(&$observations) {
$idObs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'),
$observations));
$r = sprintf('SELECT * FROM del_commentaire AS dc WHERE dc.nom_sel IS NOT NULL AND ce_observation IN (%s) -- %s',
implode(',',$idObs),
__FILE__ . ':' . __LINE__);
$propositions = $this->bdd->recupererTous($r);
if(!$propositions) return;
foreach ($propositions as $proposition) {
$idObs = $proposition['ce_observation'];
$idComment = $proposition['id_commentaire'];
$comment = $this->formaterDetermination($idComment, $proposition);
if($comment) $observations['"' . $idObs . '"']['commentaires'][$idComment] = $comment;
$proposition_formatee = array('nb_commentaires' => '0');
foreach ($this->mappingCommentaire as $nomOriginal => $nomFinal) {
if (isset($proposition[$nomOriginal])) {
$proposition_formatee[$nomFinal] = $proposition[$nomOriginal];
}
}
 
}
}
// Charger les votes sur les déterminations
$resultatsVotes = $this->bdd->recupererTous(
sprintf('SELECT * FROM del_commentaire_vote WHERE ce_proposition = %d', $commentId));
 
private function formaterDetermination($commentId, $proposition) {
if(!$proposition) return NULL;
foreach ($resultatsVotes as $vote) {
$proposition_formatee['votes'][$vote['id_vote']] = $this->formaterVote($vote);
}
 
$proposition_formatee = array('nb_commentaires' => '0');
foreach ($this->mappingCommentaire as $nomOriginal => $nomFinal) {
if (isset($proposition[$nomOriginal])) {
$proposition_formatee[$nomFinal] = $proposition[$nomOriginal];
}
}
// chargerNombreCommentaire()
// Charger le nombre de commentaires (sans détermination) associé à l'observation
$listeCommentaires = $this->bdd->recupererTous(sprintf(
'SELECT ce_commentaire_parent, ce_proposition, COUNT( id_commentaire ) AS nb '.
'FROM del_commentaire WHERE ce_proposition = %d GROUP BY ce_proposition -- %s',
$commentId, __FILE__ . ':' . __LINE__));
foreach ($listeCommentaires as $ligneProposition) {
// ce test sert à exclure les proposition de 1er niveau qui sont elles aussi des commentaires
if ($ligneProposition['ce_commentaire_parent']) {
// TODO/debug: id_commentaire_parent != $commentId ??
// reprendre la "logique" du code... moins de boucles, moins de requêtes, ...
if ($ligneProposition['ce_commentaire_parent'] != $commentId) {
// restore_error_handler();
error_log(sprintf("possible error: nb_commentaires = %s: comment = %d, parent = %d, %s",
$ligneProposition['nb'], $commentId, $ligneProposition['ce_commentaire_parent'], __FILE__));
}
$proposition_formatee['nb_commentaires'] = $ligneProposition['nb'];
} else {
$proposition_formatee['observation']['nb_commentaires'] = $ligneProposition['nb'];
}
}
 
// Charger les votes sur les déterminations
$resultatsVotes = $this->bdd->recupererTous(
sprintf('SELECT * FROM del_commentaire_vote WHERE ce_proposition = %d', $commentId));
 
foreach ($resultatsVotes as $vote) {
$proposition_formatee['votes'][$vote['id_vote']] = $this->formaterVote($vote);
return $proposition_formatee;
}
 
 
// chargerNombreCommentaire()
// Charger le nombre de commentaires (sans détermination) associé à l'observation
$listeCommentaires = $this->bdd->recupererTous(sprintf(
'SELECT ce_commentaire_parent, ce_proposition, COUNT( id_commentaire ) AS nb '.
'FROM del_commentaire WHERE ce_proposition = %d GROUP BY ce_proposition -- %s',
$commentId, __FILE__ . ':' . __LINE__));
foreach ($listeCommentaires as $ligneProposition) {
// ce test sert à exclure les proposition de 1er niveau qui sont elles aussi des commentaires
if($ligneProposition['ce_commentaire_parent']) {
// TODO/debug: id_commentaire_parent != $commentId ??
// reprendre la "logique" du code... moins de boucles, moins de requêtes, ...
if($ligneProposition['ce_commentaire_parent'] != $commentId) {
// restore_error_handler();
error_log(sprintf("possible error: nb_commentaires = %s: comment = %d, parent = %d, %s",
$ligneProposition['nb'], $commentId, $ligneProposition['ce_commentaire_parent'], __FILE__));
/**
* Formater un vote en fonction du fichier de configuration config_votes.ini
* @param $votes array()
*/
private function formaterVote($vote) {
$retour = array();
foreach ($vote as $param=>$valeur) {
$retour[$this->mappingVotes[$param]] = $valeur;
}
$proposition_formatee['nb_commentaires'] = $ligneProposition['nb'];
} else {
$proposition_formatee['observation']['nb_commentaires'] = $ligneProposition['nb'];
}
return $retour;
}
 
return $proposition_formatee;
}
 
/**
* Formater un vote en fonction du fichier de configuration config_votes.ini
* @param $votes array()
* */
private function formaterVote($vote) {
$retour = array();
foreach ($vote as $param=>$valeur) {
$retour[$this->mappingVotes[$param]] = $valeur;
}
return $retour;
}
}
}
/trunk/services/modules/0.1/observations/ListeObservationsWidget.php
18,7 → 18,6
private $conteneur;
private $navigation;
private $masque;
private $gestionBdd;
private $bdd;
private $parametres = array();
private $ressources = array();
31,8 → 30,7
$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
347,7 → 345,7
' INNER JOIN del_obs_image AS doi ON doi.id_observation = dob.id_observation '.
$this->chargerClauseWhere().' '.
"ORDER BY {$this->tri} {$this->directionTri} ".
$this->gestionBdd->getLimitSql();
' LIMIT '.$this->navigation->getDepart().', '.$this->navigation->getLimite();
 
return $this->bdd->recupererTous($requete);
}
/trunk/services/modules/0.1/observations/VoteObservation.php
16,7 → 16,6
 
class VoteObservation extends RestService {
protected $conteneur;
protected $gestionBdd;
protected $bdd;
protected $navigation;
 
23,8 → 22,7
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
$this->navigation = $conteneur->getNavigation();
$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
}
/trunk/services/modules/0.1/observations/Observation.php
23,7 → 23,6
class Observation {
 
private $conteneur;
private $gestionBdd;
private $bdd;
/* Map les champs MySQL vers les champs utilisés dans le JSON pour les clients pour
chacune des différentes tables utilisées pour le chargement de résultats ci-dessous.
117,8 → 116,7
$this->conteneur->chargerConfiguration('config_votes.ini');
$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
/**
/trunk/services/bibliotheque/GestionBdd.php
File deleted
\ No newline at end of file
/trunk/services/bibliotheque/Masque.php
11,14 → 11,14
* @version $Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $
*/
class Masque {
 
const prefixe = 'masque.';
const masqueGeneral = 'masque';
 
private $masquesPossibles;
private $parametres;
private $masque;
 
/**
* Constructeur de la classe Masque
* @param $masquesPossibles la liste des masques autorisés séparé par des ','
33,12 → 33,12
$this->parametres = $parametres;
$this->chargerMasque();
}
 
/**
* Parcourir le tableau Paramètres pour trouver tous les champs masque
*/
public function chargerMasque() {
if ($this->parametres != null) {
if ($this->parametres != null) {
foreach ($this->parametres as $id => $parametre) {
if (strpos($id, self::prefixe) === 0 || $id == self::masqueGeneral) {
if (in_array(str_replace(self::prefixe, '', $id), $this->masquesPossibles)) {
48,7 → 48,7
}
}
}
 
/**
* Retourner les masques sous forme de chaine
* @return String la chaine de caractère sous la forme masque=valeur&masque2=valeur*/
63,7 → 63,7
return '';
}
}
 
/**
* Récupérer tout ou partie du masque
* @param String $id (optionnel) l'idenfiant du masque
76,5 → 76,4
return $this->masque;
}
}
}
?>
}
/trunk/services/bibliotheque/ReponseHttp.php
1,18 → 1,19
<?php
/**
* Classe créant la réponse HTTP pour les services de DEL.
*
* Vérifie qu'aucune erreur n'a été générée. Si une erreur existe, retourne le contenu de l'erreur.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @category DEL
* @package Commun
* @version 0.1
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org)
* Classe créant la réponse HTTP pour les services de DEL.
*
* Vérifie qu'aucune erreur n'a été générée. Si une erreur existe, retourne le contenu de l'erreur.
*
* @category DEL
* @package Services
* @subpackage Bibliotheque
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class ReponseHttp {
 
75,5 → 76,4
}
}
 
}
?>
}
/trunk/services/bibliotheque/Navigation.php
1,14 → 1,17
<?php
/**
* Navigation gère les url de navigation en fonction d'un départ et d'une limite
 
* @category php 5.2
* @package del
* @author Grégoire Duché <gregoire@tela-botanica.org>
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $
* Navigation gère les url de navigation en fonction d'un départ et d'une limite
*
* @category DEL
* @package Services
* @subpackage Bibliotheque
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Navigation {
 
71,14 → 74,13
* @param $parametresAdditionnels le tableau contenant les parametres => valeurs additionnels
* */
private function obtenirUrlNavigation($depart, $limite) {
$parametres = $this->parametres;
$parametres['navigation.depart'] = $depart;
$parametres['navigation.limite'] = $limite;
 
$parametres = $this->parametres;
$parametres['navigation.depart'] = $depart;
$parametres['navigation.limite'] = $limite;
 
$this->urlNavigation->setRequete($parametres);
$url = $this->urlNavigation->getURL();
return $url;
$this->urlNavigation->setRequete($parametres);
$url = $this->urlNavigation->getURL();
return $url;
}
 
/**
101,7 → 103,6
* Récupérer le lien pour afficher les images suivantes en fonction des paramètres
* */
public function recupererHrefSuivant() {
 
$departActuel = $this->getDepart();
$limite = $this->getLimite();
$departSuivant = $departActuel + $limite;
126,6 → 127,4
public function setTotal($total) {
$this->total = $total;
}
 
}
?>
}
/trunk/services/bibliotheque/Outils.php
1,4 → 1,22
<?php
/**
* Classe contenant des méthodes utilitaires.
*
* Mettre les méthodes utilitaires dans cette classe, de temps en temps, si plusieurs méthodes ont une
* intéraction entre elles ou peuvent être regroupées. Les rassembler dans une nouvelle classe et mettre à
* jour le code.
*
* @category DEL
* @package Services
* @subpackage Bibliotheque
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Outils {
 
public static function recupererTableauConfig($parametres) {
17,5 → 35,4
}
return $tableau;
}
}
?>
}
/trunk/services/bibliotheque/Conteneur.php
1,15 → 1,17
<?php
/**
* Le conteneur encapsule les classe Masque, Navigation et GestionBdd
* Il gère leur instanciation, ainsi que la récupération des paramètres depuis l'url ou
* Le conteneur encapsule l'instanciation des classes ainsi que la récupération des paramètres depuis l'url ou
* les fichiers de configuration
*
* @category DEL
* @package Commun
* @author Grégoire Duché <gregoire@tela-botanica.org>
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @package Bibliotheque
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
//TODO : initialiser tous les objets dans le conteneur
//TODO : créer un tableau de partage
20,6 → 22,7
protected $masque;
protected $gestionBdd;
protected $sansLimite = false;
protected $partages = array();
 
/**
* Constructeur de la classe
69,6 → 72,8
$this->parametres[$cle] = $valeur;
}
 
//--------------------------------------------------------------------------------------------------------
// Ci-dessous méthode à revoir !
/**
* Charger la configuration depuis le fichier
* @param String $chemin le chemin relatif depuis le dossier configurations du fichier
82,7 → 87,7
}
Config::charger($cheminConfigurations.DS.$chemin);
 
if ($this->masque = $this->creerMasque()) {
if ($this->masque = new Masque(Config::get('masques_possibles'), $this->parametres)) {
$this->masque->chargerMasque();
} else {
$message = 'Erreur lors de la création du Masque';
90,7 → 95,7
throw new Exception($message, $code);
}
 
if ($this->navigation = $this->creerNavigation()) {
if ($this->navigation = new Navigation($this->parametres)) {
$this->navigation->chargerUrl();
} else {
$message = 'Erreur lors de la création de la Navigation';
98,34 → 103,10
throw new Exception($message, $code);
}
 
$this->creerGestionBdd($this->navigation, Config::get('schemaBdd'));
$this->gestionBdd = new GestionBdd($this->navigation, Config::get('schemaBdd'));
}
 
/**
* Créer l'objet Masque en fonction des configurations
* */
private function creerMasque() {
$this->masque = new Masque(Config::get('masques_possibles'), $this->parametres);
return $this->masque;
 
}
 
/**
* Créer l'objet navigation avec les paramètres
* */
private function creerNavigation() {
return ($this->navigation = new Navigation($this->parametres));
}
 
/**
* Créer l'objet Gestion BDD
* */
private function creerGestionBdd($navigation, $schemaBdd) {
$this->gestionBdd = new GestionBdd($navigation, $schemaBdd);
}
 
 
/**
* Changer la valeur de sans limite pour ne pas l'afficher dans l'entete
* */
public function setSansLimite() {
133,13 → 114,6
}
 
/**
* Récupérer l'objet GestionBdd
* */
public function getGestionBdd() {
return $this->gestionBdd;
}
 
/**
* Récupérer l'objet Navigation
* */
public function getNavigation() {
179,19 → 153,28
 
return $entete;
}
//--------------------------------------------------------------------------------------------------------
// Ci-dessous méthode ok !
 
public function getBdd() {
if (!isset($this->partages['Bdd'])){
$this->partages['Bdd'] = new Bdd();
}
return $this->partages['Bdd'];
}
 
public function getRestClient() {
if (!isset($this->restClient)) {
$this->restClient = new RestClient();
if (!isset($this->partages['restClient'])){
$this->partages['restClient'] = new RestClient();
}
return $this->restClient;
return $this->partages['restClient'];
}
 
public function getControleAcces() {
if (!isset($this->controleAcces)) {
$this->controleAcces = new ControleAcces($this);
if (!isset($this->partages['controleAcces'])) {
$this->partages['controleAcces'] = new ControleAcces($this);
}
return $this->controleAcces;
return $this->partages['controleAcces'];
}
}
?>
/trunk/services/bibliotheque/GestionUtilisateur.php
2,19 → 2,17
class GestionUtilisateur {
 
private $conteneur;
private $gestionBdd;
private $bdd;
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_utilisateurs.ini');
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
$this->demarrerSession();
}
 
private function demarrerSession() {
if(session_id() == '') {
if (session_id() == '') {
// modifier ce test lors du passage en php 5.4
session_start();
}
87,5 → 85,4
unset($_COOKIE['del_courriel']);
unset($_COOKIE['del_mot_de_passe']);
}
}
?>
}
/trunk/services/bibliotheque/ControleAcces.php
17,13 → 17,11
class ControleAcces {
 
private $conteneur;
private $gestionBdd;
private $bdd;
 
public function __construct($conteneur) {
$this->conteneur = $conteneur;
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->bdd = $this->conteneur->getBdd();
}
 
public function controlerIpAutorisees() {
/trunk/services/bibliotheque/EnteteHttp.php
1,7 → 1,20
<?php
/**
* Classe contenant le contenu par défaut de l'entête d'une réponse http par défaut.
*
* @category DEL
* @package Services
* @subpackage Bibliotheque
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class EnteteHttp {
public $code = RestServeur::HTTP_CODE_OK;
public $encodage = 'utf-8';
public $mime = 'application/json';
}
?>
}
/trunk/services/bibliotheque/ResultatService.php
1,7 → 1,20
<?php
/**
* Classe contenant seulement le résultat d'un service.
*
* @category DEL
* @package Services
* @subpackage Bibliotheque
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class ResultatService {
public $mime = 'application/json';
public $encodage = 'utf-8';
public $corps = '';
}
?>
}