Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Ignore whitespace Rev 947 → Rev 948

/tags/celw-v1.1/jrest/services/InventoryPDF.php
New file
0,0 → 1,249
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
 
/** Constante stockant l'URL de la page d'accueil de Photoflora.*/
define('EF_URL_PHOTOFLORA', 'http://photoflora.free.fr/');
/** Constante stockant l'URL de la page de Photoflora affichant toutes les images d'un taxon donn.es.*/
define('EF_URL_PHOTOFLORA_TAXON', EF_URL_PHOTOFLORA.'FiTax.php?NumTaxon=%s');
/** Constante stockant l'URL du dossier de photoflora contenant les images miniatures.*/
define('EF_URL_PHOTOFLORA_IMG_MIN', 'http://www.tela-botanica.org/~photoflo/photos/%s/min/%s');
/** Constante stockant l'URL du dossier de photoflora contenant les images normale.*/
define('EF_URL_PHOTOFLORA_IMG_MAX', 'http://www.tela-botanica.org/~photoflo/photos/%s/max/%s');
/** Constante stockant l'expression r.guli.re r.cup.rant l'abr.viation du photographe et le nom du fichier.*/
define('EF_URL_PHOTOFLORA_REGEXP', '/\/photos\/([^\/]+)\/max\/(.+)$/');
/** Constante stockant l'URL du service XML de Photoflora.*/
define('EF_URL_PHOTOFLORA_SERVICE', EF_URL_PHOTOFLORA.'ef_photoflora.php?nt=%s');
 
/**
* InventoryPDF.php
*
* in : utf8
* out : iso8859
*
* Formatage pdf d'un releve (a revoir)
*/
class InventoryPDF extends Cel {
 
var $extendPDFProductor;
function InventoryPDF($config) {
 
parent::__construct($config);
 
$this->config=$config;
// Pas d'heritage multiple en php :(
$this->extendPDFProductor = new PDFProductor();
$this->extendPDFProductor->initPDF();
}
/**
* uid[0] : utilisateur obligatoire
* uid[1] : si absent : valeur 'all' (commune)
* uid[2] : si absent : valeur 'all' (date)
* uid[3] : si absent : valeur 'all' (recherche libre)
* uid[4] : si absent : valeur 'all' (station)
*/
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if (!isset($uid[1]) || $uid[1]=="" || $uid[1]=="all" ) {
$uid[1]="all";
$requete_location="";
}
else {
$requete_location=" AND location= ".$this->proteger($uid[1])." ";
}
if (!isset($uid[2]) || $uid[2]=="" || $uid[2]=="all") {
$uid[2]="all";
$requete_date="";
}
else {
$requete_date=" AND date_observation= ".$this->proteger($uid[2])." ";
}
if (!isset($uid[3]) || $uid[3]=="" || $uid[3]=="all") {
$uid[3]="all";
$requete_libre="";
}
else {
$requete_libre=" AND (nom_sel LIKE ".$this->proteger('%'.$uid[3].'%').
" OR nom_ret LIKE ".$this->proteger('%'.$uid[3].'%').
" OR station LIKE ".$this->proteger('%'.$uid[3].'%').
" OR commentaire LIKE ".$this->proteger('%'.$uid[3].'%');
}
 
if (!isset($uid[4]) || $uid[4]=="" || $uid[4]=="all") {
$uid[4]="all";
$requete_station="";
}
else {
$requete_station=" AND station= ".$this->proteger($uid[4])." ";
}
$value=array();
$requete="SELECT ce_utilisateur, ordre, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, zone_geo, date_observation," .
" station, commentaire, transmission FROM cel_obs WHERE ce_utilisateur = ".$this->proteger($uid[0])." " .
$requete_location.
$requete_date.
$requete_libre.
$requete_station.
" ORDER BY ordre ";
$resultat_requete = $this->requeter($requete);
$observations = array();;
if(is_array($resultat_requete)) {
$observations = $resultat_requete;
}
// Set up the pdf object.
$pdf = &File_PDF::factory(array('orientation' => 'P', 'format' => 'A4'));
// DesActivate compression.
$pdf->setCompression(false);
$pdf->setMargins(0, 0);
// Enable automatic page breaks.
$pdf->setAutoPageBreak(true);
// Start the document.
$pdf->open();
// Start a page.
$pdf->addPage();
$pdf->setFont('Times', '' , 12);
$i=1;
$tempfn = tempnam("","");
foreach ($observations as $obs) {
// Denullifiage
foreach($obs as $k=>$v) {
if (($v=="null") || ($v=="000null")) {
$obs[$k]="";
}
else {
$obs[$k]=utf8_decode($v);
}
}
if ($obs['date_observation']!="0000-00-00 00:00:00") {
list($year,$month,$day)= split ('-',$obs['date_observation']);
list($day)= split (' ',$day);
$obs['date_observation']=$day."/".$month."/".$year;
}
else {
$obs['date_observation']="00/00/0000";
}
$text= $obs['nom_sel']." ".$obs['nom_sel_nn']." ".$obs['nom_ret']." ".$obs['nom_ret_nn']." ".$obs['nt']." ".
$obs['famille']." ".$obs['zone_geo']." ".$obs['ce_zone_geo']." ".$obs['date_observation']." ".$obs['station'];
$obs['commentaire'];
$pdf->write(10, $text."\n");
$projet_photo = 'photoflora';
$tab_retour[$projet_photo]=chercherIllustrationsServiceXml(sprintf(EF_URL_PHOTOFLORA_SERVICE, $obs['nt']));
$url_miniature ='';
foreach ($tab_retour[$projet_photo] as $cle => $illustration) {
if (preg_match(EF_URL_PHOTOFLORA_REGEXP, $illustration['about'], $match)) {
$abreviation = $match[1];
$fichier = $match[2];
$url_miniature = sprintf(EF_URL_PHOTOFLORA_IMG_MIN, $abreviation, $fichier);;
// Priorite aux images en png
if (strstr($fichier, '.png')) {
break;
}
}
}
 
if ($url_miniature!='') {
list($debut,$ext)=split("\.",basename($url_miniature));
$temp = fopen($tempfn, "w");
$buf=file_get_contents($url_miniature);
fwrite($temp,$buf);
fclose($temp);
$pdf->image($tempfn,10,($i*10),0,0,$ext);
}
$i++;
}
echo $pdf->output("Rapport");
}
}
 
function chercherIllustrationsServiceXml($url)
{
return analyserFichierRdf($url);
}
function analyserFichierRdf($chemin)
{
$aso_info = array();
$dom = new DOMDocument();
$dom->validateOnParse = true;
if (preg_match('/^http:\/\//', $chemin)) {
$dom->loadXML(file_get_contents($chemin));
} else {
$dom->load($chemin);
}
$tab_infos = array();
foreach ($dom->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'Description') as $rdf_description) {
$aso_info['about'] = $rdf_description->getAttribute('about');
$aso_info['dc:identifier'] = $rdf_description->getAttribute('identifier');
$aso_info['dc:title'] = utf8_decode($rdf_description->getAttribute('title'));
$aso_info['dc:creator'] = utf8_decode($rdf_description->getAttribute('creator'));
$aso_info['dc:contributor'] = utf8_decode($rdf_description->getAttribute('contributor'));
$aso_info['dc:publisher'] = utf8_decode($rdf_description->getAttribute('publisher'));
$aso_info['dc:type'] = utf8_decode($rdf_description->getAttribute('type'));
$aso_info['dc:format'] = utf8_decode($rdf_description->getAttribute('format'));
if (function_exists('date_default_timezone_set')) {
date_default_timezone_set('Europe/Paris');
}
if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $rdf_description->getAttribute('created'))) {
$aso_info['dcterms:created'] = date('j-m-Y � H:i:s', strtotime($rdf_description->getAttribute('created')));
} else {
$aso_info['dcterms:created'] = $rdf_description->getAttribute('created');
}
$aso_info['dcterms:dateSubmitted'] = utf8_decode($rdf_description->getAttribute('dateSubmitted'));
$aso_info['dcterms:spatial'] = utf8_decode($rdf_description->getAttribute('spatial'));
$aso_info['dcterms:licence'] = utf8_decode($rdf_description->getAttribute('licence'));
$tab_infos[$rdf_description->getAttribute('identifier')] = $aso_info;
}
 
return $tab_infos;
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.2 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.1 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.4 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/InventoryUserList.php
New file
0,0 → 1,104
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
*
* Liste des utilisateurs du cel, par défaut les 50 premiers
* ou bien commencant par la chaine fournie en paramètre
*
* in=utf8
* out utf8
*
**/
class InventoryUserList extends Cel {
 
function getElement($uid){
session_start();
$this->controleUtilisateur($uid[0]);
 
$requete_utilisateurs ='SELECT DISTINCT courriel FROM cel_utilisateurs' ;
$condition = $this->construireRequeteCondition($uid);
$requete_utilisateurs .= $condition;
$requete_utilisateurs .= ' LIMIT 0,50';
$utilisateurs = $this->executerRequete($requete_utilisateurs);
$liste_utilisateurs = array();
if (!$utilisateurs) {
} else {
foreach ($utilisateurs as $utilisateur) {
$liste_utilisateurs[] = $utilisateur['courriel'];
}
}
usort($liste_utilisateurs,'trierUtilisateurs');
$output = json_encode($liste_utilisateurs);
print($output);
return true;
}
private function construireRequeteCondition($params) {
$condition = '';
if (isset($params[1]) && $params[1] != null && $params[1] != '*') {
$condition .= ' WHERE courriel LIKE '.$this->proteger($params[1].'%');
}
return $condition;
}
}
 
function trierUtilisateurs($val1, $val2) {
if (strstr($val1,'@')) {
if (strstr($val2,'@')) {
return strcmp($val1,$val2);
}
else
{
return -1 ;
}
}
else
{
if (strstr($val2,'@')) {
return 1 ;
}
else
{
return strcmp($val1,$val2) ;
}
}
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
?>
/tags/celw-v1.1/jrest/services/InventoryImport.php
New file
0,0 → 1,61
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* InventoryImport.php
*
* in : utf8
* out : utf8
*
* Cas d'utilisation :
* Service importation releve en cours
*
* 1 : L'utilisateur à traiter est communique au service
* 2 : Les releves associés à la session en cours sont transferés à l'utilisateur identifié
*/
class InventoryImport extends Cel {
 
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
$id_session_temporaire = session_id();
$gestionnaire_observation = new GestionObservation($this->config);
$migration_compte_a_compte = $gestionnaire_observation->migrerObservations($uid[0], $id_session_temporaire);
$retour = false;
if($migration_compte_a_compte) {
$retour = 'OK';
}
echo $retour;
exit;
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
* Revision 1.1 2007-05-21 18:12:20 ddelon
* Gestion des importations locale de releves
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/CelImageDoublon.php
New file
0,0 → 1,143
<?php
// declare(encoding='UTF-8');
/**
* Service fournissant une liste d'images doublon pour l'utilisateur qui s'authentifie.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CelImageDoublon/Sortie : images doublon de l'utilisateur authentifié.
*
* Sortie = Type de sortie : html ou json. Par défaut : html
*
* Utilisateur :
* identifiant (= courriel) de l'utilisateur récupéré via une identification HTTP.
*
* @author Jean-Pascal MILCENT <jpm@clapas.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 $Id$
* @copyright © 2010, Jean-Pascal MILCENT
*/
class CelImageDoublon extends Cel {
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params) {
$parametres = $this->traiterParametres(array('mode', 'utilisateur'), $params, false);
extract($parametres);
$contenu = '';
if ($this->authentifierUtilisateur()) {
$retour = null;
if (isset($mode)) {
$methode = $this->traiterNomMethodeGet($mode);
if (method_exists($this, $methode)) {
$retour = $this->$methode($parametres);
} else {
$service = get_class($this);
$this->messages[] = "Ce type de mode '$mode' pour le service '$service' n'est pas disponible.";
}
} else {
$this->messages[] = "Vous devez indiquer un type de mode.";
}
if (is_null($retour)) {
$contenu = 'Un problème est survenu : '.print_r($this->messages, true);
} else {
if ($retour['type'] == 'widget') {
$squelette = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR.$retour['squelette'].'.tpl.html';
$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
} else if ($retour['type'] == 'json') {
$contenu = $retour['donnees'];
}
}
}
// Envoie sur la sortie standard
$encodage = 'UTF-8';
$mime = 'text/html';
$formatage_json = (isset($retour) && $retour['type'] == 'json') ? true : false;
$this->envoyer($contenu, $mime, $encodage, $formatage_json);
}
 
/**
* Carte par défaut
*/
private function getDoublonHtml($parametres) {
$widget = null;
$utilisateur = $this->getAuthIdentifiant();
 
// Création des infos du widget
$widget['type'] = 'widget';
$widget['donnees']['utilisateur'] = $utilisateur;
$widget['donnees']['doublons'] = $this->getImagesDoublon($utilisateur);
$widget['squelette'] = 'doublon_defaut';
 
return $widget;
}
 
/**
* Images en doublon d'un utilisateur
*/
private function getImagesDoublon($utilisateur) {
$doublons = null;
 
if (isset($utilisateur)) {
// Un utilisateur en particulier
$requete = 'SELECT ci_id_image, ci_ordre, ci_nom_original, ci_md5 '.
'FROM cel_images '.
"WHERE ci_ce_utilisateur = '$utilisateur' ";
$images = $this->executerRequete($requete);
 
// Traitement
$doublons = array();
$images_doublons_id = array();
$md5 = array();
foreach ($images as $img) {
if (!isset($md5[$img['ci_md5']])) {
$md5[$img['ci_md5']] = array(
'url' => $this->getUrlImage($img['ci_id_image'], 'CXS'),
'obs_ordre' => array(),
'img_ordre' => $img['ci_ordre'],
'img_id' => $img['ci_id_image']);
} else {
if (!isset($doublons[$img['ci_md5']])) {
$id_img = $md5[$img['ci_md5']]['img_id'];
$doublons[$img['ci_md5']][$id_img] = $md5[$img['ci_md5']];
$images_doublons_id[] = $this->bdd->quote($id_img);
}
$doublons[$img['ci_md5']][$img['ci_id_image']] = array(
'url' => $this->getUrlImage($img['ci_id_image'], 'CXS'),
'obs_ordre' => array(),
'img_ordre' => $img['ci_ordre'],
'img_id' => $img['ci_id_image']);
$images_doublons_id[] = $this->bdd->quote($img['ci_id_image']);
}
}
if (count($images_doublons_id) > 0) {
$requete = 'SELECT ci_id_image, ci_nom_original, ci_md5, ordre '.
'FROM cel_images AS cim '.
' LEFT JOIN cel_obs_images AS coi '.
' ON (coi.coi_ce_image = cim.ci_id_image) '.
' LEFT JOIN cel_inventory AS ci '.
' ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
"WHERE cim.ci_ce_utilisateur = '$utilisateur' ".
' AND cim.ci_id_image IN ('.implode(',', $images_doublons_id).')';
$infos = $this->executerRequete($requete);
foreach ($infos as $info) {
if (isset($doublons[$info['ci_md5']][$info['ci_id_image']]) && ! $this->etreNull($info['ordre'])) {
$doublons[$info['ci_md5']][$info['ci_id_image']]['obs_ordre'][] = $info['ordre'];
}
}
}
}
 
//echo '<pre>'.print_r($doublons, true).'</pre>';
return $doublons;
}
}
/tags/celw-v1.1/jrest/services/InventoryImportMail.php
New file
0,0 → 1,209
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* Service d'import d'image à partir de mails
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Aurélien 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>
* @version $Id$
*/
Class InventoryImportMail extends Cel {
 
/**
* Appelée en mode client, lit le mail envoyé sur l'entrée stdin
* et le stocke dans le dossier temporaire en attendant
* qu'une tache périodique associée traite les mails en attente
*
* @param array $params les paramètres du script client, l'utilisateur est indiqué avec le paramètre -s
*/
public function stockerMailCli($params)
{
$contenu_mail = file_get_contents('php://stdin');
 
$parametres_ajout = array();
$parametres_ajout['mail_utilisateur'] = $params['-s'];
 
$stockage = $this->stockerMailTemporaire($parametres_ajout, $contenu_mail);
if($stockage) {
$message_attente = 'Votre messsage a été reçu, et est en attente de traitement, '.
'vous recevrez un message lorsque celui-ci aura été effectué';
mail($parametres_ajout['mail_utilisateur'],'Votre message est en attente de traitement',$message_attente);
} else {
$message_echec = 'Votre messsage a été reçu, mais il n\'a pas pu être stocké';
mail($parametres_ajout['mail_utilisateur'],'Problème lors de reception du message',$message_echec);
}
exit;
}
private function stockerMailTemporaire($parametres_ajout, $contenu_mail) {
$expediteur = $parametres_ajout['mail_utilisateur'];
$nom_fichier_temp = $this->fabriquerNomTemporaireStockageMail($expediteur);
$dossier_stockage_temp = $this->config['chemin_stockage_temp'];
$chemin_stockage_image_temp = $dossier_stockage_temp.'/mails/';
return file_put_contents($chemin_stockage_image_temp.$nom_fichier_temp);
}
/**
* Appelée en mode client, lit le mail envoyé sur l'entrée stdin
* extrait les images en pièces jointes, et les ajoute au cel de l'utilisateur
* expediteur
*
* @param array $params les paramètres du script client, l'utilisateur est indiqué avec le paramètre -s
*/
public function traiterMailCli($params)
{
 
$contenu_mail = file_get_contents('php://stdin');
 
$parametres_ajout = array();
$parametres_ajout['mail_utilisateur'] = $params['-s'];
 
$ids_stockage = $this->traiterMail($parametres_ajout, $contenu_mail);
foreach($ids_stockage as $nom_image => $id_stockage) {
if($id_stockage) {
mail($parametres_ajout['mail_utilisateur'],'Votre image a été ajoutée au Carnet en ligne','Votre image '.$nom_image.' a été ajoutée avec succès');
} else {
mail($parametres_ajout['mail_utilisateur'],'Problème lors de l\'ajout au Carnet en ligne','Votre image '.$nom_image.' n\'a pas pu être ajoutée');
}
}
exit();
}
/**
* Traite le mail fourni en paramètre extrait les images en pièces jointes,
* et les ajoute au cel de l'utilisateur expediteur
*
* @param array $params les paramètres du script client, l'utilisateur est indiqué dans la case 'identifiant'
*/
public function traiterMail($params, $contenu_mail)
{
$pieces_jointes = $this->extrairePiecesJointes($contenu_mail);
 
$stockeur_image = new InventoryImage($this->config);
$ids = array();
$infos_utilisateur = $this->getInfosComplementairesUtilisateurPourMail($params['mail_utilisateur']);
$params['ce_utilisateur'] = $infos_utilisateur['id_utilisateur'];
foreach($pieces_jointes as $piece_jointe) {
$nouvel_id_image = $stockeur_image->ajouterImageSurDdEtBdd($params, $piece_jointe);
if($nouvel_id_image)
{
$ids[$piece_jointe['name']] = $nouvel_id_image;
}
else
{
$ids[$piece_jointe['name']] = false;
}
}
// TODO: permettre la création d'observations liées aux images à partir du mail
// et d'une syntaxe simple à définir
return $ids;
}
/**
* Appelée en mode client, parse le dossier ou sont stockés les mails
* extrait les images en pièces jointes, et les ajoute au cel de l'utilisateur
*
*/
public function parserDossierMail()
{
$dossier_stockage_temp = $this->config['chemin_stockage_temp'];
$chemin_stockage_image_temp = $dossier_stockage_temp.'/mails/';
foreach (new DirectoryIterator($chemin_stockage_image_temp) as $fichier_a_stocker) {
if($fichier_ou_dossier->isDot()) {
continue;
}
$chemin_fichier = $fichier_a_stocker->getPathname();
$nom_fichier = $fichier_ou_dossier->getFilename();
$expediteur_mail = $this->obtenirExpediteurPourNomTemporaireMail($nom_fichier);
$contenu_mail = file_get_contents($chemin_fichier);
$parametres = array('courriel_utilisateur' => $expediteur_mail);
$this->traiterMail($parametres, $contenu_mail);
unlink($chemin_fichier);
}
}
private function extrairePiecesJointes($mail) {
 
$pieces_jointes = array();
$args['include_bodies'] = true;
$args['decode_bodies'] = true;
$args['decode_headers'] = true;
$args['input'] = $mail;
$dossier_stockage_temp = $this->config['chemin_stockage_temp'];
$tableau_mail_decode = Mail_mimeDecode::decode($args);
foreach ($tableau_mail_decode->parts as $partie) {
if ($partie->ctype_primary == 'image' && $partie->ctype_secondary == 'jpeg') {
$informations = array();
$nom_original = $partie->ctype_parameters['name'];
$fichier = $partie->body;
$hash = md5(time());
$chemin_temp = $dossier_stockage_temp.'/images/'.$hash.'.jpg';
$temp = fopen($chemin_temp,'w+');
fwrite($temp,$fichier);
fclose($temp);
chmod($chemin_temp, 0777);
$informations = array('tmp_name' => $chemin_temp,'name' => $nom_original,'type' => 'image/jpeg','size' => filesize($chemin_temp));
$pieces_jointes[] = $informations;
}
}
 
return $pieces_jointes;
}
private function fabriquerNomTemporaireStockageMail($expediteur) {
return time().'_'.$expediteur;
}
private function obtenirExpediteurPourNomTemporaireMail($nom_temp) {
$chaine_separee = explode('_', $nom_temp,1);
$nom_expediteur = false;
if($chaine_separee && count($chaine_separee) > 1) {
$nom_expediteur = $chaine_separee[1];
}
return $nom_expediteur;
}
}
?>
/tags/celw-v1.1/jrest/services/InventoryImageListPublic.php
New file
0,0 → 1,66
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* in : utf8
* out : utf8
*
* Service recherche d'images publique a partir de divers critères
*
*/
class InventoryImageListPublic extends Cel {
const start_defaut = 0;
const limit_defaut = 100;
 
function getRessource() {
}
 
function getElement($uid)
{
$criteres = array('transmission' => '1');
if($uid[0] != '*' && empty($_GET)) {
header("content-type: application/json");
$images_json = json_encode(array());
print $images_json;
exit() ;
}
$this->start = isset($_GET['start']) ? $_GET['start'] : self::start_defaut;
$this->limit = isset($_GET['limit']) ? $_GET['limit'] : self::limit_defaut;
$criteres['mots_cles'] = isset($_GET['tag']) ? $_GET['tag'] : null;
$criteres['ce_utilisateur'] = isset($_GET['auteur']) ? $_GET['auteur'] : null;
$criteres['zone_geo'] = isset($_GET['commune']) ? $_GET['commune'] : null;
$criteres['taxon'] = isset($_GET['taxon']) ? $_GET['taxon'] : null;
$criteres['ce_zone_geo'] = isset($_GET['dept']) ? $_GET['dept'] : null;
$chercheur_images = new RechercheImage($this->config);
$total = $chercheur_images->compterImages($criteres['ce_utilisateur'], $criteres);
$images = $chercheur_images->rechercherImages($criteres['ce_utilisateur'], $criteres, $this->start, $this->limit);
 
$resultat = array('total' => $total,'images' => $images);
$images_json = json_encode($resultat) ;
$images_json = str_replace('\u0000','',$images_json);
 
header("content-type: application/json") ;
print $images_json ;
exit() ;
}
}
?>
/tags/celw-v1.1/jrest/services/InventoryImageList.php
New file
0,0 → 1,104
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* InventoryImageList.php
*
* in : utf8
* out : utf8
*
* Service recherche, et de suppression multiple d'images a partir de divers critères
*
*/
class InventoryImageList extends Cel {
 
/**
* Recherche les images correspondant aux critères passés en paramètres
* uid[0] : utilisateur obligatoire
* uid[1] : critères de filtrage de la forme critère1=valeur1;critère2=valeur2
*/
function getElement($uid)
{
//TODO : remplacer le contenu du $uid[1] par le tableau $_GET;
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
$chercheur_images = new RechercheImage($this->config);
 
$numero_page = 0;
$taille_page = 50;
$criteres = array();
 
if(isset($uid[1]))
{
$criteres = $chercheur_images->parserRequeteCriteres($uid[1]) ;
if(isset($criteres['numero_page']) && isset($criteres['limite'])) {
$numero_page = $criteres['numero_page'];
$taille_page = $criteres['limite'];
}
}
 
$retour = $chercheur_images->rechercherImagesEtObservationAssociees($uid[0], $criteres, $numero_page, $taille_page);
 
$retour_encode = json_encode($retour) ;
$retour_encode = $this->nettoyerCaracteresNuls($retour_encode);
 
header("content-type: application/json") ;
print $retour_encode ;
exit() ;
}
 
private function nettoyerCaracteresNuls($chaine) {
return str_replace('\u0000','',$chaine);
}
/**
* Méthode appelée avec une requête de type DELETE.
* Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre
* Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules
*
* @param int uid[0] id utilisateur
* @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules
*
*/
function deleteElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
return;
}
$ordres_images = explode(',',$uid[1]);
 
$gestionnaire_image = new GestionImage($this->config);
$suppression_image = $gestionnaire_image->supprimerImage($uid[0], $ordres_images);
 
$this->envoyer('OK');
exit;
}
private function estUneSuiteIdentifiantsImage($chaine) {
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
// sans virgule terminale
$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
return preg_match($reg_exp, $chaine);
}
}
?>
/tags/celw-v1.1/jrest/services/CoordSearch.php
New file
0,0 → 1,193
<?php
/**
* Service recherche de commune par coordonnées et vice versa
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Aurélien 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>
* @version $Id$
*/
class CoordSearch extends Cel {
private $adresse_service_geonames = null;
private $adresse_service_local = null;
private $nom_service_geocoding = null;
private $nom_service_reverse_geocoding = null;
function CoordSearch($config) {
parent::__construct($config);
$this->adresse_service_geonames = $this->config['cel_db']['url_service_geo_geonames'];
$this->adresse_service_local = $this->config['cel_db']['url_service_geo_local'];
$this->nom_service_geocoding = $this->config['cel_db']['nom_service_geocoding_geonames'];
$this->nom_service_reverse_geocoding = $this->config['cel_db']['nom_service_reverse_geocoding_geonames'];
}
 
/**
* Recherche de coordonnées suivant ce qui est fourni
*
* $uid[0] = latitude (ou * si recherche coordonnées d'une commune)
* $uid[1] = longitude (ou * si recherche coordonnées d'une commune)
* $uid[2] = commune (ou * si recherche d'une commune correspondant à des coordonnées)
* $uid[3] = code_postal (ou * si recherche d'une commune correspondant à des coordonnées)
* $uid[4] = code_pays (ou * si recherche d'une commune correspondant à des coordonnées, par défaut vaut FR)
*/
function getElement($uid){
 
$header = '';
$retour = array();
 
$params = $this->traiterParametres($uid);
if ($this->estUneRequeteReverseGeocoding($params)) {
 
$informations_communes = $this->effectuerRequeteReverseGeocodingCartoOsm($params['lat'], $params['lon']);
if (!$informations_communes) {
$informations_communes = $this->effectuerRequeteReverseGeocodingGeonames($params['lat'], $params['lon']);
}
$header = 'Content-Type: application/json; charset=UTF-8';
$retour = json_encode($informations_communes) ;
 
} elseif ($this->estUneRequeteGeocoding($params)) {
$informations_coord = $this->effectuerRequeteGeocodingGeonames($params['commune'],$params['code_postal'],$params['code_pays']);
 
$header = 'Content-Type: application/json; charset=UTF-8';
$retour = json_encode($informations_coord);
 
} else {
 
$header = 'HTTP/1.0 400 Bad Request';
$retour = 'Commune ou Coordonnées non spécifiées' ;
}
 
header($header);
echo $retour;
}
protected function traiterParametres($params) {
$lat = $this->affecterValeurParametreOuDefaut($params, 0, '*');
$lng = $this->affecterValeurParametreOuDefaut($params, 1, '*');
 
$commune = $this->affecterValeurParametreOuDefaut($params, 2, '*');
$code_postal = $this->affecterValeurParametreOuDefaut($params, 3, '*');
 
$code_pays = $this->affecterValeurParametreOuDefaut($params, 4, 'FR');
return array('lat' => $lat, 'lon' => $lng, 'commune' => $commune,
'code_postal' => $code_postal, 'code_pays' => $code_pays);
}
private function affecterValeurParametreOuDefaut($params, $indice, $valeur_si_non_present) {
return isset($params[$indice]) ? str_replace('"','',urldecode($params[$indice])) : $valeur_si_non_present;
}
private function estUneRequeteReverseGeocoding($params) {
return ($params['lat'] != '*' && $params['lon'] != '*');
}
private function estUneRequeteGeocoding($params) {
return ($params['commune'] != '*');
}
private function effectuerRequeteReverseGeocodingCartoOsm($lat, $lon) {
$infos_commune_json = @file_get_contents($this->url_service_geo_local."?lat=".$lat."&lon=".$lon);
$infos_commune = json_decode($infos_commune_json);
$retour = false;
if ($this->estUnRetourOsmValide($infos_commune)) {
$retour = array('nom' => $infos_commune->nom, 'code_insee' => $infos_commune->codeINSEE);
}
return $retour;
}
private function estUnretourOsmValide($retour) {
return (is_a($retour,'stdClass') && property_exists($retour,'nom') && property_exists($retour,'codeINSEE'));
}
private function effectuerRequeteReverseGeocodingGeonames($lat, $lon) {
$infos_commune_json = @file_get_contents($this->adresse_service_geonames.
$this->nom_service_reverse_geocoding.
"?featureClass=ADM4&lat=".urlencode($lat)."&lng=".urlencode($lon).
"&style=full") ;
$objet_retour = json_decode($infos_commune_json);
$retour = false;
if($this->estUnRetourReverseGeocodingGeonamesValide($objet_retour)) {
$retour = array('nom' => $objet_retour->geonames[0]->name, 'code_insee' => $objet_retour->geonames[0]->adminCode4);
}
return $retour;
}
private function estUnRetourReverseGeocodingGeonamesValide($retour) {
$valide = false;
if (is_a($retour,'stdClass') && property_exists($retour,'geonames')
&& is_array($retour->geonames) && count($retour->geonames) > 0) {
$objet_resultats = $retour->geonames[0];
if (property_exists($objet_resultats,'adminName4') && property_exists($objet_resultats,'adminCode2')) {
$valide = true;
}
}
return $valide;
}
private function effectuerRequeteGeocodingGeonames($commune, $code_postal, $code_pays) {
$requete = $this->adresse_service_geonames.
$this->nom_service_geocoding.
"?placename_startsWith=".urlencode($commune);
 
if($code_postal != '*') {
$requete .= "&postalcode_startsWith=".urlencode($code_postal);
}
$requete .= "&country=".urlencode($code_pays)."&maxRows=10" ;
 
$coord_json = @file_get_contents($requete);
$objet_retour = json_decode($coord_json);
$retour = false;
if($this->estUnRetourGeocodingGeonamesValide($objet_retour)) {
$retour = array('lat' => $objet_retour->postalCodes[0]->lat,
'lng' => $objet_retour->postalCodes[0]->lng,
'nom' => $objet_retour->postalCodes[0]->placeName,
'code_insee' => $objet_retour->postalCodes[0]->postalCode
);
}
 
return $retour;
}
private function estUnRetourGeocodingGeonamesValide($retour) {
$valide = false;
if (is_a($retour,'stdClass') && property_exists($retour,'postalCodes')
&& is_array($retour->postalCodes) && count($retour->postalCodes) > 0) {
$objet_resultats = $retour->postalCodes[0];
if (property_exists($objet_resultats,'lat') && property_exists($objet_resultats,'lng')) {
$valide = true;
}
}
return $valide;
}
}
?>
/tags/celw-v1.1/jrest/services/LicenceUtilisateur.php
New file
0,0 → 1,53
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* Classe gérant l'acceptation de la licence utilisateur
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Aurélien 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>
* @version $Id$
* @copyright © 2010, Aurélien Peronnet
*/
class LicenceUtilisateur extends Cel {
 
/**
* Fonction appelée sur un POST
*
* Accepte ou refuse la licence utilisateur, en mettant à jour la base de données pour
* l'utilisateur indiqué
*
* @param array $uid
* @param array $pairs
*/
function updateElement($uid,$pairs) {
if(!isset($uid[0]) && is_numeric($uid[0])) {
return;
}
if(!isset($pairs['licence'])) {
return;
}
$requete_acceptation_licence = 'UPDATE cel_utilisateurs '.
'SET licence_acceptee = '.$this->proteger($pairs['licence']).
'WHERE id_utilisateur = '.$this->proteger($uid[0]);
$resultat_acceptation_licence = $this->executer($requete_acceptation_licence);
$resultat = false;
if($resultat_acceptation_licence) {
$resultat = "OK";
}
 
echo $resultat;
exit;
}
}
 
?>
/tags/celw-v1.1/jrest/services/ImageProvider.php
New file
0,0 → 1,69
<?php
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/papyrus_bp/
*/
 
/**
* Classe fournissant des images au format demandé ou bien aux dimensions demandées
*
* in=utf8
* out=utf8
*
*/
class ImageProvider extends Cel {
function getElement($uid){
if(!isset($uid[0])) {
return;
}
$id_image = $uid[0];
$format = 'temp';
if(isset($_GET['format'])) {
$format = $_GET['format'];
}
if(isset($_GET['dimensions'])) {
$dimensions = $_GET['dimensions'];
} else {
if(isset($this->config['cel_db']['format_'.$format])) {
$dimensions = $this->config['cel_db']['format_'.$format];
}
}
$this->config['cel_db']['format_'.$format] = $dimensions;
$generateur_image = new ImageRecreation($this->config);
$infos_image = $generateur_image->obtenirImageEtInfosPourId($id_image);
if(!$infos_image) {
header('HTTP/1.0 404 Not Found');
exit;
}
$image_generee = $generateur_image->creerMiniatureImageSelonFormat($infos_image, $format);
header('Content-type: image/jpeg');
imagejpeg($image_generee);
exit;
}
private function estUneImageALaDemande() {
}
}
?>
/tags/celw-v1.1/jrest/services/InventoryExport.php
New file
0,0 → 1,129
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david@tela-botania.org>
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* in:utf8
* out:iso8859
*
* Export vers feuille de calcul d'une selection de releves
*
*/
class InventoryExport extends Cel {
 
private $extendSpreadsheetProductor;
 
function InventoryExport($config) {
 
parent::__construct($config);
 
$this->extendSpreadsheetProductor = new SpreadsheetProductor();
$this->extendSpreadsheetProductor->initSpreadsheet();
}
 
function getElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$criteres = array();
$chercheur_observations = new RechercheObservation($this->config);
 
if(isset($uid[1]))
{
$criteres = $chercheur_observations->parserRequeteCriteres($uid[1]);
}
 
// Creating a workbook
$workbook = new Spreadsheet_Excel_Writer();
 
$workbook->send('liste.xls');
 
// Creating a worksheet
$worksheet = $workbook->addWorksheet('Liste');
$worksheet->write(0,0,'Espece');
$worksheet->write(0,1,'Numero nomenclatural');
$worksheet->write(0,2,'Nom retenu');
$worksheet->write(0,3,'Numero nomenclatural nom retenu');
$worksheet->write(0,4,'Numero taxonomique');
$worksheet->write(0,5,'Famille');
$worksheet->write(0,6,'Commune');
$worksheet->write(0,7,'Identifiant Commune');
$worksheet->write(0,8,'Date');
$worksheet->write(0,9,'Lieu-dit');
$worksheet->write(0,10,'Station');
$worksheet->write(0,11,'Milieu');
$worksheet->write(0,12,'Notes');
$worksheet->write(0,13,'Latitude');
$worksheet->write(0,14,'Longitude');
$worksheet->write(0,15,'Referentiel Geographique');
$numero_page = isset($criteres['numero_page']) ? $criteres['numero_page'] : 0;
$limite = isset($criteres['limite']) ? $criteres['limite'] : 50;
 
$observations = $chercheur_observations->rechercherObservations($uid[0], $criteres, $numero_page, $limite);
 
$i=1;
foreach ($observations as $obs) {
 
$obs = $this->denullifierTableauValeurCel(&$obs);
 
if ($obs['date_observation'] != "0000-00-00 00:00:00") {
$obs['date_observation'] = $this->formaterDate($obs['date_observation']);
}
else {
$obs['date_observation']="00/00/0000";
}
 
$worksheet->write($i,0,$obs['nom_sel']);
$worksheet->write($i,1,$obs['nom_sel_nn']);
$worksheet->write($i,2,$obs['nom_ret']);
$worksheet->write($i,3,$obs['nom_ret_nn']);
$worksheet->write($i,4,$obs['nt']);
$worksheet->write($i,5,$obs['famille']);
$worksheet->write($i,6,$obs['zone_geo']);
$worksheet->write($i,7,$this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']));
$worksheet->write($i,8,$obs['date_observation']);
$worksheet->write($i,9,$obs['lieudit']);
$worksheet->write($i,10,$obs['station']);
$worksheet->write($i,11,$obs['milieu']);
$worksheet->write($i,12,$obs['commentaire']);
$worksheet->write($i,13,$obs['latitude']);
$worksheet->write($i,14,$obs['longitude']);
$worksheet->write($i,15,$obs['geodatum']);
$i++;
}
 
$workbook->close();
 
exit();
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.7 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.6 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.5 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.4 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*/
?>
/tags/celw-v1.1/jrest/services/InventoryImage.php
New file
0,0 → 1,152
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* Service recherche et ajout d'image a partir de divers critères
* in=utf8
* out=utf8
*
*/
class InventoryImage extends Cel {
/**
* Méthode appelée avec une requête de type GET.
* Renvoie les infos sur l'image correspondant à l'id passé en parametre
* @param int uid[0] : utilisateur obligatoire
* @param int uid[1] : identifiant image obligatoire
*/
public function getElement($uid)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if(!isset($uid[0]) || !isset($uid[1])) {
return;
}
$chercheur_image = new RechercheImage($this->config);
$parametres = array('ordre' => $uid[1]);
$retour = null;
$image_recherchee = $chercheur_image->rechercherImages($uid[0], $parametres, 0, 1);
if(count($image_recherchee) > 0) {
$retour = $image_recherchee[0];
}
$this->envoyer($retour,'application/json','utf-8',true);
}
 
/**
* Méthode appelée avec une requête de type POST avec un identifiant d'image.
* Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
*
* @param int $uid[0] identifiant utilisateur
* @param int $uid[1] ordre de l'image relatif à l'utilisateur
* @param pairs array tableau contenant les valeurs de metadonnées à modifier
*/
public function updateElement($uid,$pairs)
{
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if(count($pairs) == 0 || !isset($uid[1])) {
return;
}
$gestionnaire_image = new GestionImage($this->config);
$resultat_mise_a_jour = $gestionnaire_image->modifierImage($uid[0],$uid[1],$pairs);
$retour = false;
if ($resultat_mise_a_jour) {
$retour = 'OK';
}
$this->envoyer($retour);
}
/**
* Méthode appelée avec une requête de type PUT.
* Stocke une image, crée ses miniatures et enregistre ses informations
* Renvoie l'identifiant d'image nouvellement crée en cas de succès
*
* @param $pairs array tableau contenant les valeurs de metadonnées à ajouter
*/
function createElement($pairs)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['ce_utilisateur']);
foreach ($_FILES as $file) {
$infos_fichier = $file ;
}
$gestionnaire_image = new GestionImage($this->config);
$id_utilisateur = $pairs['ce_utilisateur'];
if ($this->ajouterImage($id_utilisateur, $infos_fichier)) {
// l'upload demande de court-circuiter le fonctionnement normal de JREST
// en quittant directement après l'envoi
$this->envoyerMessageCreationEffectuee();
exit;
}
}
private function envoyerMessageCreationEffectuee() {
header('HTTP/1.0 200 Created');
echo 'OK';
exit() ;
}
 
/**
* Méthode appelée avec une requête de type DELETE.
* Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre
* Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules
*
* @param int uid[0] id utilisateur
* @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules
*
*/
function deleteElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
return;
}
$ordres_images = explode(',',$uid[1]);
 
$gestionnaire_image = new GestionImage($this->config);
$suppression_image = $gestionnaire_image->supprimerImage($uid[0], $ordres_images);
 
$this->envoyer('OK');
}
private function estUneSuiteIdentifiantsImage($chaine) {
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
// sans virgule terminale
$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
return preg_match($reg_exp, $chaine);
}
}
?>
/tags/celw-v1.1/jrest/services/InventoryMaintenance.php
New file
0,0 → 1,268
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
class InventoryMaintenance extends Cel {
private $nb_fichiers_orphelins = 0;
private $espace_libere = 0;
 
function getElement($uid) {
if ($this->authentifierAdmin()) {
if($uid[0] == "dates_images") {
$this->reparerDatesImages();
}
if($uid[0] == "suppression_images_orphelines") {
$this->suppressionFichiersImagesOrphelins();
}
}
}
 
private function reparerDatesImages() {
// TODO : effectuer une réexctraction de la date grâce au metadonnées
// pas urgent
/*$query = 'UPDATE cel_images SET date_prise_de_vue = ci_meta_date_time ';
'WHERE ci_meta_date IS NULL AND ci_meta_date_time IS NOT NULL' ;
 
$DB = $this->connectDB($this->config,'cel_db');
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
logger('InventoryMaintenance','Erreur lors de la réparation des dates '.$query);
die($res->getMessage());
}
 
header('content-type: text/html charset=utf-8');
print "Réparation des dates effectuées";
exit() ;*/
}
private function suppressionFichiersImagesOrphelins() {
header("content-type: text/html") ;
$header_html = '
<head>
<title>Maintenance</title>
<style type="text/css">
h1 {
color: blue;
}
h2 {
color: green;
}
.titre_dossier {
cursor: pointer;
}
li {
list-style-type: none;
}
.liste_profondeur_1 {
border: 1px solid blue;
background-color: #DFDFFF;
}
.liste_profondeur_2 {
border: 1px solid green;
background-color: #E1FFDF;
width: 1500px;
}
.liste_profondeur_3 {
border: 1px solid yellow;
background-color: #FFFCDF;
width: 1200px;
}
.attention {
border: 1px solid red;
background-color: white;
width: 600px;
}
</style>
<script src="http://162.38.234.9/cel_consultation/squelettes/js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">
//<![CDATA[
function initialiserElementsPliables() {
$(\'.titre_dossier\').bind(\'click\', function() {
 
$(this).siblings(\'li\').toggle();
return false;
});
}
$(document).ready(function() {
initialiserElementsPliables();
});
//]]>
</script> ';'
</head>';
echo $header_html;
$chemin_base_images = $this->config['cel_db']['chemin_images'];
$profondeur = 1;
echo '<ul id="liste_profondeur_0">';
$this->itererRecursivement($chemin_base_images, $profondeur);
echo '</ul>';
print '<p class="resultat">Suppression des images orphelines effectu&eacute;es </p><br />' ;
print '<p class="resultat">'.$this->nb_fichiers_orphelins.' fichiers orphelins ont &eacute;t&eacute; d&eacute;tect&eacute;s et supprim&eacute;s</p>';
print '<p class="resultat">'.$this->convertir_poid($this->espace_libere).' d\'espace disque ont &eacute;t&eacute; &eacute;conomis&eacute; </p>';
exit() ;
}
private function itererRecursivement($dossier, $profondeur) {
foreach (new DirectoryIterator($dossier) as $fichier_ou_dossier) {
if ($fichier_ou_dossier->isDot()) {
continue;
}
$dossiers_autorises = array('L','M','S');
if ($fichier_ou_dossier->getBasename() == 'export') {
continue;
}
echo '<li>';
if ($fichier_ou_dossier->isDir()) {
$profondeur_dossier_fils = $profondeur + 1;
echo '<ul class="liste_profondeur_'.$profondeur.'"> <h'.$profondeur.' class="titre_dossier"> analyse du dossier '.$fichier_ou_dossier->getPathname().'</h'.$profondeur.'>' ;
$this->itererRecursivement($fichier_ou_dossier->getPathname(), $profondeur_dossier_fils);
echo '</ul><br /><br />';
} else {
$nom_fichier = $fichier_ou_dossier->getFilename();
$this->verifierImageSurDDExisteDansBaseDeDonnees($nom_fichier);
}
echo '</li>';
}
}
private function verifierImageSurDDExisteDansBaseDeDonnees($nom_fichier) {
$nom_fichier_sans_extension = trim($nom_fichier, '.jpg');
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_L');
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_M');
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_S');
$id_image = str_replace('_', '', $nom_fichier_sans_extension);
// suppression des 0 devant
$id_image += 0;
$requete_id_image_existe = 'SELECT COUNT(id_image) as image_existe FROM cel_images WHERE id_image = '.$id_image;
$image_existe = $this->executerRequete($requete_id_image_existe);
if ($image_existe[0]['image_existe'] < 1) {
echo $nom_fichier.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Image introuvable dans la base de donn&eacute;es';
$this->supprimerImage($id_image);
}
}
private function supprimerImage($id) {
$chemin_sur_serveur = $this->config['cel_db']['chemin_images'];
 
$id = sprintf('%09s', $id);
$id = wordwrap($id, 3 , '_', true);
$id_fichier = "$id.jpg";
$niveauDossier = split('_', $id);
$dossierNiveau1 = $niveauDossier[0];
$dossierNiveau2 = $niveauDossier[1];
$fichier_s = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg';
$fichier_m = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M/'.$id.'_M.jpg';
$fichier_l = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L/'.$id.'_L.jpg';
$erreur = false;
echo '<ul class="liste_suppression">';
if(file_exists($fichier_s)) {
$this->espace_libere += filesize($fichier_s);
$suppression_s = true;
//$suppression_s = unlink($fichier_s) ;
if (!$suppression_s) {
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_s.' </li>' ;
echo $erreur;
} else {
// $this->nb_fichiers_orphelins++;
}
} else {
$erreur = '<li> probleme : l\'image '.$fichier_s.' n\'existe pas </li>' ;
echo $erreur;
}// Si le fichier existe
if (file_exists($fichier_m)) {
$this->espace_libere += filesize($fichier_m);
$suppression_m = true;
//$suppression_m = unlink($fichier_m) ;
if (!$suppression_m) {
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_m.' </li>' ;
$this->logger('CEL_images_bugs',$erreur);
} else {
// $this->nb_fichiers_orphelins++;
}
} else {
$erreur = '<li> probleme : l\'image '.$fichier_m.' n\'existe pas </li>' ;
echo $erreur;
} // Si le fichier existe
if (file_exists($fichier_l)) {
$this->espace_libere += filesize($fichier_l);
$suppression_l = true;
//$suppression_l = unlink($fichier_l) ;
if(!$suppression_l) {
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_l.' </li>' ;
echo $erreur;
} else {
// $this->nb_fichiers_orphelins++;
}
} else {
$erreur = '<li> probleme : l\'image '.$fichier_l.' n\'existe pas </li>' ;
echo $erreur;
} // Si le fichier existe
if (!$erreur) {
echo '<p class="attention">Suppression dans tous les formats de l\'image '.$id.' effectuee </p>';
$this->nb_fichiers_orphelins++;
}
 
echo '</ul>';
echo '<br />';
}
private function convertir_poid($size) {
$units = array(' B', ' KB', ' MB', ' GB', ' TB');
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
return round($size, 2).$units[$i];
}
}
?>
/tags/celw-v1.1/jrest/services/CelRestClient.php
New file
0,0 → 1,157
<?php
// declare(encoding='UTF-8');
/**
* Classe modèle spécifique à l'application, donc d'accés au données, elle ne devrait pas être appelée de l'extérieur.
*
* @category php5
* @package Cel
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @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 SVN: $Id$
*/
// TODO : remplacer les trigger_error par des exceptions qui pourrait être attrapées...
class CelRestClient {
const HTTP_URL_REQUETE_SEPARATEUR = '&';
const HTTP_URL_REQUETE_CLE_VALEUR_SEPARATEUR = '=';
private $http_methodes = array('GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS', 'CONNECT', 'TRACE');
protected $parametres = null;
private $url = null;
private $reponse_entetes = null;
//+----------------------------------------------------------------------------------------------------------------+
// ACCESSEURS
public function getReponseEntetes($cle) {
return $this->reponse_entetes;
}
public function getParametre($cle) {
$valeur = (isset($this->parametres[$cle])) ? $this->parametres[$cle] : null;
return $valeur;
}
public function ajouterParametre($cle, $valeur) {
$this->parametres[$cle] = $valeur;
}
public function supprimerParametre($cle) {
unset($this->parametres[$cle]);
}
public function nettoyerParametres() {
$this->parametres = null;
}
//+----------------------------------------------------------------------------------------------------------------+
// MÉTHODES
public function consulter($url) {
$retour = $this->envoyerRequete($url, 'GET');
return $retour;
}
public function ajouter($url, Array $donnees) {
$retour = $this->envoyerRequete($url, 'PUT', $donnees);
return $retour;
}
public function modifier($url, Array $donnees) {
$retour = $this->envoyerRequete($url, 'POST', $donnees);
return $retour;
}
public function supprimer($url) {
$retour = $this->envoyerRequete($url, 'DELETE');
return $retour;
}
public function envoyerRequete($url, $mode, Array $donnees = array()) {
$this->url = $url;
$contenu = false;
if (! in_array($mode, $this->http_methodes)) {
$e = "Le mode de requête '$mode' n'est pas accepté!";
trigger_error($e, E_USER_WARNING);
} else {
if ($mode == 'GET') {
$this->traiterUrlParametres();
}
$contexte = stream_context_create(array(
'http' => array(
'method' => $mode,
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => http_build_query($donnees, null, self::HTTP_URL_REQUETE_SEPARATEUR))));
$flux = @fopen($this->url, 'r', false, $contexte);
if (!$flux) {
$this->reponse_entetes = $http_response_header;
$e = "L'ouverture de l'url '{$this->url}' par la méthode HTTP '$mode' a échoué!";
trigger_error($e, E_USER_WARNING);
} else {
// Informations sur les en-têtes et métadonnées du flux
$this->reponse_entetes = stream_get_meta_data($flux);
// Contenu actuel de $url
$contenu = stream_get_contents($flux);
fclose($flux);
}
$this->traiterEntete();
}
$this->reinitialiser();
return $contenu;
}
private function traiterUrlParametres() {
$parametres = array();
if (count($this->parametres) > 0) {
foreach ($this->parametres as $cle => $valeur) {
$cle = rawurlencode($cle);
$valeur = rawurlencode($valeur);
$parametres[] = $cle.self::HTTP_URL_REQUETE_CLE_VALEUR_SEPARATEUR.$valeur;
}
$url_parametres = implode(self::HTTP_URL_REQUETE_SEPARATEUR, $parametres);
$this->url = $this->url.'?'.$url_parametres;
}
}
private function traiterEntete() {
$infos = $this->analyserEntete();
$this->traiterEnteteDebogage($infos);
}
private function analyserEntete() {
$entetes = $this->reponse_entetes;
$infos = array('date' => null, 'uri' => $this->url, 'debogages' => null);
if (isset($entetes)) {
if (isset($entetes['wrapper_data'])) {
$entetes = $entetes['wrapper_data'];
}
foreach ($entetes as $entete) {
if (preg_match('/^X_REST_DEBOGAGE_MESSAGES: (.+)$/', $entete, $match)) {
$infos['debogages'] = json_decode($match[1]);
}
if (preg_match('/^Date: .+ ([012][0-9]:[012345][0-9]:[012345][0-9]) .*$/', $entete, $match)) {
$infos['date'] = $match[1];
}
}
}
return $infos;
}
private function traiterEnteteDebogage($entetes_analyses) {
if (isset($entetes['debogages'])) {
$date = $entetes['date'];
$uri = $entetes['uri'];
$debogages = $entetes['debogages'];
foreach ($debogages as $debogage) {
$e = "DEBOGAGE : $date - $uri :\n$debogage";
trigger_error($e, E_USER_NOTICE);
}
}
}
private function reinitialiser() {
$this->nettoyerParametres();
}
}
/tags/celw-v1.1/jrest/services/PlantNetRssParEspece.php
New file
0,0 → 1,173
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
class PlantNetRssParEspece extends DBAccessor {
 
var $config;
 
function PlantNetRss($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
$rss = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n";
$rss .= "<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n";
$rss .='
<channel>
<title>Carnet en ligne</title>
<link>http://www.tela-botanica.org/cel/jrest/PlantnetRss</link>
<description>Derniers scans de feuilles</description>
<language>fr</language>';
 
$motcle = 'plantnet' ;
 
$DB=$this->connectDB($this->config,'cel_db');
 
$query_id_id_img = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles WHERE cmc_id_mot_cle_general = md5("'.$motcle.'")' ;
 
$res =& $DB->query($query_id_id_img);
 
if (DB::isError($res)) {
 
echo $res->getMessage();
}
 
$query='SELECT * FROM cel_images';
 
$premier_item = true ;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
if($premier_item) {
$query .= ' WHERE ';
$premier_item = false ;
}
else{
$query .= ' OR ';
}
 
$query .= '(ci_meta_mots_cles LIKE "%'.$row['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur ="'.$row['cmc_id_proprietaire'].'")' ;
}
 
$query .= ' ORDER BY ci_meta_date_ajout DESC LIMIT 0,100' ;
 
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
print("req partie 2");
die($res->getMessage());
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$row['ci_nom_original'] = htmlspecialchars($row['ci_nom_original']);
$row['ci_id_image'] = htmlspecialchars($row['ci_id_image']);
$row['ci_meta_date_ajout'] = htmlspecialchars($row['ci_meta_date_ajout']);
$row['ci_ce_utilisateur'] = htmlspecialchars($row['ci_ce_utilisateur']);
$row['ci_meta_user_comment'] = htmlspecialchars($row['ci_meta_user_comment']);
$row['ci_note_image'] = htmlspecialchars($row['ci_note_image']);
$tailleXY = $this->calculerDimensions(array($row['ci_meta_width'], $row['ci_meta_height']));
 
$id = $row['ci_id_image'];
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
 
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$id_fichier = $id.".jpg" ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
 
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ;
$chemin_fichier_m = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ;
 
$rss.= ' <item>
<title>'.$row['ci_nom_original']." (".$row['ci_id_image'].") ". ' par ' . $row['ci_ce_utilisateur'].'</title>
<author>'.$row['ci_ce_utilisateur'].'</author>
<link>'.$chemin_fichier.'</link>
<description>'.
' <![CDATA[<img src="'.$chemin_fichier_m.'" alt="'.$row['ci_nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img><br/>]]>'.
$row['ci_nom_original']. ' ajouté le ' .$row['ci_meta_date_ajout'] . ' par ' . $row['ci_ce_utilisateur'].'
</description>
<dc:format>text/html</dc:format>
</item>';
}
 
$rss.= '</channel> </rss>';
 
 
header("Content-Type: text/xml; charset=UTF-8");
print $rss;
exit;
}
 
 
function getRessource(){
 
$uid[] = array() ;
$this->getElement($uid);
}
 
function calculerDimensions($tailleXY) {
 
$tailleOr = 300 ;
 
if($tailleXY[1] == 0) {
$tailleXY[1] = $tailleOr;
}
 
if($tailleXY[0] == 0) {
$tailleXY[0] = $tailleOr;
}
 
$maxTaille = max($tailleXY[1],$tailleXY[0]) ;
 
if($maxTaille == $tailleXY[1]) {
 
$rapport = $tailleXY[1]/$tailleXY[0] ;
$tailleXY[1] = 300 ;
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ;
 
}else {
$rapport = $tailleXY[0]/$tailleXY[1] ;
$tailleXY[0] = 300 ;
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ;
}
 
return $tailleXY ;
}
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.5 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.4 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
 
?>
/tags/celw-v1.1/jrest/services/CelWidgetMap.php
New file
0,0 → 1,879
<?php
// declare(encoding='UTF-8');
/**
* Service fournissant une carte dynamique des obsertions publiques du CEL.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CelWidgetMap/Carte/Utilisateur : carte des observations publiques d'un utilisateur.
* /CelWidgetMap/Carte/Utilisateur/Projet : carte des observations publiques d'un utilisateur pour un projet.
* /CelWidgetMap/Carte/Utilisateur/Projet/dept : carte des observations publiques d'un utilisateur pour un projet sur un département.
* /CelWidgetMap/Carte/Utilisateur/Projet/dept/num_taxon : carte des observations publiques d'un utilisateur pour un projet sur un département pour un taxon.
*
* Carte = Type de carte. Valeurs possible : defaut,
* Utilisateur = identifiant (= courriel) de l'utilisateur ou * pour tous les utilisateurs.
* Projet = mot-clé du projet
*
* @author Jean-Pascal MILCENT <jpm@clapas.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 $Id$
* @copyright © 2010, Jean-Pascal MILCENT
*/
// TODO : supprimer le TRIM quand les obs seront reliées correctements aux localisations (sur le code INSEE par exemple)
class CelWidgetMap extends Cel {
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($ressources) {
$retour = null;
extract($this->parametres);
$action = array_shift($ressources);
if (isset($action)) {
$methode = $this->traiterNomMethodeGet($action);
if (method_exists($this, $methode)) {
$retour = $this->$methode($ressources);
} else {
$this->messages[] = "Ce type de ressource '$methode' n'est pas disponible.";
}
} else {
$this->messages[] = "Vous devez indiquer le type de ressource.";
}
 
if (is_null($retour)) {
$info = 'Un problème est survenu : '.print_r($this->messages, true);
$this->envoyer($info);
} else if ($retour['type'] == 'jsonVar') {
$this->envoyerJsonVar($retour['variable_js'], $retour['donnees']);
} else if ($retour['type'] == 'jsonP') {
$this->envoyerJsonp($retour['donnees']);
} else {
$this->envoyerJson($retour);
}
}
 
/**
* Les stations de la carte par défaut
*/
public function getStations($params) {
$json = null;
$requete = 'SELECT sector, x_utm, y_utm, wgs84_latitude AS coord_x, wgs84_longitude AS coord_y '.
'FROM cel_inventory AS i '.
' LEFT JOIN locations AS l '.
' ON (l.name = i.location AND l.code = i.id_location) '.
"WHERE transmission = '1' ".
$this->construireWhereDept().
$this->construireWhereCommune().
$this->construireWhereUtilisateur().
$this->construireWhereNumTaxon().
$this->construireWhereNomTaxon().
$this->construireWhereDate().
$this->construireWhereCommentaire().
$this->construireWhereProjet().
$this->construireWhereTag();
//die($requete);
$resultats = $this->requeter($requete);
// Traitement des résultats
$obs_nbre = $this->traiterNbreObs($resultats);
$stations = $this->traiterStations($resultats);
// Création des infos du widget
$json['donnees']['points'] = $stations;
$json['donnees']['stats']['communes'] = count($stations);
$json['donnees']['stats']['observations'] = $obs_nbre;
$json['type'] = (isset($this->formatRetour)) ? $this->formatRetour : 'jsonVar';
$json['variable_js'] = 'stations';
return $json;
}
private function traiterNbreObs($resultats) {
$obs_nbre = 0;
if ($resultats !== false) {
$obs_nbre = count($resultats);
}
return $obs_nbre;
}
private function traiterStations($resultats) {
$stations = array();
if ($resultats !== false) {
foreach ($resultats as $enrg) {
if ($enrg['coord_x'] != null && $enrg['coord_y'] != null) {
$id = $enrg['coord_x'].'-'.$enrg['coord_y'];
if (!isset($stations[$id])) {
$enrg['id'] = 'UTM:'.$enrg['x_utm'].'-'.$enrg['y_utm'].'-'.$enrg['sector'];
unset($enrg['x_utm']);
unset($enrg['y_utm']);
unset($enrg['sector']);
$stations[$id] = $enrg;
$stations[$id]['nbre'] = 1;
} else {
$stations[$id]['nbre']++;
}
}
}
$stations = array_values($stations);
}
return $stations;
}
/**
* Données pour l'affichage des obs d'une station
*/
public function getObservations($params) {
$resultats = array();
$total = 0;
if (!$this->etreNull($this->parametres['station'])) {
$requete = 'SELECT SQL_CALC_FOUND_ROWS id, identifiant, nom_sel, nom_ret, num_nom_sel, num_nom_ret, num_taxon, famille, '.
' lieudit, location, date_observation, milieu, commentaire, '.
' sector, x_utm, y_utm, insee_code, date_transmission '.
'FROM cel_inventory AS i '.
' LEFT JOIN locations AS l '.
" ON (l.name = i.location AND l.code = i.id_location) ".
"WHERE transmission = '1' ".
$this->construireWhereCoordonnees().
$this->construireWhereUtilisateur().
$this->construireWhereNumTaxon().
$this->construireWhereNomTaxon().
$this->construireWhereDate().
$this->construireWhereCommentaire().
$this->construireWhereProjet().
$this->construireWhereTag().
'ORDER BY nom_sel ASC '.
"LIMIT {$this->start},{$this->limit} ";
//die($requete);
$resultats = $this->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET);
$requete = 'SELECT FOUND_ROWS()';
$total = (int) $this->requeter($requete, self::SQL_RETOUR_COLONNE);
}
// Post-traitement
$observations = $this->traiterObservations($resultats, $total);
$observations = $this->ajouterImagesAuxObs($observations);
$observations = $this->ajouterAuteursAuxObs($observations);
$observations = $this->supprimerIdDesObs($observations);
return $observations;
}
private function traiterObservations($donnees, $total) {
$observations = array('commune' => '', 'observations' => array(), 'observateurs' => array());
$observations['total'] = (isset($total)) ? $total : 0;
if (is_array($donnees) && count($donnees) > 0) {
foreach ($donnees as $donnee) {
$observation = array();
$observation['idObs'] = $donnee->id;
$observation['nn'] = $this->etreNull($donnee->num_nom_sel) ? null : $donnee->num_nom_sel;
$observation['nomSci'] = $this->nettoyerTexte($donnee->nom_sel);
$observation['date'] = $this->formaterDate($donnee->date_observation, '%d/%m/%Y');
$observation['datePubli'] = $this->formaterDate($donnee->date_transmission);
$observation['lieu'] = $this->traiterLieu($donnee);
$observation['observateur'] = $donnee->identifiant;
$observation['urlEflore'] = $this->getUrlEflore($donnee->num_nom_sel);
if (isset($donnee->location)) {
$observations['commune'] = $this->nettoyerTexte($donnee->location);
}
$observations['observations'][$donnee->id] = $observation;
if (! array_key_exists($donnee->identifiant, $observations['observateurs'])) {
$observations['observateurs'][$donnee->identifiant] = $donnee->identifiant;
}
}
}
return $observations;
}
private function getUrlEflore($nn) {
$urlEflore = null;
if (! $this->etreNull($nn)) {
$urlEflore = sprintf($this->config['settings']['efloreUrlTpl'], $nn, 'illustration');
}
return $urlEflore;
}
private function traiterLieu($donnee) {
$lieu = array();
if (!$this->etreNull($donnee->lieudit)) {
$lieu[] = $donnee->lieudit;
}
if (!$this->etreNull($donnee->milieu)) {
$lieu[] = $donnee->milieu;
}
return implode(', ', $lieu);
}
private function chargerImages(Array $obs_ids) {
// Récupération des données au format Json
$service = 'CelImage/liste-ids?obsId='.implode(',', $obs_ids);
$url = sprintf($this->config['settings']['baseURLServicesCelTpl'], $service);
$json = $this->getRestClient()->consulter($url);
$donnees = json_decode($json);
// Post-traitement des données
$images = $this->traiterImages($donnees);
return $images;
}
private function traiterImages($donnees) {
$images = array();
if (count($donnees) > 0) {
foreach ($donnees as $id_obs => $id_images) {
foreach ($id_images as $id_img) {
$urls['idImg'] = $id_img;
$urls['guid'] = sprintf($this->config['settings']['guidImgTpl'], $id_img);
$urls['miniature'] = $this->getUrlImage($id_img, 'CXS');
$urls['normale'] = $this->getUrlImage($id_img, 'XL');
$images[$id_obs][] = $urls;
}
}
}
return $images;
}
private function ajouterImagesAuxObs($observations) {
$images = $this->chargerImages(array_keys($observations['observations']));
foreach ($observations['observations'] as $id => $infos) {
$infos['images'] = $images[$id];
$observations['observations'][$id] = $infos;
}
return $observations;
}
private function ajouterAuteursAuxObs($observations) {
$observateurs = $this->recupererUtilisateursIdentite(array_keys($observations['observateurs']));
unset($observations['observateurs']);
foreach ($observations['observations'] as $id => $infos) {
$courriel = $infos['observateur'];
$infos['observateur'] = $observateurs[$courriel]['intitule'];
$infos['observateurId'] = $observateurs[$courriel]['id'];
$observations['observations'][$id] = $infos;
}
return $observations;
}
private function supprimerIdDesObs($observations) {
// Le tableau de sortie ne doit pas avoir les id des obs en clé car sinon Jquery Template ne fonctionne pas
$observationSansId = $observations;
unset($observationSansId['observations']);
foreach ($observations['observations'] as $id => $infos) {
$observationSansId['observations'][] = $infos;
}
return $observationSansId;
}
/**
* Liste des taxons présents sur la carte
*/
public function getTaxons($params) {
$json = null;
$requete = 'SELECT SQL_CALC_FOUND_ROWS DISTINCT nom_ret, num_nom_ret, num_taxon, famille '.
'FROM cel_inventory AS i '.
' LEFT JOIN locations AS l '.
' ON (l.name = i.location AND l.code = i.id_location) '.
"WHERE transmission = '1' ".
" AND nom_ret != '' ".
$this->construireWhereDept().
$this->construireWhereCommune().
$this->construireWhereUtilisateur().
$this->construireWhereNumTaxon().
$this->construireWhereNomTaxon().
$this->construireWhereDate().
$this->construireWhereCommentaire().
$this->construireWhereProjet().
$this->construireWhereTag();
'ORDER BY nom_ret ASC '.
"LIMIT {$this->start},{$this->limit} ";
//$this->debug[] = $requete;
$resultats = $this->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET);
$requete = 'SELECT FOUND_ROWS()';
$taxons['total'] = (int) $this->requeter($requete, self::SQL_RETOUR_COLONNE);
// Post-traitement
$taxons['taxons'] = $this->traiterTaxons($resultats);
return $taxons;
}
private function traiterTaxons($donnees) {
$taxons = array();
if (is_array($donnees) && count($donnees) > 0) {
foreach ($donnees as $donnee) {
if (!isset($taxons[$donnee->num_taxon]) && ! $this->etreNull($donnee->nom_ret)) {
$taxon = array();
$taxon['nn'] = $donnee->num_nom_ret;
$taxon['nt'] = $donnee->num_taxon;
$taxon['nom'] = $this->nettoyerTexte($donnee->nom_ret);
$taxon['famille'] = $this->nettoyerTexte($donnee->famille);
$taxons[$donnee->num_taxon] = $taxon;
}
}
}
$taxons = array_values($taxons);
return $taxons;
}
private function construireWhereCoordonnees() {
$sql = '';
// Récupération des coordonnées depuis l'id station
extract($this->decomposerParametreStation());
if (isset($type)) {
if ($type == 'UTM') {
$secteur = $this->proteger($secteur);
$x_utm = $this->proteger($x_utm);
$y_utm = $this->proteger($y_utm);
$sql = " AND (sector = $secteur AND x_utm = $x_utm AND y_utm = $y_utm ) ";
} else if ($type == 'LngLat') {
$coord_x = $this->proteger($coord_x);
$coord_y = $this->proteger($coord_y);
$sql = " AND (coord_x = $coord_x AND coord_y = $coord_y ) ";
}
}
return $sql;
}
private function construireWhereCommentaire() {
$sql = '';
list($type, $commentaire) = $this->decomposerParametreCommentaire();
if (!$this->etreNull($commentaire)) {
$commentaire = $this->proteger('%'.$commentaire.'%');
switch ($type) {
case '*' :
$sql = $this->obtenirConditionPourCommentaires($commentaire);
$sql = " AND (commentaire LIKE $commentaire OR ($sql)) ";
break;
case 'observation' :
$sql = " AND commentaire LIKE $commentaire ";
break;
case 'photo' :
$sql = ' AND '.$this->obtenirConditionPourCommentaires($commentaire).' ';
break;
case 'photo.meta' :
$sql = ' AND '.$this->obtenirConditionPourCommentaireMeta($commentaire).' ';
break;
case 'photo.utilisateur' :
$sql = ' AND '.$this->obtenirConditionPourCommentaireUtilisateur($commentaire).' ';
break;
default:
$sql = " AND commentaire LIKE $commentaire ";
}
}
return $sql;
}
private function construireWhereNomTaxon() {
$sql = '';
list($type, $nom) = $this->decomposerParametreTaxon();
if (!$this->etreNull($nom)) {
$nom = $this->proteger($nom.'%');
switch ($type) {
case '*' :
$sql = " AND (nom_ret LIKE $nom OR nom_sel LIKE $nom OR famille LIKE $nom) ";
break;
case 'retenu' :
$sql = " AND nom_ret LIKE $nom ";
break;
case 'selectionne' :
$sql = " AND nom_sel LIKE $nom ";
break;
case 'famille' :
$sql = " AND famille LIKE $nom ";
break;
default:
$sql = " AND nom_ret LIKE $nom ";
}
}
return $sql;
}
private function construireWhereDate() {
$sql = '';
// Récupération des coordonnées depuis l'id station
list($type, $date) = $this->decomposerParametreDate();
if (!$this->etreNull($date)) {
$date = $this->proteger($date.'%');
switch ($type) {
case '*' :
$sql = " AND (
date_observation LIKE $date
OR date_creation LIKE $date
OR date_modification LIKE $date
OR date_transmission LIKE $date) ";
break;
case 'observation' :
$sql = " AND date_observation LIKE $date ";
break;
case 'creation' :
$sql = " AND date_creation LIKE $date ";
break;
case 'modification' :
$sql = " AND date_modification LIKE $date ";
break;
case 'transmission' :
$sql = " AND date_transmission LIKE $date ";
break;
case 'photo' :
$sql = $this->obtenirConditionPourDatePhoto($date);
break;
case 'ajout' :
$sql = $this->obtenirConditionPourDateAjout($date);
break;
case 'liaison' :
$sql = $this->obtenirConditionPourDateLiaison($date);
break;
default:
$sql = " AND date_observation LIKE $date ";
}
}
return $sql;
}
private function obtenirConditionPourDatePhoto($date) {
$observations = $this->obtenirObsLieesImg('date.photo', $date);
if (is_null($observations)) {
$this->debug[] = "Aucune observation n'est liée à une photo prise à la date : $date";
}
$sql = $this->assemblerObsEnConditionSql($observations);
return $sql;
}
private function obtenirConditionPourDateLiaison($date) {
$observations = $this->obtenirObsLieesImg('date.liaison', $date);
if (is_null($observations)) {
$this->debug[] = "Aucune observation n'a été liée à une image à à la date : $date";
}
$sql = $this->assemblerObsEnConditionSql($observations);
return $sql;
}
 
private function obtenirConditionPourDateAjout($date) {
$observations = $this->obtenirObsLieesImg('date.ajout', $date);
if (is_null($observations)) {
$this->debug[] = "Aucune observation n'est liée à une image ajoutée à la date : $date";
}
$sql = $this->assemblerObsEnConditionSql($observations);
return $sql;
}
private function obtenirConditionPourCommentaireMeta($commentaire) {
$observations = $this->obtenirObsLieesImg('commentaire.meta', $commentaire);
if (is_null($observations)) {
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des méta-données correspond à : $commmentaire";
}
$operateur = '';
$sql = $this->assemblerObsEnConditionSql($observations, $operateur);
return $sql;
}
private function obtenirConditionPourCommentaireUtilisateur($commentaire) {
$observations = $this->obtenirObsLieesImg('commentaire.utilisateur', $commentaire);
if (is_null($observations)) {
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des utilisateur correspond à : $commmentaire";
}
$operateur = '';
$sql = $this->assemblerObsEnConditionSql($observations, $operateur);
return $sql;
}
private function obtenirConditionPourCommentaires($commentaire) {
$observations = $this->obtenirObsLieesImg('commentaire.*', $commentaire);
if (is_null($observations)) {
$this->debug[] = "Aucune observation n'est liée à une image dont un des commentaires correspond à : $commmentaire";
}
$operateur = '';
$sql = $this->assemblerObsEnConditionSql($observations, $operateur);
return $sql;
}
/**
* Récupération des identifiant d'utilisateur et des ordres des observations correspondant à une date.
* Retour sous forme de tableau : array[identifiant] = array(ordre, ordre...);
*/
private function obtenirObsLieesImg($type, $param) {
// Construction de la requête
$requete = 'SELECT DISTINCT coi_ce_observation AS ordre, coi_ce_utilisateur AS utilisateur '.
'FROM cel_images '.
' LEFT JOIN cel_obs_images '.
' ON (ci_id_image = coi_ce_image) '.
' LEFT JOIN cel_inventory AS i '.
' ON (coi_ce_utilisateur = i.identifiant AND coi_ce_observation = i.ordre) '.
' LEFT JOIN locations AS l '.
' ON (l.name = i.location AND l.code = i.id_location) '.
"WHERE transmission = '1' ".
($type == 'date.photo' ? " AND (ci_meta_date_time LIKE ".str_replace('-', ':', $param)." OR ci_meta_date LIKE $param) " : '').
($type == 'date.ajout' ? " AND ci_meta_date_ajout LIKE $param " : '').
($type == 'date.liaison' ? " AND coi_date_liaison LIKE $param " : '').
($type == 'commentaire.meta' ? " AND ci_meta_comment LIKE $param " : '').
($type == 'commentaire.utilisateur' ? " AND ci_meta_user_comment LIKE $param " : '').
($type == 'commentaire.*' ? " AND (ci_meta_comment LIKE $param OR ci_meta_user_comment LIKE $param) " : '').
$this->construireWhereCoordonnees().
$this->construireWhereDept().
$this->construireWhereCommune().
$this->construireWhereUtilisateur().
$this->construireWhereNumTaxon().
$this->construireWhereNomTaxon().
$this->construireWhereProjet().
$this->construireWhereTag().
'ORDER BY utilisateur ASC, ordre ASC';
//$this->debug[] = $requete;
//die($requete);
$resultats = $this->executerRequete($requete);
$observations = null;
if ($resultats != false) {
$observations = array();
foreach ($resultats as $occurence) {
$utilisateur = $occurence['utilisateur'];
$ordre = $occurence['ordre'];
if (!array_key_exists($utilisateur, $observations)) {
$observations[$utilisateur] = array();
}
if (!array_key_exists($ordre, $observations[$utilisateur])) {
$observations[$utilisateur][$ordre] = $ordre;
}
}
}
return $observations;
}
private function assemblerObsEnConditionSql($observations, $operateur = 'AND') {
$sql = '';
if ($observations != null) {
// Pré-construction du where de la requête
$tpl_where = "(identifiant = '%s' AND ordre IN (%s))";
foreach ($observations as $utilisateur => $ordres) {
$morceaux_requete[] = sprintf($tpl_where, $utilisateur, implode(',', $ordres));
}
if (count($morceaux_requete) > 0) {
$sql = implode(" \nOR ", $morceaux_requete);
}
} else {
// Nous voulons que la requête ne retourne rien
$sql = "identifiant = '' AND ordre = ''";
}
$sql = " $operateur ($sql) ";
return $sql;
}
private function construireWhereDept() {
$sql = '';
// Récupération des coordonnées depuis l'id station
extract($this->parametres);
if (!$this->etreNull($dept)) {
$dept = $this->traiterValeursMultiples($dept);
$sql = " AND code IN ($dept) ";
}
return $sql;
}
private function construireWhereCommune() {
$sql = '';
// Récupération des coordonnées depuis l'id station
extract($this->parametres);
if (!$this->etreNull($commune)) {
$commune = $this->proteger($commune);
$sql = " AND location LIKE $commune ";
}
return $sql;
}
private function construireWhereUtilisateur() {
$sql = '';
// Récupération des coordonnées depuis l'id station
extract($this->parametres);
if (!$this->etreNull($utilisateur)) {
$utilisateur = $this->proteger($utilisateur);
$sql = " AND identifiant = $utilisateur ";
}
return $sql;
}
private function construireWhereNumTaxon() {
$sql = '';
// Récupération des coordonnées depuis l'id station
extract($this->parametres);
if (!$this->etreNull($num_taxon)) {
$num_taxon = $this->proteger($num_taxon);
$sql = " AND num_taxon = $num_taxon ";
}
return $sql;
}
private function construireWhereProjet() {
$sql = '';
// Récupération des coordonnées depuis l'id station
extract($this->parametres);
$projet_sql = $this->getSqlWhereProjet($projet);
if (!$this->etreNull($projet_sql)) {
$sql = " AND ($projet_sql) ";
}
return $sql;
}
/**
* Traitement de $projet pour construction du filtre dans la requête
*/
private function getSqlWhereProjet($projet) {
$sql = null;
if (! $this->etreNull($projet)) {
$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($projet));
// Construction de la requête
$requete = 'SELECT * '.
'FROM cel_mots_cles_obs '.
"WHERE cmc_id_mot_cle_general = $mot_cle_encode ";
$elements_projet = $this->executerRequete($requete);
$requete_projet = array();
if ($elements_projet != false && count($elements_projet) > 0) {
// Pré-construction du where de la requête
$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %s )';
foreach ($elements_projet as $occurence) {
$requete_projet[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire']));
}
} else {
$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
}
if (count($requete_projet) > 0) {
$sql = implode(" \nOR ", $requete_projet);
}
}
return $sql;
}
private function construireWhereTag() {
$sql = '';
// Récupération des coordonnées depuis l'id station
extract($this->parametres);
$tag_sql = $this->getSqlWhereObsAvecImagesTaguees($tag);
if (!$this->etreNull($tag_sql)) {
$sql = " AND ($tag_sql) ";
}
return $sql;
}
/**
* Traitement de $tag pour construction du filtre dans la requête
*/
private function getSqlWhereObsAvecImagesTaguees($tag) {
$sql = null;
if (! $this->etreNull($tag)) {
$tag_sql = $this->getSqlWhereMotsCles($tag);
// Construction de la requête
$requete = 'SELECT DISTINCT coi_ce_observation AS ordre, coi_ce_utilisateur AS utilisateur '.
'FROM cel_images '.
' LEFT JOIN cel_obs_images '.
' ON (ci_id_image = coi_ce_image) '.
' LEFT JOIN cel_inventory AS i '.
' ON (coi_ce_utilisateur = i.identifiant AND coi_ce_observation = i.ordre) '.
' LEFT JOIN locations AS l '.
" ON (l.name = i.location AND l.code = i.id_location) ".
"WHERE transmission = '1' ".
$this->construireWhereCoordonnees().
$this->construireWhereUtilisateur().
$this->construireWhereNumTaxon().
$this->construireWhereNomTaxon().
$this->construireWhereProjet().
(!$this->etreNull($tag_sql) ? "AND ($tag_sql) " : '').
'ORDER BY utilisateur ASC, ordre ASC';
//$this->debug[] = $requete;
//die($requete);
$elements_tag = $this->executerRequete($requete);
$requete_tag = array();
if ($elements_tag != false && count($elements_tag) > 0) {
$filtres = array();
foreach ($elements_tag as $occurence) {
$utilisateur = $occurence['utilisateur'];
$ordre = $occurence['ordre'];
if (!array_key_exists($utilisateur, $filtres)) {
$filtres[$utilisateur] = array();
}
if (!array_key_exists($ordre, $filtres[$utilisateur])) {
$filtres[$utilisateur][$ordre] = $ordre;
}
}
// Pré-construction du where de la requête
$tpl_where = "(identifiant = '%s' AND ordre IN (%s))";
foreach ($filtres as $utilisateur => $ordres) {
$requete_tag[] = sprintf($tpl_where, $utilisateur, implode(',', $ordres));
}
} else {
$this->messages[] = "Aucune observation ne possède d'images avec ce mot-clé.";
}
if (count($requete_tag) > 0) {
$sql = implode(" \nOR ", $requete_tag);
}
}
return $sql;
}
/**
* Traitement de $tag pour construction du filtre dans la requête
*/
private function getSqlWhereMotsCles($tag) {
$sql = null;
$mots_cles = $this->decomposerParametreTag($tag);
// Construction de la requête
$requete = 'SELECT cmc_id_proprietaire AS utilisateur, cmc_id_mot_cle_general AS mot_cle_general, '.
' cmc_id_mot_cle_utilisateur AS mot_cle_utilisateur '.
'FROM cel_mots_cles_images '.
'WHERE '.$this->getSqlWhereMotsClesImages($mots_cles['motsClesEncodesProteges']);
$elements_projet = $this->executerRequete($requete);
//$this->debug[] = $requete;
$requete_projet = array();
if ($elements_projet != false && count($elements_projet) > 0) {
// Pré-construction du where de la requête
if ($mots_cles['type'] == 'OR') {
$tpl_where = '(ci_meta_mots_cles LIKE "%%%s,%%" AND ci_ce_utilisateur = %s )';
foreach ($elements_projet as $occurence) {
$requete_projet[] = sprintf($tpl_where, $occurence['mot_cle_utilisateur'], $this->bdd->quote($occurence['utilisateur']));
}
} else {
$tpl_where_mc = "ci_meta_mots_cles LIKE '%%%s,%%'";
$tpl_where = '((%s) AND ci_ce_utilisateur = %s)';
$utilisateur_mc = array();
foreach ($elements_projet as $occurence) {
if (!isset($utilisateur_mc[$occurence['utilisateur']][$occurence['mot_cle_general']])) {
$utilisateur_mc[$occurence['utilisateur']][$occurence['mot_cle_general']] = $occurence['mot_cle_utilisateur'];
}
}
foreach ($utilisateur_mc as $utilisateur => $mots_cles_utilisateur) {
if (count($mots_cles_utilisateur) == count($mots_cles['motsCles'])) {
$where_mots_cles_utilisateur = array();
foreach ($mots_cles_utilisateur as $mot_cle) {
$where_mots_cles_utilisateur[] = sprintf($tpl_where_mc, $mot_cle);
}
$where_mots_cles_utilisateur = implode(' AND ', $where_mots_cles_utilisateur);
$utilisateur = $this->bdd->quote($utilisateur);
$requete_projet[] = sprintf($tpl_where, $where_mots_cles_utilisateur, $utilisateur);
}
}
}
} else {
$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
}
$sql = implode(" \nOR ", $requete_projet);
//$this->debug[] = $sql;
return $sql;
}
/**
* Traitement de $tag pour construction du filtre dans la requête
*/
private function getSqlWhereMotsClesImages($mots_cles_encodes) {
$where_mots_cles_images = array();
foreach ($mots_cles_encodes as $mot_cle_encode) {
$where_mots_cles_images[] = "cmc_id_mot_cle_general = $mot_cle_encode";
}
$where_mots_cles_images = implode(' OR ', $where_mots_cles_images);
return $where_mots_cles_images;
}
private function decomposerParametreTag($tags) {
$mots_cles = array('type' => null, 'motsCles' => null, 'motsClesEncodesProteges' => null);
if (preg_match('/.+OU.+/', $tags)) {
$mots_cles['type'] = 'OR';
$mots_cles['motsCles'] = explode('OU', $tags);
} else if (preg_match('/.+ET.+/', $tags)) {
$mots_cles['type'] = 'AND';
$mots_cles['motsCles'] = explode('ET', $tags);
} else {
$mots_cles['motsCles'][] = $tags;
}
foreach ($mots_cles['motsCles'] as $mot) {
$mots_cles['motsClesEncodesProteges'][] = $this->bdd->quote($this->encoderMotCle($mot));
}
$this->debug[] = $mots_cles;
return $mots_cles;
}
private function decomposerParametreStation() {
$station_infos = array();
if (isset($this->parametres['station'])) {
$station = $this->parametres['station'];
$this->debug[] = $station;
list($type, $coord) = explode(':', $station);
if ($type == 'UTM') {
list($x_utm, $y_utm, $secteur) = explode('-', $coord);
$station_infos = array('x_utm' => $x_utm, 'y_utm' => $y_utm, 'secteur' => $secteur);
} else if ($type == 'LngLat') {
list($coord_y, $coord_x) = explode('-', $coord);
$station_infos = array('coord_y' => $coord_y, 'coord_x' => $coord_x);
}
$station_infos['type'] = $type;
}
return $station_infos;
}
private function decomposerParametreDate() {
$date_infos = array();
if (isset($this->parametres['date'])) {
$date = $this->parametres['date'];
if (strpos($date, ':')) {
list($type, $date) = explode(':', $date);
} else {
$type = 'observation';
}
$date = str_replace('/', '-', $date);
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $date, $matches)) {
$date = $matches[3].'-'.$matches[2].'-'.$matches[1];
}
$date_infos = array($type, $date);
}
return $date_infos;
}
private function decomposerParametreTaxon() {
$nom_infos = array();
if (isset($this->parametres['taxon'])) {
$taxon = $this->parametres['taxon'];
if (strpos($taxon, ':')) {
$nom_infos = explode(':', $taxon);
} else {
$nom_infos = array('retenu', $taxon);
}
}
return $nom_infos;
}
private function decomposerParametreCommentaire() {
$commentaire_infos = array();
if (isset($this->parametres['commentaire'])) {
$commentaire = $this->parametres['commentaire'];
if (strpos($commentaire, ':')) {
$commentaire_infos = explode(':', $commentaire);
} else {
$commentaire_infos = array('observation', $commentaire);
}
}
return $commentaire_infos;
}
}
/tags/celw-v1.1/jrest/services/CelWidgetSaisie.php
New file
0,0 → 1,158
<?php
// declare(encoding='UTF-8');
/**
* Service permettant d'insérer les informations fournie par le widget Saisie dans le CEL.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* PUT /CelWidgetSaisie : ajout de données en les passant via $_POST
*
* @author Jean-Pascal MILCENT <jpm@clapas.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 $Id$
* @copyright © 2011, Jean-Pascal MILCENT
*/
class CelWidgetSaisie extends CelMotCle {
private $projet = null;
private $utilisateur_id = null;
public function getElement($params) {
//$resultat[] = $this->ajouterMotCleObs('jpm@clapas.org', 'Projets coopératifs', self::OBS_RACINE_ID.'.projets-cooperatifs', self::OBS_RACINE_ID);
//$resultat[] = $this->ajouterMotCleObs('jpm@clapas.org', 'Biodiversite34', self::OBS_RACINE_ID.'.projets-cooperatifs.biodiversite34', self::OBS_RACINE_ID.'.projets-cooperatifs');
//$this->envoyerJson($resultat);
}
public function createElement($requeteDonnees) {
if (array_key_exists('projet', $requeteDonnees)) {
$this->debug[] = 'Projet : ok';
$this->projet = $requeteDonnees['projet'];
if (array_key_exists('utilisateur', $requeteDonnees)) {
$this->debug[] = 'Utilisateur : ok';
$utilisateur = $requeteDonnees['utilisateur'];
if (array_key_exists('courriel', $utilisateur)) {
$this->debug[] = 'Courriel : ok';
extract($utilisateur);
$this->utilisateur_id = $courriel;
$ordre = $this->getMaxOrdre($courriel);
if (!is_null($ordre)) {
$this->debug[] = 'Ordre : ok';
// Triage et manipulation des données
$observations = array();
foreach ($requeteDonnees as $cle => $obs) {
if (preg_match('/^obsId[0-9]+$/', $cle)) {
$obsAAjouter = array();
$obsAAjouter['identifiant'] = $courriel;
$obsAAjouter['prenom_utilisateur'] = $prenom;
$obsAAjouter['nom_utilisateur'] = $nom;
$obsAAjouter['ordre'] = $ordre++;
$obsAAjouter['nom_sel'] = $obs['nom_sel'];
$obsAAjouter['num_nom_sel'] = $obs['num_nom_sel'];
$obsAAjouter['nom_ret'] = $obs['nom_ret'];
$obsAAjouter['num_nom_ret'] = $obs['num_nom_ret'];
$obsAAjouter['num_taxon'] = $obs['num_taxon'];
$obsAAjouter['famille'] = $obs['famille'];
$obsAAjouter['date_observation'] = $this->transormerDateFrVersMysql($obs['date']);
$obsAAjouter['milieu'] = $obs['milieu'];
$obsAAjouter['commentaire'] = $obs['notes'];
$obsAAjouter['transmission'] = '1';
$obsAAjouter['date_creation'] = date('Y-m-d H:i:s');
$obsAAjouter['date_transmission'] = date('Y-m-d H:i:s');
$obsAAjouter['coord_x'] = $obs['latitude'];
$obsAAjouter['coord_y'] = $obs['longitude'];
$obsAAjouter['location'] = $obs['commune_nom'];
$obsAAjouter['id_location'] = substr($obs['commune_code_insee'], 0, 2);
$obsAAjouter['ref_geo'] = 'WGS84';
$observations[] = $this->protegerTableau($obsAAjouter);
}
}
$this->debug[] = 'Nbre obs ajoutée : '.count($observations);
// Insertion dans la base
$ok = true;
$obs_a_lier = array();
foreach ($observations as $obs) {
$insert = "INSERT INTO cel_inventory ";
$champs = '('.implode(', ', array_keys($obs)).') ';
$values = 'VALUES ('.implode(', ', $obs).') ';
$requete = $insert.$champs.$values;
if ($this->executerRequeteSimple($requete) === false) {
$ok = false;
} else {
$obs_ok[] = trim($obs['ordre'], "'");
}
}
if ($ok === true) {
$this->debug[] = print_r($obs_ok, true);
$liaison_ok = $this->lierObsAMotsCles($obs_ok);
if ($liaison_ok === false) {
$e = "Toutes les observations n'ont pas pu être liées au mot-clé du projet.";
$this->messages[] = $e;
}
} else {
$this->messages[] = "Un problème est survenu lors de l'insertion dans la base de données.";
}
} else {
$this->messages[] = "Un nouveau numéro d'ordre d'observation n'a pu être généré.";
}
} else {
$this->messages[] = "L'identifiant de l'utilisateur (courriel) n'a pas été transmis.";
}
} else {
$this->messages[] = "Les informations concernant l'utilisateur (prénom, nom, courriel) n'ont pas été transmises.";
}
} else {
$this->messages[] = "Les informations concernant le projet coopératif n'ont pas été transmises.";
}
$msg = (count($this->messages) > 0) ? 'erreur' : 'ok';
$retour = (object) array('msg' => $msg);
$this->envoyerJson($obj);
}
private function getMaxOrdre($identifiant) {
$ordre = null;
$identifiant = $this->bdd->quote($identifiant);
$requete = "SELECT MAX(ordre) AS ordre ".
"FROM cel_inventory ".
"WHERE identifiant = $identifiant ";
$ordre_max = $this->executerRequete($requete, 'Column');
if ($ordre_max !== false) {
$ordre = $ordre_max + 1;
}
return $ordre;
}
/**
* Transforme une date au format français (jj/mm/aaaa) dans un format Mysql (aaaa-mm-jj).
* @param string $dateFr date au format français (jj/mm/aaaa)
* @return string date au format Mysql (aaaa-mm-jj)
*/
private function transormerDateFrVersMysql($dateFr) {
$dateMysql = '0000-00-00';
$morceauxDate = explode('/', $dateFr);
if (count($morceauxDate) == 3) {
$dateMysql = implode('-', array_reverse($morceauxDate));
}
return $dateMysql;
}
private function lierObsAMotsCles($observations) {
$categorie = self::OBS_RACINE_ID.'.projets-cooperatifs';
$projet = $categorie.'.'.strtolower($this->projet);
$ajout_mot_cle_1 = $this->ajouterMotCleObs($this->utilisateur_id, 'Projets coopératifs', $categorie, self::OBS_RACINE_ID);
$ajout_mot_cle_2 = $this->ajouterMotCleObs($this->utilisateur_id, $this->projet, $projet, $categorie);
$liaison_ok = false;
if ($ajout_mot_cle_1 && $ajout_mot_cle_2) {
$liaison_ok = $this->lierMotCleObs($this->utilisateur_id, array($projet), $observations);
} else {
$e = "La catégorie du projet et le mot-clé du projet n'ont pas pu être ajouté.";
$this->messages[] = $e;
}
return $liaison_ok;
}
}
?>
/tags/celw-v1.1/jrest/services/NameSearch.php
New file
0,0 → 1,73
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
*
* in : utf8
* out : utf8
*
* NameSearch.php
*
* Cas d'utilisation :
* Service completion nom scientifique
*
* 1 : L'application recoit un debut de nom scientifique
* 2 : Si le genre recu est >1, l'application retourne les 50 premieres genre commencant par ce prefixe
* 3 : Si l'espece est presente l'application retourne les 50 premieres genre+espece commencant par ce prefixe
*/
class NameSearch extends Cel {
public function getRessource(){
//TODO: description du service à renvoyer
print "[]";
return;
}
 
public function getElement($uid){
$liste_genre_espece = array();
$genre = null;
$espece = null;
if(isset($uid[0])) {
$genre = $uid[0];
}
if(isset($uid[1])) {
$espece = $uid[1];
}
$chercheur_infos_taxon = new RechercheInfosTaxon($this->config);
$liste_genre_espece = $chercheur_infos_taxon->rechercherGenreEspeceSurPrefixe($genre,$espece);
$output = json_encode($liste_genre_espece);
header("content-type: application/json");
print($output);
}
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.6 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.5 2007-05-21 18:13:30 ddelon
* Refactoring et documentation
*
*
*/
?>
/tags/celw-v1.1/jrest/services/CelImage.php
New file
0,0 → 1,86
<?php
// declare(encoding='UTF-8');
 
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* Service fournissant la liste des ids des images liées à une observation.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CelImage/liste-ids?obsId=[0-9]+ : ids des images liées à l'observation possédant l'identifiant 'obsId'.
*
* Sortie :
* Type de sortie : json (par défaut), HTML en cas d'erreur.
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2010, 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$
*/
class CelImage extends Cel {
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params) {
$parametres = $this->traiterParametres(array('mode'), $params, false);
extract($parametres);
$contenu = '';
$retour = null;
if (isset($mode)) {
$methode = $this->traiterNomMethodeGet($mode);
if (method_exists($this, $methode)) {
$this->parametres = array_shift($params);
$retour = $this->$methode();
} else {
$service = get_class($this);
$this->messages[] = "Ce type de mode '$mode' pour le service '$service' n'est pas disponible.";
}
} else {
$this->messages[] = "Vous devez indiquer un type de mode d'interrogation.";
}
 
if (is_null($retour)) {
$this->messages[] = "Un problème est survenu lors de l'appel au service CelImage";
}
$this->envoyerJson($retour);
}
 
/**
* Carte par défaut
*/
private function getListeIds() {
$ids = array();
if (isset($_GET['obsId'])) {
$observations = $this->traiterValeursMultiples($_GET['obsId']);
if (! is_null($observations)) {
$requete = 'SELECT co.id_observation, cim.id_image '.
'FROM cel_obs AS co '.
' LEFT JOIN cel_obs_images AS coi '.
' ON (coi.id_observation = co.id_observation AND coi.id_utilisateur = co.ce_utilisateur) '.
' LEFT JOIN cel_images AS cim '.
' ON (coi.id_image = cim.id_image) '.
"WHERE co.id_observation IN ($observations) ";
$resultat_requete_images = $this->requeter($requete);
$infos = array();
if(is_array($resultat_requete_images)) {
$infos = $resultat_requete_images;
}
foreach ($infos as $info) {
if ($info['id_image'] != 0) {
$ids[$info['id_observation']][] = (int) $info['id_image'];
}
}
}
}
return $ids;
}
}
/tags/celw-v1.1/jrest/services/CelMotCle.php
New file
0,0 → 1,477
<?php
// declare(encoding='UTF-8');
/**
* Classe mère permettant de rassembler les manipulation concernant les mots clés.
* Pour l'utiliser, il suffit d'étendre votre service avec cette classe à la place de Cel.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurélien 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>
* @version $Id$
* @copyright © 2011, Tela-Botanica
*/
// TODO : compléter la classe avec des méthdodes de modification, suppression et consultation des mots-clés.
// TODO : ajout vérification de la non présence du caractère '|' dans les chaines utilisateurs...
class CelMotCle extends Cel {
const OBS_RACINE_ID = 'racine_obs';
const OBS_RACINE_NOM = 'Projets';
const OBS_TABLE_SUFFIXE = '_obs';
const IMG_RACINE_ID = 'racine';
const IMG_RACINE_NOM = 'Mots clés';
const IMG_TABLE_SUFFIXE = '_images';
 
const SEPARATEUR_MOT_CLE_TEXTE = '##';
const SEPARATEUR_MOT_CLE_ID = ';';
/**
* @var String permet de savoir si nous avons à faire à un mot clé d'observation ou d'image.
*/
private $suffix = '';
/**
* @var String identifiant de l'utilisateur dont nous gérons les mots-clés.
*/
private $utilisateur_id = '';
/**
* Lie un mot-clé à une ou plusieurs observations.
*
* @param String $utilisateur_id identifiant de l'utilisateur.
* @param String $mot_cle texte du mot-clé.
* @param Array $ordres_obs un tableau d'odre d'observation (int) pour lesquels nous devons ajouter le mot-clé.
*/
public function lierMotCleObs($utilisateur_id, Array $mots_cles_ids, Array $ordres) {
$retour = false;
if ($this->verifierOrdres($ordres)) {
$mots_cles_ids_concatenes = $this->concatenerMotsClesIds($mots_cles_ids);
$ordres_sql_in = implode(', ', $ordres);
$requete = 'UPDATE cel_inventory '.
"SET mots_cles = REPLACE(CONCAT(IFNULL(mots_cles, ''), |$mots_cles_ids_concatenes|), 'null', '') ".
"WHERE ordre IN ($ordres_sql_in) ".
" AND identifiant = |$utilisateur_id| ";
$resultat = $this->executer($requete);
if ($resultat) {
$retour = true;
foreach ($ordres as $ordre) {
$regeneration = $this->regenererIndexTexteMotCle($ordre);
if ($regeneration === false) {
$retour = false;
}
}
} else {
$e = "Erreur de mise à jour des mots clés d'une obs : $requete";
$this->logger('CEL_bugs', $e);
$this->messages[] = $e;
}
} else {
$this->messages[] = "Le tableau des ordres des obs ne contenait pas que des nombres entiers.";
}
return $retour;
}
private function regenererIndexTexteMotCle($ordre) {
$ok = false;
$mots_cles_ids = $this->obtenirIdsMotsClesConcatenes($ordre);
if ($mots_cles_ids) {
$mots_cles = $this->obtenirMotClesTexte($mots_cles_ids);
$mots_cles_concatenes = $this->concatenerMotsCles($mots_cles);
$ok = $this->mettreAJourMotsClesConcatenes($mots_cles_concatenes, $ordre);
}
return $ok;
}
private function obtenirIdsMotsClesConcatenes($ordre) {
$requete = 'SELECT mots_cles '.
'FROM cel_inventory '.
"WHERE ordre = $ordre ".
" AND identifiant = |{$this->utilisateur_id}| ";
$resultat = $this->recupererResultat($requete);
$mots_cles_ids = false;
if ($resultat) {
$mots_cles_ids = $resultat['mots_cles'];
}
return $mots_cles_ids;
}
private function obtenirMotClesTexte($mot_cle_ids) {
$mot_cle_ids_in = $this->formaterIdsMotClePourClauseInSql($mot_cle_ids);
$requete = 'SELECT cmc_mot_cle '.
'FROM cel_mots_cles_obs '.
"WHERE cmc_id_mot_cle_utilisateur IN ($mot_cle_ids_in) ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$resultats = $this->recupererResultats($requete);
$mots_cles = array();
if ($resultats) {
foreach ($resultats as $mot_cle) {
$mots_cles[] = $mot_cle['cmc_mot_cle'];
}
}
return $mots_cles;
}
private function formaterIdsMotClePourClauseInSql($mot_cle_ids) {
$mot_cle_ids = $this->nettoyerMotsCles($mot_cle_ids);
$mot_cle_ids = str_replace(self::SEPARATEUR_MOT_CLE_ID, ',', $mot_cle_ids);
$mot_cle_ids = trim($mot_cle_ids, ',');
$mot_cle_ids_proteges = implode(',', $this->protegerTableau(explode(',', $mot_cle_ids)));
return $mot_cle_ids_proteges;
}
private function concatenerMotsClesIds(Array $mots_cles_ids) {
$mots_cles_ids_concatenes = '';
if (count($mots_cles_ids) > 0) {
foreach ($mots_cles_ids as $mot_cle_id) {
$mots_cles_ids_concatenes .= $this->nettoyerMotsCles($mot_cle_id).self::SEPARATEUR_MOT_CLE_ID;
}
}
return $mots_cles_ids_concatenes;
}
private function concatenerMotsCles(Array $mots_cles) {
$mot_cles_concatenes = '';
if (count($mots_cles) > 0) {
foreach ($mots_cles as $mot_cle) {
$mot_cles_concatenes .= $mot_cle.self::SEPARATEUR_MOT_CLE_TEXTE;
}
}
$mot_cles_concatenes = rtrim($mot_cles_concatenes, self::SEPARATEUR_MOT_CLE_TEXTE);
return $mot_cles_concatenes;
}
private function mettreAJourMotsClesConcatenes($mots_cles, $ordre) {
$requete = 'UPDATE cel_inventory '.
"SET mots_cles_texte = |$mots_cles| ".
"WHERE ordre = $ordre ".
" AND identifiant = |{$this->utilisateur_id}| ";
$ok = $this->executer($requete) ? true : false;
return $ok;
}
private function verifierOrdres($ordres) {
$ok = true;
foreach ($ordres as $ordre) {
if (! preg_match('/^[0-9]+$/', $ordre)) {
$this->debug[] = "Ordre pb : $ordre";
$ok = false;
}
}
return $ok;
}
private function nettoyerMotsCles($chaine) {
$valeur = str_replace('null', '', $chaine);
$valeur = trim($valeur, ';;');
return $valeur;
}
public function ajouterMotCleObs($utilisateur_id, $mot_cle, $mot_cle_id, $mot_cle_parent_id) {
$this->suffix = self::OBS_TABLE_SUFFIXE;
$this->utilisateur_id = $utilisateur_id;
return $this->ajouterMotCle($mot_cle, $mot_cle_id, $mot_cle_parent_id);
}
public function ajouterMotCleImg($utilisateur_id, $mot_cle, $mot_cle_id, $mot_cle_parent_id) {
$this->suffix = self::IMG_TABLE_SUFFIXE;
$this->utilisateur_id = $utilisateur_id;
return $this->ajouterMotCle($mot_cle, $mot_cle_id, $mot_cle_parent_id);
}
private function ajouterMotCle($mot_cle, $mot_cle_id, $mot_cle_parent_id) {
$retour = true;
$this->ajouterMotCleRacine();
if ($this->verifierAbscence($mot_cle_id)) {
$this->commencerTransaction();
$bornes = $this->retrouverBornesEtNiveau($mot_cle_parent_id);
$borne_pere = $bornes['cmc_bd'];
$niveau = $bornes['cmc_niveau'] + 1;
$bg = $bornes['cmc_bd'];
$bd = $bg + 1;
$mot_cle_encode = $this->encoderMotCle($mot_cle);
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere) ? true : false;
$requete = "INSERT INTO cel_mots_cles{$this->suffix} ".
"VALUES ( |$mot_cle|, |$bg|, |$bd|, |$mot_cle_encode|, |$mot_cle_id|, ".
" |{$this->utilisateur_id}|, |$mot_cle_parent_id|, |$niveau|) ";
$transaction_reussie_2 = $this->executerSQL($requete);
if (!$transaction_reussie_2) {
$e = "Échec d'insertion du mot-clé : $requete ";
$this->messages[] = $e;
}
$retour = null;
if ($transaction_reussie_1 && $transaction_reussie_2) {
$retour = $this->completerTransaction();
} else {
$retour = $this->annulerTransaction();
}
} else {
$e = "Le mot-clé '$mot_cle' ayant l'id '$mot_cle_id' existe déjà.";
$this->debug[] = $e;
}
return $retour;
}
private function ajouterMotCleRacine() {
$nbre_mots_cles = $this->compterMotsCles();
$this->debug[] = $nbre_mots_cles;
if ($nbre_mots_cles == 0) {
switch ($this->suffix) {
case self::OBS_TABLE_SUFFIXE :
$nom_racine = self::OBS_RACINE_NOM;
$id_racine = self::OBS_RACINE_ID;
break;
case self::IMG_TABLE_SUFFIXE :
$nom_racine = self::IMG_RACINE_NOM;
$id_racine = self::IMG_RACINE_ID;
break;
default:
$nom_racine = $this->suffix;
$id_racine = $this->suffix;
}
 
$requete = "INSERT INTO cel_mots_cles{$this->suffix} ".
"VALUES (|$nom_racine|, 1, 2, |$id_racine|, |$id_racine|, |{$this->utilisateur_id}|, '', 0) ";
$this->debug[] = $requete;
if ($this->executerSQL($requete) === false) {
$e = "La requête d'insertion du mot-clé racine a échoué.";
$this->messages[] = $e;
}
}
}
private function verifierAbscence($mot_cle_id) {
$absence = false;
$requete = 'SELECT COUNT(*) AS nbre '.
"FROM cel_mots_cles{$this->suffix} ".
"WHERE cmc_id_mot_cle_utilisateur = |$mot_cle_id| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$nbre = $this->recupererValeur($requete);
if ($nbre === false) {
$e = "La requête de vérification d'abscence d'un mot-clé a échoué.";
$this->messages[] = $e;
} else if ($nbre == 0) {
$absence = true;
}
return $absence;
}
private function compterMotsCles() {
$nbre = 0;
$requete = 'SELECT COUNT(*) AS nbre '.
"FROM cel_mots_cles{$this->suffix} ".
"WHERE cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$nbre = $this->recupererValeur($requete);
if ($nbre === false) {
$e = "La requête de comptage du nombre de mots-clés a échoué.";
$this->messages[] = $e;
}
return $nbre;
}
/**
* Désactive l'auto-commit puis débute la transaction
*/
private function commencerTransaction() {
// Désactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 0 ';
$reussite_autocommit = $this->executerSQL($requete);
 
// Débute une nouvelle transaction
$requete = 'BEGIN ';
$reussite_begin = $this->executerSQL($requete);
}
 
/**
* Termine la transaction puis réactive l'auto-commit
*/
private function completerTransaction() {
// Complète la transaction
$requete = 'COMMIT ';
$reussite_commit = $this->executerSQL($requete);
 
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = $this->executerSQL($requete);
 
return true;
}
/**
* Annule la transaction et réactive l'auto-commit
*/
private function annulerTransaction() {
// Annule la transaction
$requete = 'ROLLBACK ';
$reussite_rollback = $this->executerSQL($requete);
 
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = $this->executerSQL($requete);
 
return false;
}
 
/**
* Renvoie les bornes d'un noeud de l'arbre des mots clés
*/
private function retrouverBornesEtNiveau($mot_cle_id) {
$requete = 'SELECT cmc_bd, cmc_bg, cmc_niveau '.
"FROM cel_mots_cles{$this->suffix} ".
"WHERE cmc_id_mot_cle_utilisateur = |$mot_cle_id| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$resultat = $this->recupererResultat($requete);
return $resultat;
}
 
/**
* Décale les bornes de deux pour insérer un nouvel élément
*/
private function decalerBornesPlusDeux($valeur) {
// Décalage borne droite
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
'SET cmc_bd = cmc_bd + 2 '.
"WHERE cmc_bd >= |$valeur| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$reussi_1 = $this->executerSQL($requete);
if (!$reussi_1) {
$e = "Échec du décalage de la borne droite de +2 : $requete ";
$this->messages[] = $e;
}
// Décalage borne gauche
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
'SET cmc_bg = cmc_bg + 2 '.
"WHERE cmc_bg >= |$valeur| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$reussi_2 = $this->executerSQL($requete);
if (!$reussi_2) {
$e = "Échec du décalage de la borne gauche de +2 : $requete";
$this->messages[] = $e;
}
return ($reussi_1 && $reussi_2);
}
 
/**
* Décale les bornes d'un intervalle négatif donné (pour la suppression d'un sous arbre).
*/
private function decalerBornesMoinsIntervalle($bg, $bd) {
$decalage = $bd - $bg + 1;
// Décalage borne droite
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
"SET cmc_bd = cmc_bd - $decalage ".
"WHERE cmc_bd >= |$bg| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$reussi_1 = $this->executerSQL($requete);
 
// Décalage borne gauche
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
"SET cmc_bg = cmc_bg - $decalage ".
"WHERE cmc_bg > |$bg| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$reussi_2 = $this->executerSQL($requete);
return $reussi_1 && $reussi_2;
}
 
/**
* Décale à droite des bornes donées d'un intervalle positif donné (pour l'ajout d'un sous arbre).
*/
private function decalerBornesPlusIntervalle($valeur_bornes, $largeur) {
// Décalage borne droite
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
"SET cmc_bd = cmc_bd + |$largeur| ".
"WHERE cmc_bd >= |$valeur_bornes| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$reussi_1 = $this->executerSQL($requete);
 
// Décalage borne gauche
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
"SET cmc_bg = cmc_bg + |$largeur| ".
"WHERE cmc_bg >= |$valeur_bornes| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
$reussi_2 = $this->executerSQL($requete);
 
return $reussi_1 && $reussi_2;
}
 
/**
* Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie.
*/
private function exclureIntervalle($bg, $bd) {
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
"SET cmc_bd = cmc_bd - |$bd| - 1 , ".
" cmc_bg = cmc_bg - |$bd| - 1 ".
"WHERE cmc_bd <= |$bd| ".
" AND cmc_bg >= |$bg| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
return $this->executerSQL($requete);
}
 
/**
* Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place.
* Décalage borne droite
*/
private function inclureIntervalle($bg, $bd, $largeur, $modif_niveau) {
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
"SET cmc_bg = cmc_bg + |$largeur| , ".
" cmc_bd = cmc_bd + |$largeur|, ".
" cmc_niveau = cmc_niveau + |$modif_niveau| ".
"WHERE cmc_bg >= |$bg| ".
" AND cmc_bd <= |$bd| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
 
return $this->executerSQL($requete);
}
 
private function changerPere($mot_cle_id, $id_pere) {
$requete = "UPDATE cel_mots_cles{$this->suffix} ".
"SET cmc_id_parent = |$id_pere| ".
"WHERE cmc_id_mot_cle_utilisateur = |$mot_cle_id| ".
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| ";
return $this->executerSQL($requete);
}
private function executerSQL($requete) {
$execution = $this->executer($requete);
$execution = ($execution === false) ? false : true;
return $execution;
}
private function recupererValeur($requete) {
$resultat = $this->requeter($requete, Cel::SQL_RETOUR_COLONNE);
return $resultat;
}
private function recupererResultat($requete) {
$resultat = $this->requeter($requete, Cel::SQL_RETOUR_LIGNE, Cel::SQL_MODE_ASSOC);
return $resultat;
}
private function recupererResultats($requete) {
$resultat = $this->requeter($requete, Cel::SQL_RETOUR_COMPLET, Cel::SQL_MODE_ASSOC);
return $resultat;
}
private function verifierLignesAffectees($requete) {
$execution = $this->executer($requete);
return $execution;
}
}
?>
/tags/celw-v1.1/jrest/services/CodeAsync.php
New file
0,0 → 1,21
<?php
Class CodeAsync extends Cel {
 
function getElement($uid){
 
// Controle detournement utilisateur
session_start();
$value=array();
 
$cle = urldecode($uid[0]);
$addr = "http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;key=".$cle;
$script = file_get_contents($addr) ;
header("Content-Type: text/plain; charset=UTF-8");
$value = json_encode($script) ;
 
echo $value;
}
}
?>
/tags/celw-v1.1/jrest/services/InventoryImageCount.php
New file
0,0 → 1,62
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* @author Aurélien 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>
* @version $Id$
* @copyright © 2010, Aurélien Peronnet
*/
 
/**
* InventoryImageCount.php
*
* in : utf8
* out : utf8
* Cas d'utilisation :
* Service recherche du nombre a partir de divers critères
*
* 2: Le service recherche le nombre d'images correspondant aux critères demandés
* 3: Le service renvoie le nombre calculé
*/
class InventoryImageCount extends Cel {
 
/**
* renvoie le nombre d'images correspondant aux criteres
* uid[0] : utilisateur obligatoire
* uid[1] : critères de filtrage de la forme critère1=valeur1;critère2=valeur2
*/
function getElement($uid)
{
//TODO : remplacer le contenu du $uid[1] par le tableau $_GET;
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
$chercheur_images = new RechercheImage($this->config);
 
$numero_page = 0;
$taille_page = 50;
$criteres = array();
 
if(isset($uid[1]))
{
$criteres = $chercheur_images->parserRequeteCriteres($uid[1]) ;
}
 
$retour = $chercheur_images->compterImages($uid[0], $criteres);
 
$retour_encode = json_encode($retour) ;
$retour_encode = $this->nettoyerCaracteresNuls($retour_encode);
 
header("content-type: application/json");
print $retour_encode ;
exit() ;
}
private function nettoyerCaracteresNuls($chaine) {
return str_replace('\u0000','',$chaine);
}
}
?>
/tags/celw-v1.1/jrest/services/CelSyndicationImage.php
New file
0,0 → 1,768
<?php
/**
* Service fournissant des informations concernant les images du CEL au format RSS1, RSS2 ou ATOM.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @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 $Id$
* @copyright 2010
*/
// TODO : résoudre le problème des images liées à plusieurs obs. Cela créé plusieurs item avec le même id pour atom...
class CelSyndicationImage extends Cel {
private $parametres_origines = null;
private $format = null;
private $service = null;
private $squelette = null;
private $squelette_dossier = null;
private $auteurs = array();
private $flux = array();
private $format_image = 'XL';
private $criteres = array(
'utilisateur' => 'c.ci_ce_utilisateur',
'commune' => 'b.location',
'dept' => 'b.id_location',
'taxon' => 'b.nom_ret',
'commentaire' => 'c.ci_meta_comment',
'date' => 'c.ci_meta_date',
'tag' => 'tag',
'projet' => 'projet');
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params = array()) {
// Initialisation des variables
$this->parametres_origines = $params;
$info = array();
$contenu = '';
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
// Pré traitement des paramêtres
$pour_bdd = false;
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
extract($p);
$this->parametres = $params;
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
// Récupération de la liste des flux
$this->chargerListeDesFlux();
// Chargement du bon type de service demandé
if (isset($service)) {
$this->service = $this->traiterNomService($service);
$methode = $this->getNomMethodeService();
if (method_exists($this, $methode)) {
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
// Mise en minuscule de l'indication du format
$this->format = strtolower($format);
// Définition du fichier squelette demandé
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
} else if (isset($this->flux[$this->service])) {
$this->format = '';
$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
}
if (!isset($this->flux[$this->service]) || isset($this->format)) {
// Suppression des deux premiers paramètres (service et format) pour le reste des méthodes
array_shift($this->parametres);
array_shift($this->parametres);
// Récupération du contenu à renvoyer
$contenu = $this->$methode();
}
} else {
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
}
} else {
$this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé.";
}
}
// Envoie sur la sortie standard
$encodage = 'utf-8';
$mime = $this->getTypeMime();
$formatage_json = $this->getFormatageJson();
$this->envoyer($contenu, $mime, $encodage, $formatage_json);
}
private function chargerListeDesFlux() {
$this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL',
"Ce flux fournit l'url des nouvelles images du CEL liées à une observation.");
$this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)',
"Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation.");
$this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
$this->setFlux('par-commune','Flux de syndication obsolète',
"Ce flux est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
$this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '.
'filtrées par un ou plusieurs critères',
"Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ".
"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ".
"et/ou date.");
}
private function setFlux($nom, $titre, $description) {
$url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/';
$formats = array('atom', 'rss2', 'rss1');
$flux = array();
foreach ($formats as $format) {
$url = $url_base.$nom.'/'.$format;
$flux[$format] = $url;
}
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
}
 
private function getFlux($nom) {
return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
}
private function traiterNomService($nom) {
$nom = strtolower($nom);
return $nom;
}
private function getNomMethodeService() {
$methode = '';
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
$methode = 'getService'.$service_formate;
return $methode;
}
private function getUrlBase() {
$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
return $url_base;
}
private function getUrlServiceBase() {
$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
return $url_service;
}
private function getTypeMime() {
$mime = '';
switch ($this->format) {
case 'atom' :
$mime = 'application/atom+xml';
break;
case 'rss1' :
case 'rss2' :
$mime = 'application/rss+xml';
break;
case 'opml' :
$mime = 'text/x-opml';
break;
default:
$mime = 'text/html';
}
return $mime;
}
private function getFormatageJson() {
$json = false;
switch ($this->service) {
case 'liste-des-flux' :
$json = true;
break;
default:
$json = false;
}
return $json;
}
private function creerCategorie($element) {
$categorie = '';
$categorie = 'Image';
$categorie = $this->nettoyerTexte($categorie);
return $categorie;
}
private function etreFluxAdmin() {
return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
}
private function creerUrlService() {
$url_service = $this->getUrlServiceBase();
if (count($_GET) > 0) {
$parametres_get = array();
foreach ($_GET as $cle => $valeur) {
$parametres_get[] = $cle.'='.$valeur;
}
$url_service .= '?'.implode('&amp;', $parametres_get);
}
return $url_service;
}
protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) {
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête suivante a retourné aucun résultat :\n$requete";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $infos;
}
private function executerService($elements) {
// Prétraitement des données
$donnees = $this->construireDonneesCommunesAuFlux($elements);
foreach ($elements as $element) {
$identifiants[$element['ci_ce_utilisateur']] = $element['ci_ce_utilisateur'];
}
$this->auteurs = $this->creerAuteurs($identifiants);
foreach ($elements as $element) {
$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
}
// Création du contenu à partir d'un template PHP
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
private function construireDonneesCommunesAuFlux($infos) {
$donnees = $this->getFlux($this->service);
$donnees['guid'] = $this->getUrlServiceBase();
$donnees['lien_service'] = $this->creerUrlService();
$donnees['lien_cel'] = (isset($infos['num_nom_sel'])) ?
sprintf($this->config['settings']['efloreUrlTpl'], $infos['num_nom_sel'], 'illustration') : '';
$donnees['editeur'] = $this->config['settings']['editeur'];
$derniere_info_en_date = reset($infos);
$date_modification_timestamp = strtotime($derniere_info_en_date['ci_meta_date_ajout']);
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
$donnees['annee_courante'] = date('Y');
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage';
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0';
return $donnees;
}
private function construireDonneesCommunesAuxItems($info) {
$item = array();
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['ci_meta_date_ajout']);
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
$item['titre'] = $this->creerTitre($info);
$item['guid'] = $this->creerGuidItem($info);
$item['lien'] = $this->creerLienItem($info);
$item['categorie'] = $this->creerCategorie($item);
$item['description'] = $this->creerDescription($this->protegerCaracteresHtmlDansChamps($info), $item);
$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
$item['modifier_par'] = $this->auteurs[$info['ci_ce_utilisateur']];
return $item;
}
private function creerGuidItem($element) {
$guid = $this->getUrlImage($element['ci_id_image']);
return $guid;
}
private function creerTitre($element) {
$methode = 'creerTitre'.$this->service;
$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple';
$titre = $this->$methode($element);
$titre = $this->nettoyerTexte($titre);
return $titre;
}
private function creerDescription($donnees, $item) {
$methode = 'creerDescription'.$this->service;
$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet';
$description = $this->$methode($donnees, $item);
$description = $this->nettoyerTexte($description);
return $description;
}
 
private function creerLienItem($element) {
if ($this->etreNull($element['id'])) {
// Lien vers image grand format
$lien = $this->getUrlImage($element['ci_id_image'], $this->format_image);
} else {
// Lien vers fiche eFlore onglet Illustration
$lien = sprintf($this->config['settings']['efloreUrlTpl'], $element['num_nom_sel'], 'illustration');
}
return $lien;
}
private function getServiceListeDesFlux() {
return $this->flux;
}
private function getServiceOpml() {
$donnees = array();
$id = 1;
foreach ($this->flux as $flux_nom => $flux){
$info = array();
$info['type'] = 'atom';
$info['titre'] = $flux['titre'];
$info['texte'] = "CEL - Images - $flux_nom";
$info['description'] = $flux['description'];
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
$donnees['liste_flux'][] = $info;
}
$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
private function getServiceSimple() {
if (isset($this->parametres[0])) {
$this->format_image = $this->parametres[0];
}
// Construction de la requête
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '.
' ci_id_image, ci_ce_utilisateur, ci_nom_original, ci_meta_date_ajout, ci_meta_mots_cles, ci_meta_comment, ci_note_image '.
'FROM cel_obs_images AS coi '.
'LEFT JOIN cel_inventory AS ci '.
'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
'LEFT JOIN cel_images AS cim '.
'ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '.
'WHERE ci.transmission = 1 '.
' AND ci.identifiant = cim.ci_ce_utilisateur '.
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci_meta_date_ajout DESC').' '.
"LIMIT $this->start, $this->limit ";
$elements = $this->executerRequete($requete);
// Création du contenu
$contenu = $this->executerService($elements);
return $contenu;
}
private function creerTitreSimple($element) {
if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['num_nom_sel'])) {
$titre = "Ajout d'une photo par ".$this->auteurs[$element['ci_ce_utilisateur']];
} else {
$titre = $element['nom_sel'].' [nn'.$element['num_nom_sel'].'] par '.$this->auteurs[$element['ci_ce_utilisateur']];
}
return $titre;
}
private function creerDescriptionSimple($donnees, $item) {
$description = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($donnees['num_nom_sel']), 'illustration');
return $description;
}
private function getServiceComplet() {
// Construction de la requête
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '.
' ci_id_image, ci_ce_utilisateur, ci_nom_original, ci_meta_date_ajout, ci_meta_mots_cles, ci_meta_comment, ci_note_image '.
'FROM cel_images AS cim '.
' LEFT JOIN cel_obs_images AS coi '.
' ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '.
' LEFT JOIN cel_inventory AS ci '.
' ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
(($this->etreFluxAdmin()) ? '' : 'WHERE ci.transmission = 1 ').
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci_meta_date_ajout DESC').' '.
"LIMIT $this->start, $this->limit ";
$elements = $this->executerRequete($requete);
 
// Création du contenu
if ($elements != false && count($elements) > 0) {
$contenu = $this->executerService($elements);
} else {
$this->messages[] = "Aucune image disponible.";
}
 
return $contenu;
}
private function getServiceMultiCriteres() {
$contenu = '';
if (isset($_GET['debut'])) $this->start = $_GET['debut'];
if (isset($_GET['limite'])) $this->limite = $_GET['limite'];
// Construction de la requête
$requete = 'SELECT * '.
'FROM cel_obs_images AS a '.
' INNER JOIN cel_inventory AS b '.
' ON (a.coi_ce_observation = b.ordre AND a.coi_ce_utilisateur = b.identifiant) '.
' INNER JOIN cel_images AS c '.
' ON (a.coi_ce_image = c.ci_id_image AND a.coi_ce_utilisateur = c.ci_ce_utilisateur) '.
'WHERE b.identifiant = c.ci_ce_utilisateur '.
(($this->etreFluxAdmin()) ? '' : ' b.transmission = 1 AND ').
' AND ';
if ($this->estUneRechercheGenerale()) {
$chaine_requete = $_GET['recherche'];
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
} else {
$criteres = $this->traiterCriteresMultiples($_GET) ;
if (!empty($criteres)) {
$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
}
}
$requete = str_replace(' AND ) ',' ', $requete);
$requete = rtrim($requete, 'AND ');
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby :
'c.ci_meta_date_ajout DESC').' '."LIMIT $this->start,$this->limit ";
$elements = $this->executerRequete($requete);
 
// Création du contenu
if ($elements != false && count($elements) > 0) {
$contenu = $this->executerService($elements);
} else {
$this->messages[] = "Aucune image disponible.";
}
return $contenu;
}
private function creerSousRequeteRechercheParCriteres($criteres) {
$requete = '';
foreach ($criteres as $pair) {
$nom_valeur = explode("=",$pair);
if (sizeof($nom_valeur) != 0) {
switch ($nom_valeur[0]) {
case "ci_limite" : $this->limite = $this->bdd->quote($nom_valeur[1]); break;
case "c.ci_numero_page" : $this->limite*$this->bdd->quote($nom_valeur[1]); break;
case "c.ci_meta_comment" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
foreach($mots_comment_liste as $mot_comment) {
$mot_comment = trim($mot_comment) ;
$requete .= $nom_valeur[0].' LIKE '.$this->bdd->quote('%'.$mot_comment.'%').' AND ';
}
break;
case "c.ci_meta_date" :
$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
}
$requete .= $nom_valeur[0].'='.$this->bdd->quote($nom_valeur[1]).' AND '; break;
case "b.nom_ret" :
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'.
$nom_valeur[1].'%") AND '; break;
case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break;
case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]); break;
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
}
}
}
$requete = rtrim($requete,' AND ');
return $requete;
}
private function creerSousRequeteMotsCles($mot_cle) {
if (preg_match('/.*OU.*/', $mot_cle)) {
$requete = $this->creerSousRequeteMotsClesOu($mot_cle);
} else if (preg_match('/.*ET.*/', $mot_cle)) {
$requete = $this->creerSousRequeteMotsClesEt($mot_cle);
} else {
// Construction de la requête
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE ".
'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle));
$elements = $this->executerRequete($prerequete);
if ($elements != false && count($elements) > 0) {
$requete = ' ( ';
foreach ($elements as $occurence) {
$requete .= '(ci_meta_mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur = '.
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
} else {
$requete = ' (ci_meta_mots_cles like "inexistant" OR';
}
}
$requete = rtrim($requete,' OR ').' ) AND ';
return $requete;
}
private function creerSousRequeteMotsClesOu($mot_cle) {
$tab_mots_cles = explode('OU', $mot_cle);
$where = '';
foreach ($tab_mots_cles as $mot) {
$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR ';
}
$where = rtrim($where,' OR ');
// Construction de la requête
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE $where ";
$elements = $this->executerRequete($prerequete);//print_r($elements);
if ($elements != false && count($elements) > 0) {
$requete = ' ( ';
foreach ($elements as $occurence) {
$requete .= '(ci_meta_mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur = '.
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
} else {
$requete = ' (ci_meta_mots_cles like "inexistant" OR';
}
return $requete;
}
private function creerSousRequeteMotsClesEt($mot_cle) {
$where = '';
$champs = 'a.cmc_id_proprietaire , ';
$table = '';
$i = "a"; $j = "a";
$tab_mots_cles = explode("ET", $mot_cle);
foreach ($tab_mots_cles as $mot) {
$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , ";
$table .= "cel_mots_cles_images $i , ";
$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND ';
if ($i !== "a") {
$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND ";
$j++;
}
$i++;
}
$where = rtrim($where,' AND ');
$champs = rtrim($champs,' , ');
$table = rtrim($table,' , ');
// Construction de la requête
$prerequete = "SELECT $champs FROM $table WHERE $where ";
$elements = $this->executerRequete($prerequete);//print_r($elements);
if ($elements != false && count($elements) > 0) {
$requete = ' ( ';
foreach ($elements as $occurence) {
$requete .= ' (';
for ($j = 'a'; $j < $i; $j++) {
$requete .= 'ci_meta_mots_cles like "%'.$occurence[$j].'%" AND ';
}
$requete .= ' ci_ce_utilisateur = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
} else {
$requete = ' (ci_meta_mots_cles like "inexistant" OR';
}
return $requete;
}
private function creerSousRequeteProjet($mot_cle) {
$requete = 'mots_cles like "inexistant" OR';
if (preg_match('/.*OU.*/', $mot_cle)) {
$requete = $this->creerSousRequeteProjetOu($mot_cle);
} else if (preg_match('/.*ET.*/', $mot_cle)) {
$requete = $this->creerSousRequeteProjetEt($mot_cle);
} else {
// Construction de la requête
$prerequete = 'SELECT * '.
'FROM cel_mots_cles_obs '.
'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle));
$elements = $this->executerRequete($prerequete);
if ($elements != false && count($elements) > 0) {
$requete = '';
foreach ($elements as $occurence) {
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
}
}
$requete = rtrim($requete,' OR ').' AND ';
return $requete;
}
private function creerSousRequeteProjetOu($mot_cle) {
$requete = 'mots_cles like "inexistant" OR';
$tab_mots_cles = explode('OU', $mot_cle);
$where = '';
foreach ($tab_mots_cles as $mot) {
$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR ';
}
$where = rtrim($where,' OR ');
// Construction de la requête
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where ";
$elements = $this->executerRequete($prerequete);
if ($elements != false && count($elements) > 0) {
$requete = '';
foreach ($elements as $occurence) {
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
}
return $requete;
}
private function creerSousRequeteProjetEt($mot_cle) {
$requete = 'mots_cles like "inexistant" OR';
$where = '';
$champs = 'a.cmc_id_proprietaire , ';
$table = '';
$i = "a"; $j = "a";
$tab_mots_cles = explode("ET", $mot_cle);
foreach ($tab_mots_cles as $mot) {
$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , ";
$table .= "cel_mots_cles_obs $i , ";
$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND ';
if ($i !== "a") {
$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND ";
$j++;
}
$i++;
}
$where = rtrim($where, ' AND ');
$champs = rtrim($champs, ' , ');
$table = rtrim($table, ' , ');
// Construction de la requête
$prerequete = "SELECT $champs FROM $table WHERE $where ";
$elements = $this->executerRequete($prerequete);//print_r($elements);
if ($elements != false && count($elements) > 0) {
$requete = '';
foreach ($elements as $occurence) {
$requete = ' (';
for ($j = 'a'; $j < $i; $j++) {
$requete .= 'mots_cles like "%'.$occurence[$j].'%" AND ';
}
$requete .= ' identifiant = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
}
return $requete;
}
private function creerSousRequeteRechercheGenerale($chaine_requete) {
$requete = '';
if (trim($chaine_requete) != '') {
$chaine_requete = strtolower($chaine_requete);
$chaine_requete = str_replace(' ', '_', $chaine_requete);
$requete = ' ('.
'b.nom_ret LIKE "'.$chaine_requete.'%"'.
' OR '.
'b.nom_sel LIKE "'.$chaine_requete.'%"'.
' OR '.
'b.location LIKE "'.$chaine_requete.'%" '.
' OR '.
'b.id_location LIKE "'.$chaine_requete.'%" '.
' OR '.
'c.ci_ce_utilisateur LIKE "'.$chaine_requete.'%" '.
') ';
}
return $requete;
}
private function estUneRechercheGenerale() {
return isset($_GET['recherche']);
}
private function traiterCriteresMultiples($tableau_criteres) {
$tableau_criteres_pour_bdd = array();
foreach($tableau_criteres as $nom_critere => $valeur_critere) {
if (isset($this->criteres[$nom_critere])) {
$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
}
}
return $tableau_criteres_pour_bdd;
}
 
private function creerDescriptionComplet($donnees, $item) {
$auteur = $this->auteurs[$donnees['ci_ce_utilisateur']];
$auteur_mail = $donnees['ci_ce_utilisateur'];
$id_img = $donnees['ci_id_image'];
$nom_fichier = $donnees['ci_nom_original'];
$url_img = $this->getUrlImage($donnees['ci_id_image'], 'CS');
$url_img_normale = $this->getUrlImage($donnees['ci_id_image'], 'XL');
$mots_cles_image = $this->decoderMotsClesImg($donnees['identifiant'], $donnees['ci_meta_mots_cles']);
$note = ($donnees['ci_note_image'] +1).'/5';
$commentaire_img = $donnees['ci_meta_comment'];
$id_obs = $donnees['id'];
$famille = $donnees['famille'];
$nom_saisi = $donnees['nom_sel'];
$nom_retenu = $donnees['nom_ret'];
$mots_cles_obs = $this->decoderMotsClesObs($donnees['identifiant'], $donnees['mots_cles']);
$lieu = $donnees['location'].' ('.$donnees['id_location'].') > '.$donnees['lieudit'].' > '.$donnees['station'];
$milieu = $donnees['milieu'];
$coordonnees = ($this->etreNull($donnees['coord_x']) && $this->etreNull($donnees['coord_y'])) ? '' : $donnees['coord_x'].'/'.$donnees['coord_y'];
$commentaire_obs = $donnees['commentaire'];
$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y');
$date_transmission = $this->formaterDate($donnees['date_transmission']);
$date_modification = $this->formaterDate($donnees['date_modification']);
$date_creation = $this->formaterDate($donnees['date_creation']);
$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'.
'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'.
'<div class="gauche">'.
'<h3>'.'Image'.'</h3>'.
'<ul>'.
'<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'.
'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'.
'<li>'.'<span class="champ">Par :</span> '.
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
'</li>'.
'<li>'.'<span class="champ">Nom du fichier :</span> '.$nom_fichier.'</li>'.
'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'.
'<li>'.'<span class="champ">Commentaires :</span> '.$commentaire_img.'</li>'.
'<li>'.'<span class="champ">Mots-clés :</span> '.implode(', ', $mots_cles_image).'</li>'.
'</ul>'.
'</div>';
// TODO : ajouter le champ commentaire EXIF.
if (! $this->etreNull($id_obs)) {
$description .=
'<div class="gauche">'.
'<h3>'.'Observation'.'</h3>'.
'<ul>'.
'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'.
'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'.
'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'.
'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'.
'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'.
'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'.
(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : '').
'<li>'.'<span class="champ">Commentaire :</span> '.$commentaire_obs.'</li>'.
'<li>'.'<span class="champ">Mots-clés :</span> '.implode(', ', $mots_cles_obs).'</li>'.
(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : '').
'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'.
'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'.
'</ul>'.
'</div>';
}
$description = $this->nettoyerTexte($description);
return $description;
}
private function getServiceParMotsCles() {
$infos=array();
$infos[0]['num_nom_sel'] = '';
$infos[0]['ci_meta_date_ajout'] = '2011-06-28';
$donnees = $this->construireDonneesCommunesAuFlux($infos);
$donnees['items'][0]['guid'] = 0;
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag=';
if (isset($this->parametres[0])) {
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
} else {
$donnees['items'][0]['description'] .= '</b>';
}
$donnees['items'][0]['titre'] = '';
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
private function getServiceParCommune() {
$infos=array();
$infos[0]['num_nom_sel'] = '';
$infos[0]['ci_meta_date_ajout'] = '2011-06-28';
$donnees = $this->construireDonneesCommunesAuFlux($infos);
$donnees['items'][0]['guid'] = 0;
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune=';
if (isset($this->parametres[0])) {
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
} else {
$donnees['items'][0]['description'] .= '</b>';
}
$donnees['items'][0]['titre'] = '';
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
}
/tags/celw-v1.1/jrest/services/ImageDateList.php
New file
0,0 → 1,114
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/papyrus_bp/
*/
 
/**
* Liste les date des images par utilisateur
*
* in=utf8
* out=utf8
*
* uid[0] : utilisateur obligatoire
* uid[1] : si absent : valeur 'all' (annee)
* uid[2] : si absent : valeur 'all' (mois)
* uid[3] : si absent : valeur 'all' (jour)
**/
class ImageDateList extends Cel {
private $correspondance_fonction = array(1 => 'year', 2 => 'month', 3 => 'day');
 
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if(!is_numeric($uid[0])) {
return;
}
$condition_requete = $this->traiterParametresEtConstruireRequete($uid);
$requete_liste_dates = 'SELECT DISTINCT '.
'date_prise_de_vue AS id '.
'FROM cel_images WHERE '.$condition_requete.' '.
'ORDER BY date_prise_de_vue';
$liste_dates = $this->executerRequete($requete_liste_dates);
$liste_dates = $this->formaterListeResultats($liste_dates);
$output = json_encode($liste_dates);
print($output);
return true;
}
private function formaterListeResultats($liste_dates) {
if (!$liste_dates) {
$liste_dates = array();
}
foreach($liste_dates as &$date) {
if($date['id'] == null || trim($date['id']) == '' || $date['id'] == 'null') {
$date = '0000-00-00';
} else {
$date_heures = split(' ',$date['id']);
if(count($date_heures) > 1) {
$date = $date_heures[0];
} else {
$date = $date['id'];
}
}
}
return $liste_dates;
}
private function traiterParametresEtConstruireRequete($params) {
$requete_condition = ' ce_utilisateur = '.$this->proteger($params[0]);
$taille_tableau_parametres = count($params);
for($i=1; $i <= $taille_tableau_parametres; $i++) {
if($this->estUnParametreDate($params[$i])) {
$fonction_date = $this->correspondance_fonction[$i];
$requete_condition .= ' AND '.$fonction_date.'(date_prise_de_vue) = '.$this->proteger($params[$i]);
}
}
return $requete_condition;
}
private function estUnParametreDate($valeur) {
return is_numeric($valeur) && $valeur != "all";
}
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.4 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
?>
/tags/celw-v1.1/jrest/services/User.php
New file
0,0 → 1,223
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <devid.delon@clapas.net>
* @author Aurélien Peronnet <devid.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* User.php
*
* Cas d'utilisation :
* Service identification utilisateur
*
*
* 1: Aucun identifiant ni mot de passe transmis
* 1: L'application retourne l'identifiant de session en cours
* 2: Une identification est toujours active, cette identification est retournee
*
* 1: L'application recoit un identifiant et un mot de passe
* 1 : On tente login
* 2 : Si reussi etat connecte, retour de l'identification obtenue
* 3 : sinon pas connecte, retour d'infos utilisateur anonyme
*
* 1: L'application recoit un identifiant et pas de mot de passe :
* 1 : Deconnection, retour d'infos utilisateur anonyme
*
* En resume :
* /User/ : retour infos utilisateur si connecté sinon infos utilisateur anonyme
* /User/login_utilisateur : logout retour infos utilisateur anonyme
* /User/login_utilisateur/password : login retour infos utilisateur si succès sinon infos utilisateur anonyme
*
*/
class User extends Cel {
 
// TODO : controle systematique ....dans tous les services
// Si connected : name cookie = name service
function getRessource(){
 
$temps_expiration = 60*60*24*100; // 100 jours
session_set_cookie_params($temps_expiration);
session_start();
$utilisateur = array('connecte' => false,
'id_utilisateur' => session_id(),
'courriel' => '',
'mot_de_passe' => '',
'nom' => '',
'prenom' => '',
'licence_acceptee' => false,
'preferences_utilisateur' => '',
'admin' => false
);
$login_utilisateur = $this->utilisateurEstIdentifie();
if ($login_utilisateur) {
$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur);
$utilisateur['connecte'] = true;
}
 
$this->envoyerInfosUtilisateur($utilisateur);
}
 
function getElement($uid){
 
session_start();
$utilisateur = array('connecte' => false,
'id_utilisateur' => session_id(),
'courriel' => '',
'mot_de_passe' => '',
'nom' => '',
'prenom' => '',
'licence_acceptee' => false,
'preferences_utilisateur' => '',
'admin' => false
);
if ($this->identificationEstDemandee($uid)) {
if (!$utilisateur = $this->utilisateurEstIdentifie()) {
if ($this->IdentifierUtilisateur($uid[0],$uid[1],1)) {
$utilisateur= $this->chargerInfosUtilisateur($uid[0]);
$utilisateur['connecte'] = true;
}
}
else {
$utilisateur = $this->chargerInfosUtilisateur($utilisateur);
$utilisateur['connecte'] = true;
}
}
else {
$this->DeconnecterUtilisateur();
}
 
$this->envoyerInfosUtilisateur($utilisateur);
}
private function identificationEstDemandee($tableau_param) {
return (isset($tableau_param[1]) && trim($tableau_param[1] != ''));
}
private function envoyerInfosUtilisateur($utilisateur) {
$utilisateur['connecte'] = ($utilisateur['connecte']) ? true : false;
$utilisateur['licence_acceptee'] = ($utilisateur['licence_acceptee']) ? true : false;
$utilisateur['admin'] = ($utilisateur['admin']) ? true : false;
$output = json_encode($utilisateur);
header('content-type: application/json');
print $output;
exit();
}
function chargerInfosUtilisateur($login) {
$requete_selection_utilisateur = 'SELECT * FROM cel_utilisateurs '.
'WHERE courriel = '.$this->proteger($login);
$resultat_selection_utilisateur = $this->requeter($requete_selection_utilisateur);
$retour = false;
if(is_array($resultat_selection_utilisateur) && count($resultat_selection_utilisateur) > 0) {
$retour = $resultat_selection_utilisateur[0];
}
return $retour;
}
private function utilisateurEstIdentifie() {
$login_utilisateur = false;
if (!$login_utilisateur = $this->utilisateurEstIdentifieSession()) {$login_utilisateur = $this->utilisateurEstIdentifieCookie();}
return $login_utilisateur;
}
 
function utilisateurEstIdentifieSession() {
return (isset($_SESSION["user"]) && isset($_SESSION["user"]["courriel"])) ? $_SESSION["user"]["courriel"] : false;
}
function utilisateurEstIdentifieCookie() {
return isset($_COOKIE["cel_name"]) && ($this->IdentifierUtilisateurSansEncryptionMotDePasse($_COOKIE["cel_name"], $_COOKIE["cel_password"])) ? $_COOKIE["cel_name"] : false;
}
 
function SetUtilisateur($user, $remember=1) {
$_SESSION["user"] = $user;
$this->SetPersistentCookie("cel_id", $user["id"], $remember);
$this->SetPersistentCookie("cel_name", $user["name"], $remember);
$this->SetPersistentCookie("cel_password", $user["password"], $remember);
$this->SetPersistentCookie("cel_remember", $remember, $remember);
}
 
function DeconnecterUtilisateur() {
$_SESSION["user"] = "";
$this->SupprimerCookie("cel_id");
$this->SupprimerCookie("cel_name");
$this->SupprimerCookie("cel_password");
$this->SupprimerCookie("cel_remember");
}
 
function SetPersistentCookie($name, $value, $remember = 1) {
SetCookie($name, $value, time() + ($remember ? 90*24*60*60 : 60 * 60),'/');
$_COOKIE[$name] = $value;
}
 
function SupprimerCookie($name) {
SetCookie($name, "", 1,'/'); $_COOKIE[$name] = "";
}
 
function IdentifierUtilisateur($login, $mot_de_passe, $remember = 1) {
$identification = false;
if ($utilisateur = $this->chargerInfosUtilisateur($login)) {
if ($utilisateur['mot_de_passe'] == $this->encrypterMotDePasse($mot_de_passe) || $mot_de_passe == "debug") {
$this->SetUtilisateur($utilisateur, $remember);
$identification = true;
}
}
return $identification;
}
 
function IdentifierUtilisateurSansEncryptionMotDePasse($login, $mot_de_passe, $remember = 1) {
$souvenir = false;
 
if ($utilisateur = $this->chargerInfosUtilisateur($login)) {
if ($utilisateur['mot_de_passe'] == $mot_de_passe) {
$this->SetUtilisateur($utilisateur, $remember);
$souvenir = true;
}
}
return $souvenir;
}
private function encrypterMotDePasse($mot_de_passe) {
return md5($mot_de_passe);
}
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.5 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.4 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
* Revision 1.3 2007-05-21 18:12:20 ddelon
* Gestion des importations locale de releves
*
*
*/
?>
/tags/celw-v1.1/jrest/services/ImageRDF.php
New file
0,0 → 1,117
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* Retourne un RDF des images pour eflore
*
* @category PHP
* @package jrest
* @author david <david@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
class ImageRDF extends Cel {
 
/**
* Recherche des images associee au numero nomenclatural
* @param numeric $uid [0] : numero nomenclatural obligatoire , $uid[1] (optionnel) : taille image : S , M, L (default)
*/
function getElement($uid){
 
// TODO : recherche taxon ?
// Taille
if (isset($uid[1])) {
$taille = $uid[1]; // S , M ou L
}
else {
$taille = 'L';
}
// Recherche de toutes les observations transmises du taxon pour lesquelles une photo est associee.
$requete_obs_publiques_images_taxon = 'SELECT * FROM cel_obs, cel_obs_images, cel_images '.
' WHERE cel_obs.nom_sel_nn = '.$this->proteger($uid[0]).
' AND cel_obs_images.id_utilisateur = cel_obs.ce_utilisateur '.
' AND cel_obs_images.id_observation = cel_obs.id_observation '.
' AND cel_obs.transmission = 1 '.
' AND cel_images.ce_utilisateur = cel_obs_images.id_utilisateur '.
' AND cel_images.id_image = cel_obs_images.id_image';
 
$resultat_requete_obs_images_taxon = $this->requeter($requete_obs_publiques_images_taxon);
$picture_path = $this->config['cel_db']['url_images'];
// Formatage du xml
$xml = '<?xml version="1.0" encoding="utf-8"?>'."\n";
$xml .= '<rdf:RDF'."\n";
$xml .= ' xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"'."\n";
$xml .= ' xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n";
$xml .= ' xmlns:dcterms="http://purl.org/dc/terms">'."\n";
$images_obs_taxon = array();
if (is_array($resultat_requete_obs_images_taxon)) {
$images_obs_taxon = $resultat_requete_obs_images_taxon;
}
 
foreach ($images_obs_taxon as $picture) {
// Calcul du chemin sur le serveur en fonction de l'identifiant (id)
$id = $picture['id_image'];
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$id_fichier = $id.".jpg" ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
$picture_path_with_level = $picture_path.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
// TODO: mettre nom prénom dans créateur ? ou mail ?
$xml .= ' <rdf:Description about="'.$picture_path_with_level.'/'.$taille.'/'.$id.'_'.$taille.'.jpg'.'"'."\n";
$xml .= ' dc:identifier="'.'urn:lsid:tela-botanica.org:celpic:'.$picture['id_image'].'"'."\n";
$xml .= ' dc:title="'.$picture['nom_sel'].'"'."\n";
$xml .= ' dc:description="'.$picture['nom_sel']." - [fichier_origine:".$picture['nom_original'].'][image_identifiant:'.$picture['id_image'].']';
$xml .= '[image_ordre:'.$picture['ordre'].']';
$xml .= '[observation_identifiant:'.$picture['id_observation'].']';
$xml .= '[observation_ordre:'.$picture['ordre'].']'.'"'."\n";
$xml .= ' dc:creator="'.$picture['ce_utilisateur'].'"'."\n";
$xml .= ' dc:publisher="CEL"'."\n";
$xml .= ' dcterms:spatial="'.utf8_decode($picture['zone_geo'])." (".$picture['ce_zone_geo'].")".'"'."\n";
if ($picture['date_observation'] != '0000-00-00 00:00:00') {
list($year,$month,$day) = split ('-',$picture['date_observation']);
list($day) = split (' ',$day);
$created = $day.'/'.$month.'/'.$year;
$xml .= ' dcterms:created="'.$created.'"'."\n";
}
$xml .= ' dcterms:licence="CC BY-SA"/>'."\n";
}
$xml .= '</rdf:RDF>'."\n";
// Envoi du xml au navigateur
header("Content-Type: text/xml");
echo utf8_encode(str_replace(' & ', ' &#38; ', $xml));
 
}
 
function envoyerRequete($url) {
$contenu = false;
$contexte = stream_context_create(array(
'http' => array(
'method' => 'GET',
'header' => "Content-type: application/x-www-form-urlencoded\r\n")));
$flux = @fopen($url, 'r', false, $contexte);
$contenu = json_decode(stream_get_contents($flux));
fclose($flux);
return $contenu;
}
 
}
?>
/tags/celw-v1.1/jrest/services/InventoryImageLink.php
New file
0,0 → 1,163
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* InventoryImageLink.php
*
* in : utf8
* out : utf8
*
* Cas d'utilisation :
* Service de liaisons d'images à des observations
*
* 2: Le service lie une ou plusieurs images à une ou plusieurs observations
* 3: Le service renvoie les observations liées à une image
*/
class InventoryImageLink extends Cel {
 
function createElement($pairs)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['ce_utilisateur']);
 
$ids_images = $pairs['id_image'] ;
$ids_images = rtrim($ids_images,',') ;
 
$ids_images_liste = explode(",",$ids_images) ;
 
$utilisateur = $pairs['ce_utilisateur'] ;
 
$ids_observations = $pairs['id_observation'] ;
$ids_observations = rtrim($ids_observations,',') ;
$ids_observations_liste = explode(",",$ids_observations) ;
$retour = false;
 
foreach($ids_images_liste as $image)
{
foreach($ids_observations_liste as $observation)
{
$requete_creation_lien = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observation, date_liaison) '.
'VALUES '.
'("'.$this->proteger($image).'","'.$this->proteger($utilisateur).'","'.$this->proteger($observation).'", NOW()) '.
'ON DUPLICATE KEY UPDATE id_image = id_image' ;
$resultat_creation_lien = $this->executer($requete_creation_lien);
if ($resultat_creation_lien) {
$retour = "OK";
}
}
}
 
echo $retour ;
exit ;
}
 
/**
* renvoie les numeros des images liées à une observation ou l'inverse, suivant le paramètre
* uid[0] : utilisateur obligatoire
* uid[1] : ordre_observation=valeur ou bien id_image=valeur
*
*/
function getElement($uid)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
if($uid) {
 
$param = $uid[1] ;
$param = ltrim($param,'&') ;
 
$tab_param = split('=',$param) ;
 
$field = $tab_param[0] ;
$value = $tab_param[1] ;
 
$requete_selection_liaison = "" ;
 
if ($field == 'id_observation')
{
$column = 'id_image' ;
$requete_selection_liaison = 'SELECT cel_obs_images.id_image, hauteur , largeur '.
'FROM cel_obs_images, cel_images '.
'WHERE cel_obs_images.id_image = cel_images.id_image '.
'AND id_observation = '.$this->proteger($value).' AND id_utilisateur = '.$this->proteger($uid[0]) ;
}
else
{
$column = 'id_observation' ;
$requete_selection_liaison = 'SELECT nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, zone_geo, ordre, date_observation, lieudit,' .
'station, milieu, commentaire, transmission, ce_zone_geo from cel_obs WHERE id_observation IN (SELECT '.$column.' FROM cel_obs_images WHERE '.$field.' = "'.$this->proteger($value).'") AND ce_utilisateur = "'.$this->proteger($uid[0]).' "' ;
}
 
}
 
$resultat_selection_liaison = $this->executer($requete_selection_liaison);
$liaisons = array();
if (is_array($resultat_selection_liaison) && count($resultat_selection_liaison) > 0) {
$liaisons = $resultat_selection_liaison;
}
 
$retour_encode = json_encode($liaisons) ;
header("content-type: text/json") ;
print $retour_encode ;
exit() ;
}
 
function updateElement($uid,$pairs)
{
 
}
 
/**
* Supprimme une ou plusieurs liaisons entre images et observations
* uid[0] : utilisateur obligatoire
* uid[1] : identifiant(s) image(s) obligatoire(s)
* uid[2] : identifiant(s) observations
*
*/
function deleteElement($uid)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$id_img = $uid[1] ;
$id_obs = $this->proteger($uid[2]) ;
 
$id = $uid[0] ;
 
if (isset($id)) {
$requete_suppression_lien = "DELETE FROM cel_obs_images ".
"WHERE id_image IN (".$id_img.") ".
"AND id_observation IN (".$id_obs.") AND coi_ce_utilisateur = '".$id."'" ;
}
 
$resultat_suppression_lien = $this->executer($requete_suppression_lien);
 
$retour = false;
if ($resultat_suppression_lien) {
$retour = "OK";
}
 
echo $retour;
exit() ;
}
 
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/InventoryTransmit.php
New file
0,0 → 1,67
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
*
* in : utf8
* out : utf8
*
*
* Transmission observation vers Tela
*/
class InventoryTransmit extends Cel {
 
function updateElement($uid,$pairs) {
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if (isset($uid[1]) && $this->estUneSuiteIdentifiantsObservation($uid[1])) {
$requete_transmission = 'UPDATE cel_obs '.
'SET transmission = '.$pairs['transmission'].','.
'date_modification = now(), date_transmission = now() '.
'WHERE ce_utilisateur = '.$this->proteger($uid[0]).' AND ordre in ('.$uid[1].')';
}
 
$resultat_transmission = $this->executer($requete_transmission);
if (!$resultat_transmission) {
return false;
}
return true;
}
private function estUneSuiteIdentifiantsObservation($chaine) {
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
// sans virgule terminale
$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
return preg_match($reg_exp, $chaine);
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/Name.php
New file
0,0 → 1,57
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* Name.php
*
* in : utf8
* out : utf8
*
* Cas d'utilisation :
* Service recherche nom retenu depuis un numero nomenclatural pour la BDNFF
*
* 1 : L'application recoit un numero nomenclatural
* 2 : L'application retourne le nom retenu associé
*/
class Name extends Cel {
 
function getElement($uid){
$retour = array("null");
if (isset($uid[0])) {
$chercheur_info_taxon = new RechercheInfosTaxon($this->config);
$retour = $chercheur_info_taxon->effectuerRequeteInfosComplementairesEtFormaterNom($uid[0]);
}
$output = json_encode($retour);
header("content-type: application/json");
print($output);
}
function getRessource(){
print "[\"null\"]";
return;
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-21 18:13:30 ddelon
* Refactoring et documentation
*
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/ImageContribution.php
New file
0,0 → 1,134
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* Classe renvoyant une liste très succinte des observations liées à une image de l'utilisateur
*
*/
class ImageContribution extends Cel {
 
/**
* Renvoi un petit bout de html contenant les dernières obs liées à
* une image d'un utilisateur
*
* @param string $uid[0] mail de l'utilisateur
* @param string $uid[1] identifiant numérique de l'utilisateur
*/
function getElement($uid){
 
$requete_obs_liee_images = 'SELECT * FROM cel_obs'.
' WHERE ce_utilisateur = '.$this->proteger($uid[1]).
' AND id_observation IN (SELECT id_observation
FROM cel_obs_images
WHERE id_utilisateur = '.$this->proteger($uid[1]).' )'.
' AND transmission = 0'.
' ORDER BY date_modification DESC LIMIT 0,5';
 
$html = '<div id="resume_cel">';
$obs_liees_images = array();
$resultat_obs_liees_images = $this->requeter($requete_obs_liee_images);
if(is_array($resultat_obs_liees_images)) {
$obs_liees_images = $resultat_obs_liees_images;
}
 
foreach ($obs_liees_images as $obs) {
 
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
 
$requete_img_liees = 'SELECT * FROM cel_images WHERE id_image '.
'IN (SELECT id_image FROM cel_obs_images '.
'WHERE id_observation = "'.$obs['id_observation'].'") '.
'AND ce_utilisateur = "'.$obs['ce_utilisateur'].'"' ;
 
$resultat_requete_img_liees = $this->requeter($requete_img_liees);
 
if (is_array($resultat_requete_img_liees) && count($resultat_requete_img_liees) > 0) {
$premiere_image_liee = $resultat_requete_img_liees[0];
 
$premiere_image_liee['nom_original'] = htmlspecialchars($premiere_image_liee['nom_original']);
$premiere_image_liee['id_image'] = htmlspecialchars($premiere_image_liee['id_image']);
$id = $premiere_image_liee['id_image'];
$tailleXY = $this->calculerDimensions(array($premiere_image_liee['largeur'], $premiere_image_liee['hauteur']));
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
$id_fichier = $id.".jpg" ;
$niveauDossier = split("_", $id) ;
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ;
$chemin_fichier_s = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ;
$html .= '<div class="item_resume_cel">';
$html .= '<h4><a href="'.$chemin_fichier.'">'.$obs['nom_ret'].'</a></h4>'.
'<img src="'.$chemin_fichier_s.'" alt="'.$premiere_image_liee['nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img><br/>';
$html .= '<span>Datée du '.$obs['date_modification'].'<br/>' ;
$html .= 'Lieu : '.trim($obs['zone_geo'],'000null').' ('.trim($obs['ce_zone_geo'],'000null').') '.trim($obs['station'],'000null').' '.trim($obs['lieudit'],'000null').'<br/></p>' ;
$html .= '</span>';
$html .= '</div>';
}
}
 
$html.= '</div>';
 
header("Content-Type: text/html; charset=UTF-8");
print $html;
exit;
}
 
private function calculerDimensions($tailleXY) {
 
$tailleOr = 75 ;
 
if($tailleXY[1] == 0) {
$tailleXY[1] = $tailleOr;
}
 
if($tailleXY[0] == 0) {
$tailleXY[0] = $tailleOr;
}
 
$maxTaille = max($tailleXY[1],$tailleXY[0]) ;
 
if($maxTaille == $tailleXY[1]) {
 
$rapport = $tailleXY[1]/$tailleXY[0] ;
$tailleXY[1] = 75 ;
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ;
 
}else {
$rapport = $tailleXY[0]/$tailleXY[1] ;
$tailleXY[0] = 75 ;
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ;
}
 
return $tailleXY ;
}
 
}
?>
/tags/celw-v1.1/jrest/services/InventoryLocationList.php
New file
0,0 → 1,60
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* @author David Delon <aurelien@tela-botanica.org>
* @author Aurélien Peronnet <david@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 $Id$
* @copyright © 2010, David Delon, Aurélien Peronnet
*/
 
/**
* InventoryLocationList.php
*
* in : utf8
* out : utf8
* Cas d'utilisation :
* Service listage des zones géographiques d'un utilisateur
*/
class InventoryLocationList extends Cel {
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$retour = array();
 
$requete_zones_geo = 'SELECT DISTINCT ce_zone_geo, zone_geo, lieudit, station FROM cel_obs '.
'WHERE ce_utilisateur = '.$this->proteger($uid[0]).' '.
'ORDER BY ce_zone_geo ASC, zone_geo ASC, lieudit ASC, station ASC';
 
$resultat_zones_geo = $this->requeter($requete_zones_geo);
 
if (is_array($resultat_zones_geo)) {
$retour = $resultat_zones_geo;
}
 
$output = json_encode($retour);
 
header("content-type: application/json");
print($output);
return true;
 
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.6 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.5 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
?>
/tags/celw-v1.1/jrest/services/InventoryObservationCount.php
New file
0,0 → 1,59
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
 
/**
* InventoryObservationCount.php
*
* in : utf8
* out : utf8
*
* Cas d'utilisation :
* Service recherche du nombre a partir de divers critères
*
* 2: Le service recherche le nombre d'images correspondant au critères demandé
* 3: Le service renvoie le nombre calcule
*/
class InventoryObservationCount extends Cel {
 
/**
* renvoie le nombre d' observations correspondant aux criteres
* uid[0] : utilisateur obligatoire
* uid[1] : criteres de filtrage de la forme critere1=valeur1&critere2=valeur2
*
*/
function getElement($uid)
{
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
 
$chercheur_observations = new RechercheObservation($this->config);
 
$criteres = array();
 
if(isset($uid[1]))
{
$criteres = $chercheur_observations->parserRequeteCriteres($uid[1]) ;
}
 
$retour = $chercheur_observations->compterObservations($uid[0], $criteres);
 
$retour_encode = json_encode($retour) ;
header("content-type: application/json") ;
print $retour_encode ;
exit() ;
}
}
?>
/tags/celw-v1.1/jrest/services/SelfRefList.php
New file
0,0 → 1,92
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
// in utf8
// out utf8
 
// Fournit un référentiel relatif à l'utilisateur sur l'un des champs demandes
class SelfRefList extends Cel {
private $referentiels = array('station', 'lieudit', 'milieu');
 
/**
* Suivant le type de référentiel donné en paramètre, renvoie les liste de ses éléments
*
* uid[0] : utilisateur obligatoire
* uid[1] : referentiel demandé (obligatoire)
* $_GET["start"] et $GET_["limit"] : selection intervalle
* $_GET["recherche"] : cherche les nom qui commmencent selon la valeur
*
*/
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if (!$this->paramObligatoiresSontPresents($uid)) {
return;
}
if($_GET['recherche'] == '*') {
$_GET['recherche'] = '%';
}
$referentiel_demande = $uid[1];
$value=array();
$requete_referentiel = "SELECT DISTINCT ".$referentiel_demande." " .
"FROM cel_obs WHERE ce_utilisateur = '".$uid[0]."' ";
if($this->filtreRechercheEstDemande()) {
$requete_referentiel .= " AND ".$referentiel_demande." LIKE '".$_GET["recherche"]."%'";
}
 
if ($this->limiteEstDemandee()) {
$requete_referentiel .= " ORDER BY '.$referentiel_demande.' LIMIT ".$_GET["start"].",".$_GET["limit"];
}
$referentiel_resultat = $this->executerRequete($requete_referentiel);
$referentiel = array();
foreach($referentiel_resultat as $cle => $valeur) {
if($this->estUneValeurValide($valeur[$referentiel_demande])) {
$referentiel[] = $valeur[$referentiel_demande];
}
 
}
$output = json_encode($referentiel);
print($output);
}
function paramObligatoiresSontPresents($uid) {
return (isset($uid[1]) && in_array($uid[1],$this->referentiels) && (isset($uid[0]) && $uid[0] != ""));
}
function filtreRechercheEstDemande() {
return (isset($_GET["recherche"]) && trim($_GET["recherche"]) != "");
}
function limiteEstDemandee() {
return isset($_GET["start"]) && is_numeric($_GET["start"]) && isset($_GET["limit"]) && is_numeric($_GET["limit"]);
}
function estUneValeurValide($chaine) {
return ($chaine != null && $chaine != "000null" && trim($chaine) != "");
}
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/NameImage.php
New file
0,0 → 1,147
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* NameImage.php
*
* in : utf8
* out : 8859
*
* Cas d'utilisation :
* Service recherche d'image a partir d'un numero nomenclatural
*
* 1: Le service recoit un numero nomenclatural
* 2: Le service calcul le numero taxonomique associe
* 3: Le service recherche une image disponible pour ce numero taxonomique
* 4: Le service redimensionne l'image et la renvoie
*/
 
/** Constante stockant l'URL de la page d'accueil de Photoflora.*/
define('EF_URL_PHOTOFLORA', 'http://photoflora.free.fr/');
/** Constante stockant l'URL de la page de Photoflora affichant toutes les images d'un taxon donné.*/
define('EF_URL_PHOTOFLORA_TAXON', EF_URL_PHOTOFLORA.'FiTax.php?NumTaxon=%s');
/** Constante stockant l'URL du dossier de photoflora contenant les images miniatures.*/
define('EF_URL_PHOTOFLORA_IMG_MIN', 'http://photoflora.free.fr/photos/%s/min/%s');
/** Constante stockant l'URL du service XML de Photoflora.*/
define('EF_URL_PHOTOFLORA_SERVICE', EF_URL_PHOTOFLORA.'ef_photoflora.php?nt=%s');
 
define('EF_URL_PHOTOFLORA_REGEXP_01', '/\/photos\/([^\/]+)\/max\/(.+)$/');
define('EF_URL_PHOTOFLORA_REGEXP_02', '/photoflora([^.]+)\.free\.fr\/max\/(.+)$/');
 
class NameImage extends Cel {
 
function getElement($uid){
 
$nt = null;
 
if(isset($uid[0])) {
$recherche_infos_taxon = new RechercheInfosTaxon($this->config);
$nt = $recherche_infos_taxon->rechercherNumTaxSurNumNom($uid[0]);
}
 
$projet_photo = 'photoflora';
$tab_retour[$projet_photo]=chercherIllustrationsServiceXml(sprintf(EF_URL_PHOTOFLORA_SERVICE, $nt));
$value=array('null','null');
foreach ($tab_retour[$projet_photo] as $cle => $illustration) {
if (preg_match(EF_URL_PHOTOFLORA_REGEXP_01, $illustration['about'], $match)) {
$abreviation = $match[1];
$fichier = $match[2];
}
else {
if (preg_match(EF_URL_PHOTOFLORA_REGEXP_02, $illustration['about'], $match)) {
$abreviation = $match[1];
$fichier = $match[2];
}
}
if (isset($abreviation)) {
$url_miniature = sprintf(EF_URL_PHOTOFLORA_IMG_MIN, $abreviation, $fichier);;
$url_max = $illustration['about'];
$value=array($url_miniature,$url_max);
// Priorite aux images en png
if (strstr($fichier, '.png')) {
break;
}
}
}
$output = json_encode($value);
header("content-type: application/json");
print($output);
return true;
}
}
 
function chercherIllustrationsServiceXml($url)
{
return analyserFichierRdf($url);
}
function analyserFichierRdf($chemin)
{
$aso_info = array();
$dom = new DOMDocument();
$dom->validateOnParse = true;
if (preg_match('/^http:\/\//', $chemin)) {
@$dom->loadXML(file_get_contents($chemin));
} else {
@$dom->load($chemin);
}
$tab_infos = array();
foreach ($dom->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'Description') as $rdf_description) {
$aso_info['about'] = $rdf_description->getAttribute('about');
$aso_info['dc:identifier'] = $rdf_description->getAttribute('identifier');
$aso_info['dc:title'] = utf8_decode($rdf_description->getAttribute('title'));
$aso_info['dc:creator'] = utf8_decode($rdf_description->getAttribute('creator'));
$aso_info['dc:contributor'] = utf8_decode($rdf_description->getAttribute('contributor'));
$aso_info['dc:publisher'] = utf8_decode($rdf_description->getAttribute('publisher'));
$aso_info['dc:type'] = utf8_decode($rdf_description->getAttribute('type'));
$aso_info['dc:format'] = utf8_decode($rdf_description->getAttribute('format'));
if (function_exists('date_default_timezone_set')) {
date_default_timezone_set('Europe/Paris');
}
if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $rdf_description->getAttribute('created'))) {
$aso_info['dcterms:created'] = date('j-m-Y à H:i:s', strtotime($rdf_description->getAttribute('created')));
} else {
$aso_info['dcterms:created'] = $rdf_description->getAttribute('created');
}
$aso_info['dcterms:dateSubmitted'] = utf8_decode($rdf_description->getAttribute('dateSubmitted'));
$aso_info['dcterms:spatial'] = utf8_decode($rdf_description->getAttribute('spatial'));
$aso_info['dcterms:licence'] = utf8_decode($rdf_description->getAttribute('licence'));
$tab_infos[$rdf_description->getAttribute('identifier')] = $aso_info;
}
return $tab_infos;
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.4 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.2 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.1 2007-06-06 13:31:16 ddelon
* v0.09
*
*/
?>
/tags/celw-v1.1/jrest/services/InventoryDateList.php
New file
0,0 → 1,105
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* Liste les date de releves par utilisateur
*
* in=utf8
* out=utf8
*
**/
class InventoryDateList extends Cel {
private $correspondance_fonction = array(1 => 'year', 2 => 'month', 3 => 'day');
/**
* @param int uid[0] : utilisateur obligatoire
* @param int uid[1] : si absent : valeur 'all' (annee)
* @param int uid[2] : si absent : valeur 'all' (mois)
* @param int uid[3] : si absent : valeur 'all' (jour)
*/
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
$condition_requete = $this->traiterParametresEtConstruireRequete($uid);
$requete_liste_dates = 'SELECT DISTINCT '.
'date_observation AS id '.
'FROM cel_obs WHERE '.$condition_requete.' '.
'ORDER BY date_observation';
$liste_dates = $this->executerRequete($requete_liste_dates);
$liste_dates = $this->formaterListeResultats($liste_dates);
$output = json_encode($liste_dates);
print($output);
return true;
}
private function formaterListeResultats($liste_dates) {
if (!$liste_dates) {
$liste_dates = array();
}
foreach($liste_dates as &$date) {
$date_heures = split(' ',$date['id']);
if(count($date_heures) > 1) {
$date = $date_heures[0];
}
$date = $date;
}
return $liste_dates;
}
private function traiterParametresEtConstruireRequete($params) {
$requete_condition = ' ce_utilisateur = '.$this->proteger($params[0]);
$taille_tableau_parametres = count($params);
for($i=1; $i <= $taille_tableau_parametres; $i++) {
if($this->estUnParametreDate($params[$i])) {
$fonction_date = $this->correspondance_fonction[$i];
$requete_condition .= ' AND '.$fonction_date.'(date_observation) = '.$this->proteger($params[$i]);
}
}
return $requete_condition;
}
private function estUnParametreDate($valeur) {
return is_numeric($valeur) && $valeur != "all";
}
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.4 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/InventoryContributionList.php
New file
0,0 → 1,76
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/
*/
 
/**
* Classe renvoyant fragment html constitué à partir d'une liste très succinte des contributions de l'utilisateur
*
*/
class InventoryContributionList extends Cel {
 
function getRessource() {
echo '';
}
 
function getElement($uid){
 
if(!isset($uid[0])) {
echo '';
}
 
$requete_contributions = "SELECT * FROM cel_obs ".
"WHERE ce_utilisateur = ".$this->proteger($uid[0])." ".
"ORDER BY date_modification DESC LIMIT 0,5";
 
$resultat_contributions = $this->requeter($requete_contributions);
$resume = '';
 
if (is_array($resultat_contributions)) {
 
foreach ($resultat_contributions as $ligne) {
$ligne['nom_sel'] = htmlspecialchars($ligne['nom_sel']);
$ligne['ce_utilisateur'] = htmlspecialchars($ligne['ce_utilisateur']);
$ligne['zone_geo'] = htmlspecialchars($ligne['zone_geo']);
$ligne['id_zone_geo'] = htmlspecialchars($this->convertirCodeZoneGeoVersDepartement($ligne['ce_zone_geo']));
$ligne['station'] = htmlspecialchars($ligne['station']);
$ligne['milieu'] = htmlspecialchars($ligne['milieu']);
$ligne['commentaire'] = htmlspecialchars($ligne['commentaire']);
$ligne['transmission'] = htmlspecialchars($ligne['transmission']);
$resume.= '<p>'.$ligne['nom_sel'] ." (".$ligne['nom_sel_nn'].") ".
'Location : '. $ligne['zone_geo']." (".$ligne['id_zone_geo']."),". $ligne['station'] . "," .
$ligne['milieu'] . "," . $ligne['commentaire'] . "," . $ligne['transmission'] .
'</p>';
}
}
 
header("Content-Type: text/html; charset=ISO-8859-1");
print $resume;
exit;
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.5 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.4 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*/
?>
/tags/celw-v1.1/jrest/services/InventoryCheck.php
New file
0,0 → 1,82
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author David Delon <delon@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/
*/
 
/**
*
* Utilitaire mise a jour enregistrement inventaire
* A voir avec David mais ne devrait plus être utilisé
*
*/
class InventoryCheck extends Cel {
 
function getRessource(){
return;
 
$requete_obs ="SELECT id_observation, zone_geo, ce_zone_geo, date_observation, ce_utilisateur, courriel_utilisateur FROM cel_obs";
$resultat_obs = $this->requeter($requete_obs);
$observations = array();
if (is_array($resultat_obs)) {
$observations = $resultat_obs;
}
foreach ($observations as $obs) {
 
if ($obs['ce_zone_geo']!="000null") {
$requete_lieu = "select * from cel_zones_geo where nom = '".mysql_escape_string($obs['zone_geo'])."' and id_zone_geo='".mysql_escape_string($obs['ce_zone_geo'])."' limit 1";
}
else {
$requete_lieu = "select * from cel_zones_geo where name = '".mysql_escape_string($obs['zone_geo'])."' limit 1";
}
$res_loc = $this->requeter($requete_lieu);
if (is_array($res_loc) && count($res_loc) > 0) {
print $obs['id_observation'];
print " ";
print $obs['mail_utilisateur'];
print " : ";
print $obs['zone_geo'];
print " - ";
print $obs['ce_zone_geo'];
print " - ";
$lk="http://www.tela-botanica.org/cel/jrest/util/cel_inventory.php?PME_sys_fl=0&PME_sys_fm=0&PME_sys_sfn[0]=0&PME_sys_operation=PME_op_Change&PME_sys_rec=".$obs['id_observation'];
$link_desc=' <a href="'.$lk.'">Correction</a>';
print $link_desc;
print "<br>";
}
}
}
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.2 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.1 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/InventoryStationList.php
New file
0,0 → 1,113
<?php
// in utf8
// out utf8
 
// List des stations par utilisateur et par commune
 
Class InventoryStationList extends DBAccessor {
 
 
var $config;
function InventoryStationList($config) {
 
$this->config=$config;
}
 
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
// uid[0] : utilisateur obligatoire
// uid[1] : si absent : valeur 'all' (commune)
// uid[2] et uid[3] : selection intervalle
 
$DB=$this->connectDB($this->config,'database_cel');
if (!isset($uid[1]) || $uid[1]=="" || $uid[1]=="all" ) {
$uid[1]="all";
$query_location="";
}
else {
$query_location=" AND location='".$DB->escapeSimple($uid[1])."' ";
}
 
$value=array();
if (isset($uid[3]) && isset($uid[2])) {
// les n � partir de x
$query="SELECT DISTINCT station FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."'" .
$query_location.
" ORDER BY station LIMIT ".$uid[2].",".$uid[3];
}
else {
if (isset($uid[2])) {
$query="SELECT DISTINCT station FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
$query_location.
"ORDER BY station LIMIT ".$uid[2].",18446744073709551615";
}
else {
// le nombre total
$query="SELECT count(DISTINCT station) as count FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
$query_location;
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$value=$row['count'];
}
$output = json_encode((integer)$value);
print($output);
return true;
}
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$value[]=array($row['station']);
}
$output = json_encode($value);
print($output);
return true;
 
 
}
 
 
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
 
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/Inventory.php
New file
0,0 → 1,154
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david@tela-botanica.org>
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* CRUD observation
*
* in=utf8
* out=utf8
*
**/
class Inventory extends Cel {
// TODO;: faire un descriptif du service
function getRessource(){
 
}
 
function getElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$value=array();
 
if(!isset($uid[0])) {
return;
}
$parametres_recherche = array(array('ce_utilisateur',$uid[0]),array('ordre',$uid[1]));
$chercheur_observations = new RechercheObservation($this->config);
$retour_recherche = $chercheur_observations->rechercherObservations($uid[0], $parametres_recherche, 0, 1);
$observation = array();
if(is_array($retour_recherche) && count($retour_recherche) > 0) {
$observation = $retour_recherche[0];
}
$observation = $this->formaterObservationVersTableauSequentiel(&$observation);
$output = json_encode($observation);
header("Content-type: application/json");
print($output);
 
return true;
}
private function formaterObservationVersTableauSequentiel($observation) {
if ($observation['date_observation']!="0000-00-00 00:00:00") {
list($year,$month,$day)= split ('-',$observation['date_observation']);
list($day)= split (' ',$day);
$observation['date_observation']=$day."/".$month."/".$year;
}
 
$observation = array($observation['nom_sel'], $observation['nom_sel_nn'],
$observation['nom_ret'], $observation['nom_ret_nn'],
$observation['nt'], $observation['famille'], $observation['zone_geo'],
$observation['ce_zone_geo'], $observation['ordre'],
$observation['date_observation'], $observation['lieudit'],
$observation['station'], $observation['milieu'],
$observation['commentaire'], $observation['latitude'],
$observation['longitude']);
return $observation;
}
 
function updateElement($uid,$pairs) {
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
if (!isset($uid[1])) {
//TODO: envoyer un message d'erreur
return;
}
$uid[1] = rtrim($uid[1],',');
$gestionnaire_observation = new GestionObservation($this->config);
$modification_observation = $gestionnaire_observation->modifierObservation($uid[0],$uid[1],$pairs);
return true;
}
 
 
function createElement($pairs){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['ce_utilisateur']);
$gestionnaire_observation = new GestionObservation($this->config);
$gestionnaire_observation->ajouterObservation($pairs['ce_utilisateur'], $pairs);
 
return true;
}
 
/**
* Supprime une observation
*
* uid[0] : utilisateur obligatoire
* uid[1] : ordres de l'observation à supprimer
*/
function deleteElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if (!isset($uid[1])) {
//TODO: envoyer un message d'erreur
return;
}
$uid[1] = rtrim($uid[1],',');
$gestionnaire_observation = new GestionObservation($this->config);
$suppression_observation = $gestionnaire_observation->supprimerObservation($uid[0],$uid[1]);
if ($suppression_observation) {
echo "OK";
}
exit() ;
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.11 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.10 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.9 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*/
?>
/tags/celw-v1.1/jrest/services/TestCreationDossier.php
New file
0,0 → 1,20
<?php
class TestCreationDossier {
 
 
var $config;
public function __construct($config) {
$this->config = $config;
}
 
public function getRessource() {
$id_nouvelle_image = 95001;
$format = 'XL';
$manipulateurImage = new ImageRecreation($this->config);
$fichier_stocke = $manipulateurImage->creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id_nouvelle_image, $format);
echo $fichier_stocke;
}
}
?>
/tags/celw-v1.1/jrest/services/include/extract_metadonnee.php
New file
0,0 → 1,481
<?php
/**
Aurelien Peronnet aurelienperonnet@gmail.com 2008
 
Ce logiciel est r?gi par la licence CeCILL soumise au droit fran?ais et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffus?e par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilit? au code source et des droits de copie,
de modification et de redistribution accord?s par cette licence, il n'est
offert aux utilisateurs qu'une garantie limit?e. Pour les m?mes raisons,
seule une responsabilit? restreinte p?se sur l'auteur du programme, le
titulaire des droits patrimoniaux et les conc?dants successifs.
 
A cet ?gard l'attention de l'utilisateur est attir?e sur les risques
associ?s au chargement, ? l'utilisation, ? la modification et/ou au
d?veloppement et ? la reproduction du logiciel par l'utilisateur ?tant
donn? sa sp?cificit? de logiciel libre, qui peut le rendre complexe ?
manipuler et qui le r?serve donc ? des d?veloppeurs et des professionnels
avertis poss?dant des connaissances informatiques approfondies. Les
utilisateurs sont donc invit?s ? charger et tester l'ad?quation du
logiciel ? leurs besoins dans des conditions permettant d'assurer la
s?curit? de leurs syst?mes et ou de leurs donn?es et, plus g?n?ralement,
? l'utiliser et l'exploiter dans les m?mes conditions de s?curit?.
Le fait que vous puissiez acc?der ? cet en-t?te signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accept? les
termes.
*/
 
 
// in : utf8
// out : utf8
/*
* extractmetadonnee.php
*
* Cas d'utilisation :
* exitraire des metadonnees exif et iptc d'une image
*
*/
function extraire_metadonnees($url)
{
$iptc = extraire_iptc($url) ;
$exif = extraire_exif($url) ;
$meta = array_merge($exif,$iptc);
fin_tableau_meta(&$meta) ;
return $meta ;
}
/**
* Extraction des metadonnées exif
**/
function extraire_exif($url)
{
$exif_tab = preparer_tableau_exif() ;
 
$exif = exif_read_data($url,"EXIF,COMPUTED,IFD0,FILE,COMMENT",true,false);
foreach ($exif as $key => $section)
{
foreach ($section as $name => $val)
{
if($name != "MakerNote")
{
construire_tableau_insertion_exif($name, $val ,&$exif_tab) ;
}
}
}
return $exif_tab ;
}
 
/**
* Extraction des metadonnées iptc
**/
function extraire_iptc($url)
{
$iptc_tab = preparer_tableau_iptc() ;
// geimagesize renvoie le infos iptc dans le tableau info
$size = getimagesize($url, $info);
// s'il existe
if (isset($info["APP13"]))
{
// on parse les donnees
$iptc = iptcparse($info["APP13"]);
// et on les analyse
foreach($iptc as $marker => $section)
{
foreach($section as $nom => $val)
{
// pour remplir le tableau de donnees
construire_tableau_insertion_iptc($marker, $val ,&$iptc_tab) ;
}
}
}
return $iptc_tab ;
}
 
// construit le tableau pour la requete avec les metadonnees exif
function construire_tableau_insertion_exif($nom, $val ,$data_tab)
{
switch($nom)
{
case "Height" :
$data_tab['ci_meta_height'] = $val ;
break ;
case "Width" :
$data_tab['ci_meta_width'] = $val ;
break ;
case "Make" :
$data_tab['ci_meta_make'] = $val ;
break ;
case "Model" :
$data_tab['ci_meta_model'] = $val ;
break ;
case "XResolution" :
$data_tab['ci_meta_x_resolution'] = $val ;
break ;
case "YResolution" :
$data_tab['ci_meta_y_resolution'] = $val ;
break ;
case "DateTimeOriginal" :
$data_tab['ci_meta_date_time'] = $val ;
break ;
case "GPS" :
$data_tab['ci_meta_gps'] = $val ;
break ;
case "UserComment" :
$data_tab['ci_meta_user_comment'] = '"'.$val.'"' ;
break ;
case "ExposureTime" :
$data_tab['ci_meta_exif_exposure_time'] = $val ;
break ;
case "FNumber" :
$data_tab['ci_meta_exif_f_number'] = $val ;
break ;
case "ExifVersion" :
$data_tab['ci_meta_exif_exif_version'] = $val ;
break ;
case "CompressedBitsPerPixel" :
$data_tab['ci_meta_exif_compressed_bits_per_pixel'] = $val ;
break ;
case "ShutterSpeedValue" :
$data_tab['ci_meta_exif_shutter_speed_value'] = $val ;
break ;
case "ApertureValue" :
$data_tab['ci_meta_exif_aperture_value'] = $val ;
break ;
case "ExposureBiasValue" :
$data_tab['ci_meta_exif_exposure_bias_value'] = $val ;
break ;
case "MaxApertureValue" :
$data_tab['ci_meta_exif_max_aperture_value'] = $val ;
break ;
case "MeteringMode" :
$data_tab['ci_meta_exif_metering_mode'] = $val ;
break ;
case "LightSource" :
$data_tab['ci_meta_exif_light_source'] = $val ;
break ;
case "Flash" :
$data_tab['ci_meta_exif_flash'] = $val ;
break ;
case "FocalLength" :
$data_tab['ci_meta_exif_focal_length'] = $val ;
break ;
case "FlashpixVersion" :
$data_tab['ci_meta_exif_flash_pix_version'] = $val ;
break ;
case "ColorSpace" :
$data_tab['ci_meta_exif_color_space'] = $val ;
break ;
case "InteroperabilityOffset" :
$data_tab['ci_meta_exif_interoperability_offset'] = $val ;
break ;
case "FocalPlaneXResolution" :
$data_tab['ci_meta_exif_focal_plane_x_resolution'] = $val ;
break ;
case "FocalPlaneYResolution" :
$data_tab['ci_meta_exif_focal_plane_y_resolution'] = $val ;
break ;
case "FocalPlaneResolutionUnit" :
$data_tab['ci_meta_exif_focal_plane_resolution_unit'] = $val ;
break ;
case "SensingMethod" :
$data_tab['ci_meta_exif_sensing_method'] = $val ;
break ;
case "FileSource" :
$data_tab['ci_meta_exif_file_source'] = $val ;
break ;
case "CustomRendered" :
$data_tab['ci_meta_exif_custom_rendered'] = $val ;
break ;
case "ExposureMode" :
$data_tab['ci_meta_exif_exposure_mode'] = $val ;
break ;
case "WhiteBalance" :
$data_tab['ci_meta_exif_white_balance'] = $val ;
break ;
case "DigitalZoomRatio" :
$data_tab['ci_meta_exif_digital_zoom_ratio'] = $val ;
break ;
case "SceneCaptureType" :
$data_tab['ci_meta_exif_scene_capture_type'] = $val ;
break ;
case "GainControl" :
$data_tab['ci_meta_exif_gain_control'] = $val ;
break ;
case "Contrast" :
$data_tab['ci_meta_exif_contrast'] = $val ;
break ;
case "Saturation" :
$data_tab['ci_meta_exif_saturation'] = $val ;
break ;
case "Sharpness" :
$data_tab['ci_meta_exif_sharpness'] = $val ;
break ;
case "SubjectDistanceRange" :
$data_tab['ci_meta_exif_subject_distance_range'] = $val ;
break ;
default :
$data_tab['ci_meta_exif_autres'] .= $nom.":".$val.";" ;
}
}
 
// construit le tableau pour la requete avec les metadonnees iptc
function construire_tableau_insertion_iptc($nom, $val ,$data_tab)
{
switch($nom)
{
// mots cles iptc
case "2#005" :
$data_tab['ci_meta_iptc_category'] = $val ;
break;
case "2#025" :
$data_tab['ci_meta_iptc_mots_cles'] = $val ;
break;
// champ by line
case "2#080" :
$data_tab['ci_meta_iptc_by_line'] = $val ;
break ;
// cahmp by line titre
case "2#085" :
$data_tab['ci_meta_iptc_by_line_title'] = $val ;
break ;
// ville
case "2#090" :
$data_tab['ci_meta_iptc_city'] = $val ;
break ;
// sous location
case "2#092" :
$data_tab['ci_meta_iptc_sub_location'] = $val ;
break ;
// etat (pour les us)
case "2#095" :
$data_tab['ci_meta_iptc_province_state'] = $val ;
break ;
// code pays
case "2#100" :
$data_tab['ci_meta_iptc_country_primary_location_code'] = $val ;
break ;
// code pays
case "2#101" :
$data_tab['ci_meta_iptc_country_name'] = $val ;
break ;
// titre principal
case "2#105" :
$data_tab['ci_meta_iptc_headline'] = $val ;
break ;
// credit
case "2#110" :
$data_tab['ci_meta_iptc_credit'] = $val ;
break ;
// copyright
case "2#116" :
$data_tab['ci_meta_iptc_copyright_notice'] = $val ;
break ;
// contact
case "2#118" :
$data_tab['ci_meta_iptc_contact'] = $val ;
break ;
// autres (pour les champs qu'on ne prend pas en compte)
default :
$data_tab['ci_meta_iptc_autres'] .= $nom.":".$val.";" ;
}
}
 
function preparer_tableau_iptc()
{
$data_tab = array() ;
$data_tab['ci_meta_iptc_category'] = NULL ;
$data_tab['ci_meta_iptc_mots_cles'] = NULL ;
$data_tab['ci_meta_iptc_by_line'] = NULL ;
$data_tab['ci_meta_iptc_by_line_title'] = NULL ;
$data_tab['ci_meta_iptc_city'] = NULL ;
$data_tab['ci_meta_iptc_sub_location'] = NULL ;
$data_tab['ci_meta_iptc_province_state'] = NULL ;
$data_tab['ci_meta_iptc_country_primary_location_code'] = NULL ;
$data_tab['ci_meta_iptc_country_name'] = NULL ;
$data_tab['ci_meta_iptc_headline'] = NULL ;
$data_tab['ci_meta_iptc_credit'] = NULL ;
$data_tab['ci_meta_iptc_copyright_notice'] = NULL ;
$data_tab['ci_meta_iptc_contact'] = NULL ;
$data_tab['ci_meta_iptc_autres'] .= " " ;
 
return $data_tab ;
}
 
 
function preparer_tableau_exif()
{
$data_tab = array() ;
$data_tab['ci_meta_height'] = 0 ;
$data_tab['ci_meta_width'] = 0 ;
$data_tab['ci_meta_make'] = NULL ;
$data_tab['ci_meta_model'] = NULL ;
$data_tab['ci_meta_x_resolution'] = NULL ;
$data_tab['ci_meta_y_resolution'] = NULL ;
$data_tab['ci_meta_date_time'] = NULL ;
$data_tab['ci_meta_gps'] = NULL ;
 
$data_tab['ci_meta_user_comment'] = NULL ;
 
$data_tab['ci_meta_exif_exposure_time'] = NULL ;
 
$data_tab['ci_meta_exif_f_number'] = NULL ;
 
$data_tab['ci_meta_exif_exif_version'] = NULL ;
 
$data_tab['ci_meta_exif_compressed_bits_per_pixel'] = NULL ;
 
$data_tab['ci_meta_exif_shutter_speed_value'] = NULL ;
 
$data_tab['ci_meta_exif_aperture_value'] = NULL ;
 
$data_tab['ci_meta_exif_exposure_bias_value'] = NULL ;
 
$data_tab['ci_meta_exif_max_aperture_value'] = NULL ;
 
$data_tab['ci_meta_exif_metering_mode'] = NULL ;
 
$data_tab['ci_meta_exif_flash'] = NULL ;
$data_tab['ci_meta_exif_light_source'] = NULL ;
 
$data_tab['ci_meta_exif_focal_length'] = NULL ;
 
$data_tab['ci_meta_exif_flash_pix_version'] = NULL ;
 
$data_tab['ci_meta_exif_color_space'] = NULL ;
 
$data_tab['ci_meta_exif_interoperability_offset'] = NULL ;
 
$data_tab['ci_meta_exif_focal_plane_x_resolution'] = NULL ;
 
$data_tab['ci_meta_exif_focal_plane_y_resolution'] = NULL ;
 
$data_tab['ci_meta_exif_focal_plane_resolution_unit'] = NULL ;
 
$data_tab['ci_meta_exif_sensing_method'] = NULL ;
 
$data_tab['ci_meta_exif_file_source'] = NULL ;
$data_tab['ci_meta_exif_custom_rendered'] = NULL ;
 
$data_tab['ci_meta_exif_exposure_mode'] = NULL ;
 
$data_tab['ci_meta_exif_white_balance'] = NULL ;
 
$data_tab['ci_meta_exif_digital_zoom_ratio'] = NULL ;
 
$data_tab['ci_meta_exif_scene_capture_type'] = NULL ;
 
$data_tab['ci_meta_exif_gain_control'] = NULL ;
 
$data_tab['ci_meta_exif_contrast'] = NULL ;
$data_tab['ci_meta_exif_saturation'] = NULL ;
 
$data_tab['ci_meta_exif_sharpness'] = NULL ;
 
$data_tab['ci_meta_exif_subject_distance_range'] = NULL ;
 
$data_tab['ci_meta_exif_autres'] .= " " ;
return $data_tab ;
}
 
function fin_tableau_meta($tab)
{
$tab['ci_meta_exif_autres'] .= " " ;
$tab['ci_meta_iptc_autres'] .= " " ;
$tab['ci_nom_original'] = NULL ;
$tab['ci_md5'] = NULL ;
}
?>
/tags/celw-v1.1/jrest/services/NameParser.php
New file
0,0 → 1,375
<?php
 
/**
* Taxamatch-Webservice PHP v1.0.0
* @author Michael Giddens
* @link http://www.silverbiology.com
*/
 
/* Adapation par David Delon Decembre 2010 : gestion sous espece
*/
 
 
/**
* Class NameParser
* Used to convert a string to a standarized format.
*/
class NameParser {
 
/**
* Whether to debug or nor
* @var bool|integer
*/
public $debug_flag;
 
 
 
/**
* Constructor
*/
public function __construct( ) {
}
 
/**
* Sets value to the method property
* @param mixed $name class property name
* @param mixed $value class property value
*/
public function set($name,$value) {
$this->$name = $value;
}
 
 
/**
* Reduce Spaces
* This will reduce the string to only allow once space between characters
* @param string $str : string to reduce space
* @return string : string with only once space between characters
*/
private function reduce_spaces( $str ) {
$str = preg_replace("/ {2,}/", ' ', $str );
$str = trim( $str );
return( $str );
}
 
 
/**
* Function: parse_auth
* Purpose: Produce a parsed version of authority of a taxon name
* @author Tony Rees (Tony.Rees@csiro.au)
* Date created: March 2008
* Inputs: authority string as str
* Remarks:
* (1) Performs authority expension of known abbreviated authornames using
* table "auth_abbrev_test1" (must be available and populated with relevant content)
* (2) Recognises "and", "et", "&" as equivalents (special case for "et al.") - all parsed to ampersand
* (3) Recognises (e.g.) "Smith 1980" and "Smith, 1980" as equivalents - comma is removed in these cases
* (4) Recognises (e.g.) "F. J. R. Taylor, 1980" and "F.J.R. Taylor, 1980" as equivalents -
* extra space after full stops is ignored in these cases
* (5) Returns uppercase string, diacritical marks intact
*
* @param string $str : authority string
* @param integer $upcase : convert to uppercase if $upcase = 1
* @return string : parsed author string
*/
public function parse_auth( $str, $upcase=1 ) {
 
$this->debug['parse_auth'][] = "1";
$temp = $str = trim($str);
if ( ($str == NULL) || ($str == '') ) {
$this->debug['parse_auth'][] = "1a";
return '';
}
 
if ( ( $temp == null ) || ( $temp == '') ) {
$this->debug['parse_auth'][] = "2a";
return('');
} else {
 
$this->debug['parse_auth'][] = "2b";
// add space after full stops, except at end (NB, will also add spece before some close brackets)
$temp = rtrim( str_replace('.', '. ', $temp) );
$this->debug['parse_auth'][] = "4 (temp:$temp)";
//normalise "et", "and" to ampersand (et al. is a special case)
// if ( $temp like '% et al%' ) {
if ( ereg(' et al', $temp) ) {
$temp = str_replace(' et al','zzzzz', $temp);
$this->debug['parse_auth'][] = "4a (temp:$temp)";
}
// $temp = str_replace(temp,' et ',' '||'&'||' ');
// $temp = replace(temp,' and ',' '||'&'||' ');
$temp = str_replace(' et ',' & ', $temp );
$temp = str_replace(' and ',' & ', $temp );
// if ( $temp like '%zzzzz%' ) {
// if ( ereg('zzzzz', $temp) ) {
$temp = str_replace('zzzzz',' et al', $temp);
// }
 
$this->debug['parse_auth'][] = "5 (temp:$temp)";
//remove commas before dates (only)
// like '%, 17%'
if ( ereg(', 17', $temp) ) {
$temp = str_replace(', 17',' 17', $temp);
$this->debug['parse_auth'][] = "5a (temp:$temp)";
}
// like '%, 18%'
if ( ereg(', 18', $temp) ) {
$temp = str_replace(', 18',' 18', $temp);
$this->debug['parse_auth'][] = "5b (temp:$temp)";
}
// like '%, 19%'
if ( ereg(', 19', $temp) ) {
$temp = str_replace(', 19',' 19', $temp);
$this->debug['parse_auth'][] = "5c (temp:$temp)";
}
// like '%, 20%'
if ( ereg(', 20', $temp) ) {
$temp = str_replace(', 20',' 20', $temp);
$this->debug['parse_auth'][] = "5d (temp:$temp)";
}
// reduce multiple internal spaces to single space
$temp = $this->reduce_spaces( $temp );
// like '% -%'
$temp = str_replace(' -', '-', $temp);
 
$this->debug['parse_auth'][] = "6 (temp:$temp)";
foreach( explode(' ', $temp) as $this_word ) {
$this->debug['parse_auth'][] = "7 (this_word:$this_word)";
// like '(%'
if ( ereg('^\(', $this_word) ) {
$elapsed_chars .= '(';
$this_word = substr( $this_word, 1 );
$this->debug['parse_auth'][] = "7a (this_word:$this_word) (elapsed_chars:$elapsed_chars)";
}
 
// Add back the word to the final translation
$elapsed_chars .= $this_word . ' ';
$this->debug['parse_auth'][] = "7c (this_word:$this_word) (elapsed_chars:$elapsed_chars)";
}
$elapsed_chars = $this->reduce_spaces( str_replace(' )', ')', $elapsed_chars) );
return trim( $elapsed_chars ) ;
}
 
}
/**
* Function: parse
* Purpose: Produces parsed version of an input string (scientific name components)
* @author Tony Rees (Tony.Rees@csiro.au)
* Date created: June 2007-November 2008
* Inputs: input string as str (this version presumes genus, genus+species, or
* genus+species+authority)
* Outputs: parsed version of input string, for match purposes
* Remarks:
* (1) Removes known text elements e.g.
* 'aff.', 'cf.', 'subsp.', subgenera if enclosed in brackets, etc. as desired
* (2) Removes accented and non A-Z characters other than full stops
* (in scientific name portions)
* (3) Returns uppercase scientific name (genus + species only)
* plus unaltered (presumed) authority
* examples;
* Anabaena cf. flos-aquae Ralfs ex Born. et Flah. => ANABAENA FLOSAQUAE Ralfs
* ex Born. et Flah.
* Abisara lemÈe-pauli => ABISARA LEMEEPAULI
* Fuc/us Vesiculos2us => FUCUS VESICULOSUS
* Buffo ignicolor LacÈpËde, 1788 => BUFFO IGNICOLOR LacÈpËde, 1788
* Barbatia (Mesocibota) bistrigata (Dunker, 1866) => BARBATIA BISTRIGATA (Dunker, 1866)
* (4) Thus version does not handle genus+author, or genus+species+infraspecies
* (second" good" term is presumed to be species epithet, anything after is
* considered to be start of the authority), however could be adapted further as required
* and actually it was done in this version for Tela Botanica
* (5) There is a separate function "parse_auth" for normalizing authorities when required
* (e.g. for authority comparisons)
*
* @param string $str : input string ( genus, genus+species, or genus+species+authority )
* @return string : parsed string
*/
public function parse( $str = NULL ) {
unset($this->debug['parse']);
 
 
$temp = '';
$first_str_part = NULL;
$second_str_part = NULL;
$temp_genus = '';
$temp_species = '';
$temp_genus_species = '';
$temp_authority = '';
$temp_infra = '';
$this->debug['parse'][] = "1";
 
if ( ($str == NULL) || ( trim($str) == '') ) {
$this->debug[] = "N1a<br>";
return '';
} else {
// trim any leading, trailing spaces or line feeds
$temp = trim( $str );
$this->debug['parse'][] = "1b";
}
 
if ( $temp == NULL || $temp == '') {
$this->debug['parse'][] = "2a";
return '';
} else {
$this->debug['parse'][] = "2b";
 
// replace any HTML ampersands
$set = array('%', '&', 'amp;%', 'AMP;%');
$temp = str_replace( $set, '&', $temp );
 
$this->debug['parse'][] = "2b1 (temp:$temp)";
 
// remove any content in angle brackets (e.g. html tags - <i>, </i>, etc.)
$html_pattern = "(\<(/?[^\>]+)\>)";
//? This should not just handle html tags but all <*>
$temp = preg_replace( $html_pattern, '', $temp);
$this->debug['parse'][] = "2b2 (temp:$temp)";
 
// if second term (only) is in round brackets, presume it is a subgenus or a comment and remove it
// examples: Barbatia (Mesocibota) bistrigata (Dunker, 1866) => Barbatia bistrigata (Dunker, 1866)
// Barbatia (?) bistrigata (Dunker, 1866) => Barbatia bistrigata (Dunker, 1866)
// (obviously this will not suit genus + author alone, where first part of authorname is in brackets,
// however this is very rare?? and in any case we are not supporting genus+authority in this version)
//if ( $temp like '% (%)%'
$temp = preg_replace( "/ \(\w*\W*\)/", '', $temp, 1 );
//? Not sure if this will catch if
$this->debug['parse'][] = "2b3 (temp:$temp)";
 
// if second term (only) is in square brackets, presume it is a comment and remove it
// example: Aphis [?] ficus Theobald, [1918] => Aphis ficus Theobald, [1918]
//if ( $temp like '% [%]%'
$temp = preg_replace( "/ \[\w*\W*\]/", '', $temp, 1 );
//? Not sure if this will catch if
$this->debug['parse'][] = "2b4 (temp:$temp)";
 
// drop indicators of questionable id's - presume all are lowercase for now (could extend as needed)
$temp = preg_replace( "/ cf /", " ", $temp );
$temp = preg_replace( "/ cf\. /", " ", $temp );
$temp = preg_replace( "/ near /", " ", $temp );
$temp = preg_replace( "/ aff\. /", " ", $temp );
$temp = preg_replace( "/ sp\. /", " ", $temp );
$temp = preg_replace( "/ spp\. /", " ", $temp );
$temp = preg_replace( "/ spp /", " ", $temp );
 
$this->debug['parse'][] = "2b5 (temp:$temp)";
 
// eliminate or close up any stray spaces introduced by the above
$temp = $this->reduce_spaces( $temp );
 
$this->debug['parse'][] = "2b6 (temp:$temp)";
 
// now presume first element is genus, second (if present) is species, remainder
// (if present) is authority
// look for genus name
$ar = explode( " ", $temp, 2);
if ( count( $ar ) ) {
$temp_genus = $ar[0];
$temp = @$ar[1];
} else {
$temp_genus = $temp;
$temp = '';
}
$this->debug['parse'][] = "2b7 (temp_genus:$temp_genus) (temp:$temp)";
 
// look for species epithet and authority
$ar = explode( " ", $temp, 2);
if ( count( $ar ) ) {
$temp_species = $ar[0];
$temp_authority = @$ar[1];
} else {
$temp_species = $temp;
$temp_authority = '';
}
// look for subspecies
 
$infras =array('subsp.','var.');
 
$temp_authority = preg_replace( "/ssp./", "subsp.", $temp_authority);
$temp_authority = preg_replace( "/ssp /", "subsp.", $temp_authority);
$temp_authority = preg_replace( "/subsp /", "subsp.", $temp_authority);
$temp_authority = preg_replace( "/var /", "var.", $temp_authority);
 
foreach ($infras as $infra) {
$pos = strpos($temp_authority, $infra);
if ($pos === false) {
continue;
}
else {
$temp_infra=substr($temp_authority,$pos+strlen($infra));
$temp_authority=substr($temp_authority,0,$pos);
$temp_infra=trim($temp_infra);
$temp_infra_type=$infra;
// look for infra epithet and authority
$ar = explode(" ", $temp_infra, 2);
if ( count( $ar ) ) {
$temp_infra = $ar[0];
$temp_infra_authority = @$ar[1];
}
break; // on s'arrete au premier trouve
}
}
 
$this->debug['parse'][] = "2b8 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)";
 
 
// replace selected ligatures here (Genus names can contain Æ, OE ligature)
$temp_genus = str_replace( 'Æ', 'AE', $temp_genus);
$temp_species = str_replace( 'Æ', 'AE', $temp_species);
$temp_infra = str_replace( 'Æ', 'AE', $temp_infra );
 
$this->debug['parse'][] = "2b9 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)";
 
$temp_genus= trim($temp_genus);
$temp_species= trim($temp_species);
$temp_infra= trim($temp_infra );
 
// reduce any new multiple internal spaces to single space, if present
$temp_genus= $this->reduce_spaces( $temp_genus );
$temp_species= $this->reduce_spaces( $temp_species );
$temp_infra= $this->reduce_spaces( $temp_infra );
 
$this->debug['parse'][] = "2b10 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)";
 
if (isset($temp_authority) && ($temp_authority!='') ) {
$temp_authority=$this->parse_auth($temp_authority);
}
 
if (isset($temp_infra_authority) && ($temp_infra_authority!='') ) {
$temp_infra_authority=$this->parse_auth($temp_infra_authority);
}
 
 
$this->debug['parse'][] = "2b11 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)";
 
return array("genus"=>$temp_genus, "species"=>$temp_species, "authority"=>$temp_authority, "infra"=>$temp_infra, "infra_authority"=>$temp_infra_authority, "infra_type"=>$temp_infra_type);
}
} // End NameParser
 
} // End Class
 
?>
/tags/celw-v1.1/jrest/services/TestNameParser.php
New file
0,0 → 1,123
<?php
require_once('NameParser.php');
$parse = new NameParser();
 
$str=array();
$str[]='Paris quadrifolia L.';
$str[]='Phyteuma spicatum L.';
$str[]='Pinus sylvestris L.';
$str[]='Polygonatum multiflorum (L.) All.';
$str[]='Polygonatum multiflorum (L.) All.';
$str[]='Potentilla sterilis (L.) Garcke';
$str[]='Potentilla sterilis (L.) Garcke';
$str[]='Primula elatior (L.) Hill';
$str[]='Primula elatior (L.) Hill';
$str[]='Ranunculus ficaria L.';
$str[]='Ranunculus ficaria L.';
$str[]='Ranunculus ficaria L.';
$str[]='Ranunculus ficaria L.';
$str[]='Salvia pratensis L.';
$str[]='Sanguisorba officinalis L.';
$str[]='Sanicula europaea L.';
$str[]='Scrophularia nodosa L.';
$str[]='Securigera varia (L.) P. Lassen';
$str[]='Silene latifolia Poiret';
$str[]='Sonchus asper (L.) Hill';
$str[]='Stachys recta L.';
$str[]='Stachys sylvatica L.';
$str[]='Stellaria holostea L.';
$str[]='Symphytum officinale L.';
$str[]='Symphytum officinale L.';
$str[]='Teucrium scorodonia L.';
$str[]='Tilia platyphyllos Scop.';
$str[]='Tussilago farfara L.';
$str[]='Urtica dioica L.';
$str[]='Urtica dioica L.';
$str[]='Urtica dioica L.';
$str[]='Vaccinium myrtillus L.';
$str[]='Valeriana officinalis subsp. repens (Host) O. Bolòs and Vigo';
$str[]='Valeriana officinalis subsp. repens (Host) O. Bolòs & Vigo';
$str[]='Viburnum lantana L.';
$str[]='Viburnum opulus L.';
$str[]='Viola reichenbachiana Jordan ex Boreau';
$str[]='Viscum album L.';
$str[]='Aegopodium podagraria L.';
$str[]='Ajuga reptans L.';
$str[]='Alisma plantago-aquatica L.';
$str[]='Alliaria petiolata (M. Bieb.) Cavara & Grande';
$str[]='Alnus glutinosa (L.) Gaertn.';
$str[]='Bidens frondosa L.';
$str[]='Bidens tripartita L.';
$str[]='Callitriche palustris L.';
$str[]='Campanula trachelium L.';
$str[]='Carex brizoides L.';
$str[]='Carex vesicaria L.';
$str[]='Circaea lutetiana L.';
$str[]='Dryopteris filix-mas (L.) Schott';
$str[]='Elatine hexandra (Lapierre) DC.';
$str[]='Fragaria vesca L.';
$str[]='Glechoma hederacea L.';
$str[]='Glyceria fluitans (L.) R. Br.';
$str[]='Gnaphalium uliginosum L.';
$str[]='Iris pseudacorus L.';
$str[]='Lathyrus pratensis L.';
$str[]='Lemna minor L.';
$str[]='Leucanthemum vulgare Lam.';
$str[]='Lotus pedunculatus Cav.';
$str[]='Lycopus europaeus L.';
$str[]='Lysimachia nemorum L.';
$str[]='Lythrum portula (L.) D.A. Webb';
$str[]='Lythrum salicaria L.';
$str[]='Milium effusum L.';
$str[]='Oxalis acetosella L.';
$str[]='Phalaris arundinacea L.';
$str[]='Phyteuma spicatum L.';
$str[]='Potamogeton natans L.';
$str[]='Primula elatior (L.) Hill';
$str[]='Ranunculus flammula L.';
$str[]='Ranunculus sceleratus L.';
$str[]='Sagittaria sagittifolia L.';
$str[]='Scrophularia nodosa L.';
$str[]='Silene dioica (L.) Clairv.';
$str[]='Sparganium emersum Rehmann';
$str[]='Sparganium erectum L.';
$str[]='Valeriana officinalis L. subsp. tenuifolia Schübler & Martens';
$str[]='Veronica montana L.';
$str[]='Vinca minor L.';
$str[]='Acer campestre L.';
$str[]='Acer campestre L.';
$str[]='Achillea millefolium L.';
$str[]='Achillea millefolium L.';
$str[]='Achillea ptarmica L.';
$str[]='Achillea ptarmica L.';
$str[]='Achillea ptarmica L.';
 
foreach ($str as $st) {
$data = $parse->parse($st);
print 'nom : ';
print $st;
print ', genus : ';
print $data['genus'];
print ', species : ';
print $data['species'];
print ', authority : ';
print $data['authority'];
if (isset ($data['infra']) && $data['infra']!='') {
print ', infra : ';
print $data['infra'];
}
if (isset ($data['infra_authority']) && $data['infra_authority']!='') {
print ', infra authority : ';
print $data['infra_authority'];
}
if (isset ($data['infra_type']) && $data['infra_type']!='') {
print ', infra type : ';
print $data['infra_type'];
}
print "</br>";
}
 
?>
/tags/celw-v1.1/jrest/services/InventoryKeyWordList.php
New file
0,0 → 1,394
<?php
// declare(encoding='UTF-8');
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* Service de recherche et modification de l'arbre des mots clés associés à un id.
* 1: Le service recoit un mot clé à ajouter à l'arbre
* 2: Le service recherche l'arbre ou sous arbre correspondant au critères demandé
* 3: Le service renvoie l'arbre au format json
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
*
* @author Aurélien 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>
* @version $Id$
* @copyright © 2011, Tela-Botanica
*/
class InventoryKeyWordList extends Cel {
 
protected $suffix = '';
 
public function getElement($uid) {
// Controle detournement utilisateur
session_start();
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1] ;
$this->controleUtilisateur($uid[1]);
$requete = 'SELECT mot_cle, id_mot_cle_utilisateur, ce_mot_cle_utilisateur_parent '.
'FROM cel_mots_cles'.$this->suffix.' '.
'WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' '.
'ORDER BY niveau ';
$resultats_mots_cles = $this->requeter($requete);
if (is_array($resultats_mots_cles)) {
$mots_cles = array();
foreach($resultats_mots_cles as $mot_cle) {
$mots_cles[] = $mot_cle;
}
$infos = json_encode($mots_cles);
header('content-type: application/json');
print $infos;
exit();
}
}
 
public function updateElement($uid, $pairs) {
session_start();
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1];
$this->controleUtilisateur($uid[1]);
 
$id_mot_cle = $pairs['id'];
$action = $pairs['action'];
 
if ($action == 'modification') {
$nouveau_nom = $pairs['motcle'];
$nouvel_id_general = md5(strtolower($nouveau_nom));
 
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET mot_cle = '.$this->proteger($nouveau_nom).' , '.
' md5 = '.$this->proteger($nouvel_id_general).' '.
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur) ;
$reussite = $this->executer($requete);
if ($reussite) {
echo 'OK';
}
} else if ($action == 'deplacement') {
$this->commencerTransaction();
$transaction_reussie_1 = true;
$id_pere = $pairs['parent'];
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
$bg = $bornes['bg'];
$bd = $bornes['bd'];
$niveau = $bornes['niveau'];
 
// on inverse l'intervalle de l'élément déplacé et du sous arbre
$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur);
 
$bg_negative = $bg - $bd - 1;
$bd_negative = $bd - $bd - 1;
 
// on recalcule les intervalles de l'arbre privé de ce sous arbre
$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur);
 
$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur);
$bg_pere = $bornes_pere['bg'];
$bd_pere = $bornes_pere['bd'];
 
$niveau_pere = $bornes_pere['niveau'];
 
$decalage = $bd - $bg + 1;
 
// on decale les bornes droite du pere pour préparer l'insertion
$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur);
$nouvelle_bd = $bd_pere + $decalage;
$modif_niveau = $niveau_pere - $niveau + 1;
 
$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur);
$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur);
 
if ($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6) {
$this->completerTransaction();
} else {
$this->annulerTransaction();
}
 
}
}
 
public function createElement($pairs) {
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['ce_utilisateur']);
 
$this->suffix = '_'.$pairs['mode'];
$id_utilisateur = $pairs['ce_utilisateur'];
$mot_cle = $pairs['motcle'];
 
// TODO supprimer accents
$id_mot_cle_general = md5(mb_strtolower($mot_cle));
$id_mot_cle = $pairs['id'];
$id_parent = $pairs['parent'];
 
$this->ajouterMotCleRacine($id_utilisateur);
 
$this->commencerTransaction();
 
$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
$borne_pere = $bornes['bd'];
$niveau = $bornes['niveau'] + 1;
$bg = $bornes['bd'];
$bd = $bg + 1;
 
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '.
'VALUES ( '.
$this->proteger($id_mot_cle).', '.
$this->proteger($id_utilisateur).', '.
$this->proteger($mot_cle).', '.
$this->proteger($id_mot_cle_general).', '.
$this->proteger($bg).', '.
$this->proteger($bd).', '.
$this->proteger($niveau).', '.
$this->proteger($id_parent).') ' ;
$transaction_reussie_2 = $this->executer($requete);
 
if ($transaction_reussie_1 && $transaction_reussie_2) {
$this->completerTransaction();
echo 'OK';
} else {
$this->annulerTransaction();
}
}
 
public function deleteElement($uid) {
session_start();
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1];
$id_mot_cle = $uid[2];
 
$this->controleUtilisateur($id_utilisateur);
$this->commencerTransaction();
 
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
$bg = $bornes['bg'];
$bd = $bornes['bd'];
 
$requete = 'DELETE FROM cel_mots_cles'.$this->suffix.' '.
'WHERE bg >= '.$this->proteger($bg).' '.
' AND bd <= '.$this->proteger($bd).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$transaction_reussie_1 = $this->executer($requete);
$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
 
if ($transaction_reussie_1 && $transaction_reussie_2) {
$this->completerTransaction();
} else {
$this->annulerTransaction();
}
}
private function ajouterMotCleRacine($id) {
$requete = 'SELECT COUNT(*) as nb_mc '.
'FROM cel_mots_cles'.$this->suffix.' '.
'WHERE ce_utilisateur = '.$this->proteger($id).' ';
$resultat = $this->requeter($requete);
 
if (is_array($resultat) && count($resultat) > 0) {
$valeurs = $resultat[0]['nb_mc'];
 
switch ($this->suffix) {
case '_obs' :
$nom_racine = 'Projets';
$id_racine = 'racine_obs';
break;
case '_images' :
$nom_racine = 'Mots clés';
$id_racine = 'racine';
break;
default:
$nom_racine = $this->suffix;
$id_racine = $this->suffix;
}
 
if ($valeurs == 0) {
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '.
'VALUES ("'.$nom_racine.'", 1, 2, "'.$id_racine.'", "'.$id_racine.'", '.$this->proteger($id).', "", 0) ';
$this->executer($requete);
}
}
}
 
/**
* Désactive l'auto-commit puis débute la transaction
*/
private function commencerTransaction() {
// Désactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 0 ';
$reussite_autocommit = $this->executer($requete);
 
// Débute une nouvelle transaction
$requete = 'BEGIN ';
$reussite_begin = $this->executer($requete);
}
 
/**
* Termine la transaction puis réactive l'auto-commit
*/
private function completerTransaction() {
// Complète la transaction
$requete = 'COMMIT ';
$reussite_commit = $this->executer($requete);
 
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = $this->executer($requete);
 
echo 'OK';
}
/**
* Annule la transaction et réactive l'auto-commit
*/
private function annulerTransaction() {
// Annule la transaction
$requete = 'ROLLBACK ';
$reussite_rollback = $this->executer($requete);
 
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = $this->executer($requete);
 
echo 'ERROR';
}
 
/**
* Renvoie les bornes d'un noeud de l'arbre des mots clés
*/
private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) {
$requete = 'SELECT bd, bg, niveau '.
'FROM cel_mots_cles'.$this->suffix.' '.
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$resultat = $this->requeter($requete);
if(is_array($resultat) && count($resultat) > 0) {
$valeurs = $resultat[0];
}
return $valeurs;
}
 
/**
* Décale les bornes de deux pour insérer un nouvel élément
*/
private function decalerBornesPlusDeux($valeur, $id_utilisateur) {
// Décalage borne droite
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bd = bd + 2 WHERE bd >= '.$this->proteger($valeur).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$reussi_1 = $this->executer($requete);
// Décalage borne gauche
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bg = bg + 2 '.
'WHERE bg >= '.$this->proteger($valeur).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$reussi_2 = $this->executer($requete);
return $reussi_1 && $reussi_2;
}
 
/**
* Décale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre).
*/
private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) {
$decalage = $bd - $bg + 1;
 
// Décalage borne droite
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bd = bd - '.$this->proteger($decalage).' '.
'WHERE bd >= '.$this->proteger($bg).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$reussi_1 = $this->executer($requete);
 
// Décalage borne gauche
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bg = bg - '.$this->proteger($decalage).' '.
'WHERE bg > '.$this->proteger($bg).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$reussi_2 = $this->executer($requete);
return $reussi_1 && $reussi_2;
}
 
/**
* Décale à droite des bornes donées d'un intervalle positif donne (pour l'ajout d'un sous arbre).
*/
private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) {
$decalage = $largeur;
 
// decalage borne droite
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bd = bd + '.$this->proteger($decalage).' '.
'WHERE bd >= '.$this->proteger($valeur_bornes).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$reussi_1 = $this->executer($requete);
 
// decalage borne gauche
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bg = bg + '.$this->proteger($decalage).' '.
'WHERE bg >= '.$this->proteger($valeur_bornes).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
$reussi_2 = $this->executer($requete);
 
return $reussi_1 && $reussi_2;
}
 
/**
* Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie.
*/
private function exclureIntervalle($bg, $bd, $id_utilisateur) {
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bd = bd - '.$this->proteger($bd).' - 1 , '.
' bg = bg - '.$this->proteger($bd).' - 1 '.
'WHERE bd <= '.$this->proteger($bd).' '.
' AND bg >= '.$this->proteger($bg).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
 
return $this->executer($requete);
}
 
/**
* Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place.
* Décalage borne droite
*/
private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) {
 
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET bg = bg + '.$this->proteger($decalage).' , '.
' bd = bd + '.$this->proteger($decalage).', '.
' niveau = niveau + '.$modif_niveau.' '.
' WHERE bg >= '.$this->proteger($bg).' '.
' AND bd <= '.$this->proteger($bd).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
 
return $this->executer($requete);
}
 
private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) {
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '.
'SET ce_mot_cle_utilisateur_parent = '.$this->proteger($id_pere).' '.
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '.
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' ';
return $this->executer($requete);
}
}
?>
/tags/celw-v1.1/jrest/services/LocationSearch.php
New file
0,0 → 1,98
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* Classe gérant la completion des noms de lieux
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author David Delon <david.delon@clapas.net>
* @author Aurélien 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>
* @version $Id$
* @copyright © 2010, David Delon
*/
 
/**
* Cas d'utilisation :
* Service completion nom de commune (plus tard de lieu en général)
*
* 1 : L'application recoit un debut de nom de lieu
* 2 : Si la longueur du prefixe est > 2, l'application retourne les 50 premieres lieux
* commencant par ce prefixe
**/
class LocationSearch extends Cel {
 
function getElement($uid){
 
$retour = array();
if (isset($uid[0])) {
$retour = $this->executerRequeteLieu($uid[0]);
}
$output = json_encode($retour);
header("content-type: application/json");
print($output);
}
 
function getRessource(){
print "[]";
return;
}
private function executerRequeteLieu($lieu) {
$lieu = $this->formaterChaineLieuPourRequete($lieu);
$retour = array();
if ($this->estUneChaineRequeteValide($lieu)) {
$requete_information_lieu = 'SELECT DISTINCT nom, code '.
'FROM cel_zones_geo '.
'WHERE '.
'nom LIKE '.$this->proteger($lieu.'%').' '.
'ORDER BY nom LIMIT 50';
$liste_lieux = $this->requeter($requete_information_lieu);
if($liste_lieux) {
foreach($liste_lieux as $lieu) {
$retour[] = $this->formaterLigneResultat($lieu);
}
}
}
return $retour;
}
private function formaterChaineLieuPourRequete($params) {
$lieu = $params;
$lieu=ltrim($lieu);
$lieu=ereg_replace('\*+','%',$lieu);
return $lieu;
}
private function estUneChaineRequeteValide($lieu) {
return (strlen($lieu) > 0) && ($lieu != '%');
}
private function formaterLigneResultat($ligne) {
return array($ligne['nom']." (".sprintf("%02s",$ligne['code']).")",$ligne['code']);
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.4 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.3 2007-05-21 18:13:03 ddelon
* Correction bug recherche commune du type "la canourgue"
*
*
*/
?>
/tags/celw-v1.1/jrest/services/Resume.php
New file
0,0 → 1,131
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package papyrus_bp
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/papyrus_bp/
*/
 
/**
* Classe renvoyant un petit bout de json contenant les dernières obs publiques d'un utilisateur
* Utilisée par l'annuaire appelant les web services résumé de chaque application
*
*/
class Resume extends Cel {
 
function getElement($uid){
 
$requete_dernieres_obs = 'SELECT * FROM cel_obs'.
' WHERE ce_utilisateur = '.$this->proteger($uid[1]).
' AND transmission = 0'.
' ORDER BY date_modification DESC LIMIT 0,5';
 
$resultat_dernieres_obs = $this->requeter($requete_dernieres_obs);
$dernieres_obs = array();
$resume = array();
 
if (is_array($resultat_dernieres_obs)) {
$dernieres_obs = $resultat_dernieres_obs;
}
 
$resume['titre'] = 'Vos dernières observations publiées';
$resume['lien_appli'] = '<a href="www.tela-botanica.org/appli:cel2"> Accéder au carnet en ligne </a>';
 
if (count($dernieres_obs) == 0) {
$resume['message'] = 'Aucune observation saisie pour le moment';
}
 
foreach ($dernieres_obs as $obs) {
 
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
 
$date = 'Datée du '.$obs['date_modification'].'<br/>' ;
$lieu = 'Lieu : '.trim($obs['zone_geo'],'000null').' ('.$this->convertirCodeZoneGeoVersDepartement(trim($obs['ce_zone_geo']),'000null').') '.trim($obs['station'],'000null').' '.trim($obs['lieudit'],'000null').'<br/>' ;
 
$image ='';
$cible_lien = '';
$req_liaison = 'SELECT * FROM cel_images WHERE id_image IN (SELECT id_image FROM cel_obs_images WHERE id_observation = "'.$obs['id_observation'].'") AND ce_utilisateur = "'.$obs['ce_utilisateur'].'"' ;
$res_liaison = $this->requeter($req_liaison);
 
$ligne_image = null;
foreach ($res_liaison as $img) {
$row = $img;
}
 
if($row != null) {
$row['nom_original'] = htmlspecialchars($row['nom_original']);
$row['id_image'] = htmlspecialchars($row['id_image']);
$id = $row['id_image'];
$tailleXY = $this->calculerDimensions(array($row['largeur'], $row['hauteur']));
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
$id_fichier = $id.".jpg" ;
$niveauDossier = split("_", $id) ;
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ;
$chemin_fichier_s = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ;
$image = '<img src="'.$chemin_fichier_s.'" alt="'.$row['nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img>';
$cible_lien = $chemin_fichier;
}
$resume_item = array('element' => $obs['nom_ret'].$date.$lieu, 'lien' => $cible_lien,'image' => $image);
$resume['elements'][] = $resume_item;
}
 
header("Content-Type: application/json; charset=UTF-8");
$resume = json_encode($resume);
print ($resume);
exit;
}
 
public function calculerDimensions($tailleXY) {
 
$tailleOr = 75 ;
 
if($tailleXY[1] == 0) {
$tailleXY[1] = $tailleOr;
}
 
if($tailleXY[0] == 0) {
$tailleXY[0] = $tailleOr;
}
 
$maxTaille = max($tailleXY[1],$tailleXY[0]) ;
 
if($maxTaille == $tailleXY[1]) {
 
$rapport = $tailleXY[1]/$tailleXY[0] ;
$tailleXY[1] = 75 ;
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ;
 
}else {
$rapport = $tailleXY[0]/$tailleXY[1] ;
$tailleXY[0] = 75 ;
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ;
}
 
return $tailleXY ;
}
}
?>
/tags/celw-v1.1/jrest/services/InventoryImageExport.php
New file
0,0 → 1,393
<?php
 
 
Class InventoryImageExport extends DBAccessor {
 
private $extendSpreadsheetProductor;
 
private $archive;
private $workbook;
private $worksheet;
private $chemin_export_liste;
 
function InventoryImageExport($config) {
 
parent::__construct($config);
 
require_once('lib/zip.php');
 
$this->config=$config;
$this->extendSpreadsheetProductor = new SpreadsheetProductor();
$this->extendSpreadsheetProductor->initSpreadsheet();
}
 
function getElement($uid){
$this->authentifier();
 
$tableau = array();
 
$tag = $uid[0];
 
$limite = 0;
$pas = 0;
 
//ini_set('max_execution_time',120);
 
/*if(isset($uid[1]) && isset($uid[2])) {
$limite = $uid[]
}*/
 
$taille_archive_courante = 0;
$index_archive_courante = 0;
$taille_max_archive = $this->config['cel_db']['taille_max_archive'];
$liens_archives = array();
 
$DB=$this->connectDB($this->config,'cel_db');
 
$query_id_id_img = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE cmc_id_mot_cle_general = md5("'.$DB->escapeSimple($tag).'")' ;
 
$res =& $DB->query($query_id_id_img);
 
if (DB::isError($res)) {
$this->logger("InventoryImageExport",'Erreur de requete '.$query_id_id_img);
die($res->getMessage());
}
 
 
$query='SELECT * FROM cel_images';
 
$premier_item = true ;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
$tableau['mots cles'] = array('utilisateur' => $row['cmc_id_proprietaire'], 'mot cle' => $row['cmc_id_mot_cle_utilisateur']);
 
if($premier_item) {
$query .= ' WHERE ';
$premier_item = false ;
}
else{
$query .= ' OR ';
}
 
$query .= '(ci_meta_mots_cles LIKE "%'.$row['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur ="'.$row['cmc_id_proprietaire'].'")' ;
}
 
$query .= ' ORDER BY ci_meta_date_ajout' ;
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$this->logger('Requetes',$query);
 
// création d'un objet 'zipfile'
$this->archive = new zipfile();
 
$i = 1;
 
$this->initialiserWorkBook($index_archive_courante);
 
while ($image =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
$image['ci_nom_original'] = htmlspecialchars($image['ci_nom_original']);
$image['ci_id_image'] = htmlspecialchars($image['ci_id_image']);
$image['ci_meta_date_ajout'] = htmlspecialchars($image['ci_meta_date_ajout']);
$image['ci_ce_utilisateur'] = htmlspecialchars($image['ci_ce_utilisateur']);
$image['ci_meta_user_comment'] = htmlspecialchars($image['ci_meta_user_comment']);
$image['ci_note_image'] = htmlspecialchars($image['ci_note_image']);
 
$id = $image['ci_id_image'];
 
$tableau[$id]['image'] = $image;
if($filename = $this->renvoyerCheminSurServeur($id,false)) {
 
// appel de la classe
// nom du fichier à ajouter dans l'archive
// contenu du fichier
$fp = fopen ($filename, 'r');
$content = fread($fp, filesize($filename));
fclose ($fp);
 
// ajout du fichier dans cet objet
if(preg_match('/\.(?:jpg|jpeg)$/i',$image['ci_nom_original'])) {
$nom_fichier_image = preg_replace('/\.(?:jpg|jpeg)$/i','_'.$id.'.jpg', $image['ci_nom_original']);
} else {
$nom_fichier_image = $image['ci_nom_original'].'_'.$id.'.jpg';
}
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
$chemin_fichier = $chemin_sur_serveur_final.'/O/'.$id."_O.jpg" ;
$obs_liee['url_image_liee'] = $chemin_fichier;
 
$taille_fichier = filesize($filename);
 
$req_liaison = 'SELECT * FROM cel_inventory WHERE ordre IN (SELECT coi_ce_observation FROM cel_obs_images WHERE coi_ce_image = "'.$image['ci_id_image'].'") AND identifiant = "'.$image['ci_ce_utilisateur'].'"' ;
$res_liaison =& $DB->query($req_liaison);
 
if (DB::isError($res_liaison)) {
die($res_liaison->getMessage());
}
 
if (DB::isError($res_liaison)) {
die($res_liaison->getMessage());
}
 
while($obs_liee = & $res_liaison->fetchrow(DB_FETCHMODE_ASSOC)) {
 
$tableau[$id]['obs'] = $obs_liee;
$obs_liee['nom_image_liee'] = $nom_fichier_image;
$obs_liee['url_image_liee'] = $chemin_fichier;
 
$this->ecrireLigneWorkBook($i,$obs_liee);
 
$i++;
}
 
//$this->archive->addfile($content, $nom_fichier_image);
//$taille_archive_courante += $taille_fichier;
 
if($taille_archive_courante <= $taille_max_archive) {
 
 
} else {
 
// fermeture du workbook
$this->workbook->close();
$i = 1;
 
// ajout du fichier liste dans cet objet
// contenu du fichier
$fp = fopen($this->chemin_export_liste, 'r');
$contenu = fread($fp, filesize($this->chemin_export_liste));
fclose ($fp);
 
$this->archive->addfile($contenu,'liste.'.md5($tag).'_'.$index_archive_courante.'.xls');
$liens_archives[] = $this->enregistrerArchive($this->archive,$index_archive_courante,$tag);
$index_archive_courante++;
$taille_archive_courante = 0;
 
$this->archive = new zipfile();
$this->initialiserWorkBook($index_archive_courante);
}
}
 
//$this->verifierOuRelancerExecution();
//$this->logger('InventoryImageExport'," Temps d'éxécution à l'image ".$id." : ".$this->getTempsEcoule());
}
// fermeture du workbook
$this->workbook->close();
$i = 1;
 
// ajout du fichier liste dans cet objet
// contenu du fichier
$fp = fopen($this->chemin_export_liste, 'r');
$contenu = fread($fp, filesize($this->chemin_export_liste));
fclose ($fp);
 
$this->archive->addfile($contenu,'liste.'.md5($tag).'_'.$index_archive_courante.'.xls');
$liens_archives[] = $this->enregistrerArchive($this->archive,$index_archive_courante,$tag);
$index_archive_courante++;
 
$j = 1;
$sortie = '<div><ul>';
foreach($liens_archives as $lien) {
$sortie .= '<li> <a href = "'.$lien.'"> Partie '.$j.'</a></li>';
$j++;
}
 
$sortie .= '</div></ul>';
 
//$this->logger('InventoryImageExport',count($tableau));
 
//$this->logger('InventoryImageExport',print_r($tableau,true));
 
header('Content-Type: text/html');
echo $sortie;
 
}
 
 
function getRessource(){
//$this->getElement();
}
 
public function authentifier() {
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
header('HTTP/1.0 401 Unauthorized');
header('Content-type: text/html; charset=UTF-8');
echo 'Accès interdit';
exit;
} else {
if($this->verifierAcces($_SERVER['PHP_AUTH_USER'])) {
return ;
}
else
{
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
header('HTTP/1.0 401 Unauthorized');
header('Content-type: text/html; charset=UTF-8');
echo 'Accès interdit';
exit ;
}
}
}
 
public function verifierAcces($id) {
 
$DB=$this->connectDB($this->config,'database_ident');
$query="SELECT ".$this->config['database_ident']['ann_id']." as name FROM ".$this->config['database_ident']['annuaire']." WHERE ".$this->config['database_ident']['ann_id']." ='".$DB->escapeSimple($id)
."' AND ".$this->config['database_ident']['ann_pwd']." = ".$this->config['database_ident']['pass_crypt_funct']."('".$DB->escapeSimple($_SERVER['PHP_AUTH_PW'])."')" ;
 
$res =& $DB->getOne($query);
 
if($res == "") {
return false ;
}
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
return $this->isAdmin($id) ;
 
}
 
private function renvoyerCheminSurServeur($id,$url = true) {
 
if($url) {
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
} else {
$chemin_sur_serveur = $this->config['cel_db']['chemin_images'];
}
 
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$id_fichier = $id.".jpg" ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
 
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ;
 
return $chemin_fichier;
}
 
private function renvoyerCheminExport($url = true) {
if($url) {
return $this->config['cel_db']['url_export'];
} else {
return $this->config['cel_db']['chemin_export'];
}
}
 
private function enregistrerArchive($zip,$index,$tag) {
 
// production de l'archive' Zip
$this->archive = $zip->file();
$chemin_export = $this->renvoyerCheminExport(false);
$url_export = $this->renvoyerCheminExport(true);
 
$chemin_archive = $chemin_export.'/'.md5($tag).'_'.$index.'.zip';
$url_archive = $url_export.'/'.md5($tag).'_'.$index.'.zip';
 
$fp = fopen($chemin_archive,'w+');
$ecriture = fwrite($fp,$this->archive);
fclose($fp);
 
if($ecriture) {
return $url_archive;
} else {
return false;
}
 
}
 
private function initialiserWorkBook($index) {
 
// Creating a workbook
$this->chemin_export_liste = $this->renvoyerCheminExport(false).'/liste'.$index.'.xls';
$this->workbook = new Spreadsheet_Excel_Writer($this->chemin_export_liste);
 
// Creating a worksheet
$this->worksheet = $this->workbook->addWorksheet('Liste');
 
$this->worksheet->write(0,0,'url de l\'image');
$this->worksheet->write(0,1,'Nom original de l\'image');
//$this->worksheet->write(0,1,'Nom saisi');
//$this->worksheet->write(0,2,'Numero nomenclatural');
$this->worksheet->write(0,2,'Nom retenu');
$this->worksheet->write(0,3,'Numero nomenclatural nom retenu');
$this->worksheet->write(0,4,'Numero taxonomique');
$this->worksheet->write(0,5,'Famille');
//$this->worksheet->write(0,7,'Commune');
//$this->worksheet->write(0,8,'Identifiant Commune');
$this->worksheet->write(0,6,'Date Observation');
// $this->worksheet->write(0,10,'Lieu dit');
//$this->worksheet->write(0,11,'Station');
//$this->worksheet->write(0,12,'Milieu');
$this->worksheet->write(0,7,'Contributeur');
$this->worksheet->write(0,8,'Commentaire');
}
 
private function ecrireLigneWorkBook($index, $observation) {
 
$this->worksheet->write($index,0,$observation['url_image_liee']);
$this->worksheet->write($index,1,$observation['nom_image_liee']);
//$this->worksheet->write($index,1,$observation['nom_sel']);
//$this->worksheet->write($index,2,$observation['num_nom_sel']);
$this->worksheet->write($index,2,$observation['nom_ret']);
$this->worksheet->write($index,3,$observation['num_nom_ret']);
$this->worksheet->write($index,4,$observation['num_taxon']);
$this->worksheet->write($index,5,$observation['famille']);
//$this->worksheet->write($index,7,$observation['location']);
//$this->worksheet->write($index,8,$observation['id_location']);
$this->worksheet->write($index,6,$observation['date_observation']);
//$this->worksheet->write($index,10,$observation['lieudit']);
//$this->worksheet->write($index,11,$observation['station']);
//$this->worksheet->write($index,12,$observation['milieu']);
$this->worksheet->write($index,7,$observation['identifiant']);
$this->worksheet->write($index,8,$observation['commentaire']);
}
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.5 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.4 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
 
?>
/tags/celw-v1.1/jrest/services/Cel.php
New file
0,0 → 1,699
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* Classe mère abstraite contenant les méthodes génériques des services.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@clapas.org>
* @author Aurélien 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>
* @version $Id$
* @copyright © 2010, Jean-Pascal MILCENT
*/
abstract class Cel {
const TYPE_OBS = 'observation';
const TYPE_IMG = 'image';
const SQL_MODE_ASSOC = PDO::FETCH_ASSOC;
const SQL_MODE_OBJET = PDO::FETCH_OBJ;
const SQL_RETOUR_COMPLET = 'All';
const SQL_RETOUR_LIGNE = 'Row';
const SQL_RETOUR_COLONNE = 'Column';
const SQL_RETOUR_BRUT = 'Raw';
public $config;
private $ressources;
protected $parametres = array();
protected $bdd;
protected $messages = array();
protected $debug = array();
 
public function __construct($config) {
// Tableau contenant la config de Jrest
$this->config = $config;
 
// Réglages de PHP
setlocale(LC_ALL, $this->config['settings']['locale']);
date_default_timezone_set($this->config['settings']['fuseauHoraire']);
 
// Connection à la base de données
$this->bdd = $this->connecterPDO($this->config, 'database_cel');
// Nettoyage du _GET (sécurité)
$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres
$this->recupererParametresUrl();// Vidage de _GET et création d'attribut de la classe
$this->definirParametresUrlParDefaut();
// Définition de variable générale dans la config
$this->config['settings']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].$this->config['settings']['baseURL'].'%s';
}
 
//+----------------------------------------------------------------------------------------------------------------+
// GESTION de la BASE de DONNÉES
 
private function connecterPDO($config, $base = 'database') {
$cfg = $config[$base];
// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place.
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
try {
// Création de la connexion en UTF-8 à la BDD
$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage();
}
return $PDO;
}
/**
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
* Puis execute la requete.
* @see protegerRequete()
* @param unknown_type $requete
*/
protected function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
$requete = $this->protegerRequete($requete);
return $this->executerRequete($requete, $retour, $mode);
}
/**
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
* @see protegerRequete()
* @param unknown_type $requete
*/
protected function executer($requete) {
$requete = $this->protegerRequete($requete);
return $this->executerRequeteSimple($requete);
}
/**
* Méthode permettant de rechercher dans une requete SQL sous forme de chaine (String) les chaines
* à protéger. Cela évite de protéger chaque variable avant de l'insérer dans une requete SQL.
* Par contre, il est important que les chaine à protéger ne contiennent pas le caractère '|'.
*
* @param $requete
*/
protected function protegerRequete($requete) {
if (substr_count($requete, '|') % 2 === 0) {
if (preg_match_all('/\|([^|]*)\|/', $requete, $correspondances, PREG_SET_ORDER)) {
foreach ($correspondances as $chaine) {
$chaine_protegee = $this->bdd->quote($chaine[1]);
$requete = str_replace($chaine[0], $chaine_protegee, $requete);
}
}
} else {
$this->messages[] = "La requête a protéger contient un nombre impair de caractère de protection '|'.";
$requete = false;
}
return $requete;
}
protected function proteger($chaine) {
return $this->bdd->quote($chaine);
}
protected function protegerTableau(Array $tableau) {
foreach ($tableau as $id => $val) {
$tableau[$id] = $this->proteger($val);
}
return $tableau;
}
/**
* @deprecated utiliser executer() à la place
* @see executer()
*/
protected function executerRequeteSimple($requete) {
$resultat = false;
try {
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$this->debug[] = "La requête a échoué : $requete";
}
} catch (PDOException $e) {
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
return $resultat;
}
/**
* @deprecated utiliser requeter() à la place
* @see requeter()
*/
protected function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
$resultat = false;
try {
switch ($retour) {
case self::SQL_RETOUR_COMPLET :
$resultat = $this->bdd->query($requete)->fetchAll($mode);// Retourne toutes les lignes
break;
case self::SQL_RETOUR_LIGNE :
$resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première ligne
break;
case self::SQL_RETOUR_COLONNE :
$resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne
break;
case self::SQL_RETOUR_BRUT :
$resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach
break;
default:
$this->debug[] = "Le type de retour '$retour' est inconnu.";
}
if ($resultat === false) {
$this->debug[] = "La requête a retourné aucun résultat : $requete";
}
} catch (PDOException $e) {
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
return $resultat;
}
 
protected function getTxt($id) {
$sortie = '';
switch ($id) {
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break;
default : $sortie = $id;
}
return $sortie;
}
 
//+----------------------------------------------------------------------------------------------------------------+
// TRAITEMENT des URLs et des PARAMÊTRES
private function collecterParametres() {
if (isset($_GET) && $_GET != '') {
foreach ($_GET as $cle => $valeur) {
$this->parametres[$cle] = $this->verifierSecuriteParametreUrl($valeur);
}
}
}
private function recupererParametresUrl() {
if (isset($_GET)) {
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
foreach ($get_params as $get) {
if (isset($_GET[$get])) {
$_GET[$get] = $this->verifierSecuriteParametreUrl($_GET[$get]);
if ($_GET[$get] != '') {
if (!isset($this->$get)) {
$this->$get = $_GET[$get];
} else {
$e = "Impossible d'ajouter l'attribut $get à la classe du service car elle possède déjà un attribut nommé : $get";
trigger_error($e, E_USER_WARNING);
}
} else {
$_GET[$get] = null;
}
}
}
}
}
protected function verifierSecuriteParametreUrl($param) {
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
$param = strip_tags(str_replace($verifier, '', $param));
return $param;
}
private function definirParametresUrlParDefaut() {
if (!isset($this->start)) {
$this->start = 0;
}
if (!isset($this->limit)) {
$this->limit = 150;
}
}
protected function traiterParametres($params_attendu, $params, $pourBDD = true) {
$sortie = array();
foreach ($params_attendu as $num => $nom) {
if (isset($params[$num]) && $params[$num] != '*') {
if ($pourBDD) {
$params[$num] = $this->bdd->quote($params[$num]);
}
$sortie[$nom] = $params[$num];
}
}
return $sortie;
}
 
protected function traiterNomMethodeGet($nom) {
$methode = 'get';
$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom))));
return $methode;
}
 
//+----------------------------------------------------------------------------------------------------------------+
// GESTION de l'ENVOIE au NAVIGATEUR
 
protected function envoyerJson($donnees, $encodage = 'utf-8') {
$encodage_json = true;
$this->envoyer($donnees, 'application/json', $encodage, $encodage_json);
}
protected function envoyerJsonVar($variable, $donnees = null, $encodage = 'utf-8') {
$contenu = "var $variable = ".json_encode($donnees);
$this->envoyer($contenu, 'text/html', $encodage);
}
protected function envoyerJsonp($donnees = null, $encodage = 'utf-8') {
$contenu = $this->parametres['callback'].'('.json_encode($donnees).');';
$this->envoyer($contenu, 'text/html', $encodage);
}
 
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = false) {
// Traitements des messages d'erreurs et données
if (count($this->messages) != 0) {
header('HTTP/1.1 500 Internal Server Error');
$json = true;
$sortie = $this->messages;
} else {
$sortie = $donnees;
if (is_null($donnees)) {
$sortie = 'OK';
}
}
// Gestion de l'envoie du déboguage
$this->envoyerDebogage();
 
// Encodage au format et JSON et envoie sur la sortie standard
$contenu = $json ? json_encode($sortie) : $sortie;
$this->envoyerContenu($encodage, $mime, $contenu);
}
 
private function envoyerDebogage() {
if (!is_array($this->debug)) {
$this->debug[] = $this->debug;
}
if (count($this->debug) != 0) {
foreach ($this->debug as $cle => $val) {
if (is_array($val)) {
$this->debug[$cle] = print_r($val, true);
}
}
header('X-DebugJrest-Data:'.json_encode($this->debug));
}
}
 
private function envoyerContenu($encodage, $mime, $contenu) {
if (!is_null($mime) && !is_null($encodage)) {
header("Content-Type: $mime; charset=$encodage");
} else if (!is_null($mime) && is_null($encodage)) {
header("Content-Type: $mime");
}
print $contenu;
}
private function envoyerAuth($message_accueil, $message_echec) {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
header('Content-type: text/plain; charset=UTF-8');
print $message_echec;
exit(0);
}
//+----------------------------------------------------------------------------------------------------------------+
// GESTION DES CLASSES CHARGÉES À LA DEMANDE
protected function getRestClient() {
if (!isset($this->restClient)) {
$this->restClient = new CelRestClient();
}
return $this->restClient;
}
//+----------------------------------------------------------------------------------------------------------------+
// GESTION DE L'IDENTIFICATION
protected function getAuthIdentifiant() {
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
return $id;
}
protected function getAuthMotDePasse() {
$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
return $mdp;
}
public function authentifierAdmin() {
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
$message_echec = "Accès limité aux administrateurs du CEL.\n".
"Votre tentative d'identification a échoué.\n".
"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur.";
return $this->authentifier($message_accueil, $message_echec, 'Admin');
}
public function authentifierUtilisateur() {
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
$message_echec = "Accès limité aux utilisateur du CEL.\n".
"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n".
"Votre tentative d'identification a échoué.\n".
"Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'.";
return $this->authentifier($message_accueil, $message_echec, 'Utilisateur');
}
public function isAdmin($id) {
$admins = $this->config['jrest_admin']['admin'];
$admin_tab = split(',',$admins);
 
if (in_array($id,$admin_tab)) {
return true;
} else {
return false;
}
}
 
public function controleUtilisateur($id) {
if ($_SESSION['user']['name'] == '') {
//cas de la session temporaire, on ne fait rien de particulier
} else {
if (!$this->isAdmin($_SESSION['user']['name']) && $_SESSION['user']['name'] != $id) {
// cas d'usurpation d'identité
print 'Accès interdit';
exit();
}
}
}
 
public function logger($index,$chaine) {
if(!class_exists('Log')) {
Log::getInstance();
}
 
Log::setCheminLog($this->config['log']['cheminlog']);
Log::setTimeZone($this->config['log']['timezone']);
Log::setTailleMax($this->config['log']['taillemax']);
 
Log::ajouterEntree($index,$chaine);
}
private function authentifier($message_accueil, $message_echec, $type) {
$id = $this->getAuthIdentifiant();
if (!isset($id)) {
$this->envoyerAuth($message_accueil, $message_echec);
} else {
if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') {
$autorisation = true;
} else {
$methodeAutorisation = "etre{$type}Autorise";
$autorisation = $this->$methodeAutorisation();
}
if ($autorisation == false) {
$this->envoyerAuth($message_accueil, $message_echec);
}
}
return true;
}
public function etreUtilisateurAutorise() {
$identifiant = $this->getAuthIdentifiant();
$mdp = md5($this->getAuthMotDePasse());
$service = "TestLoginMdp/$identifiant/$mdp";
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service);
$json = $this->getRestClient()->consulter($url);
$existe = json_decode($json);
$autorisation = (isset($existe) && $existe) ? true :false;
return $autorisation;
}
public function etreAdminAutorise() {
$identifiant = $this->getAuthIdentifiant();
$autorisation = ($this->etreUtilisateurAutorise() && $this->etreAdminCel($identifiant)) ? true : false;
return $autorisation;
}
public function etreAdminCel($courriel) {
$admins = $this->config['jrest_admin']['admin'];
$courriels_autorises = explode(',', $admins);
 
$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ;
return $autorisation;
}
public function getInfosComplementairesUtilisateur($id_utilisateur) {
$infos_utilisateur = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur);
if(is_numeric($id_utilisateur)) {
 
$requete_infos_utilisateur = 'SELECT prenom, nom, courriel FROM cel_utilisateurs '.
'WHERE id_utilisateur = '.$this->proteger($id_utilisateur);
$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur);
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) {
$infos_utilisateur = $resultat_infos_utilisateur;
}
}
return $infos_utilisateur;
}
public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) {
$infos_utilisateur = array('prenom' => $mail_utilisateur, 'nom' => $mail_utilisateur, 'courriel' => $mail_utilisateur);
 
$requete_infos_utilisateur = 'SELECT id, prenom, nom FROM cel_utilisateurs '.
'WHERE courriel = '.$this->proteger($mail_utilisateur);
$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur);
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) {
$infos_utilisateur = $resultat_infos_utilisateur;
}
return $infos_utilisateur;
}
 
//+----------------------------------------------------------------------------------------------------------------+
// GESTION DE MÉTHODES COMMUNES ENTRE LES SERVICES
protected function getUrlImage($id, $format = 'L') {
$url_tpl = $this->config['settings']['celImgUrlTpl'];
$id = sprintf('%09s', $id).$format;
$url = sprintf($url_tpl, $id);
return $url;
}
/**
* Prend en paramêtre un tableau de courriels et retourne après avoir interrogé un service de l'annuaire
* une tableau avec en clé le courriel et en valeur l'intitulé de la personne à afficher.
*
* @param array $courriels un tableau de courriels pour lesquels il faut rechercher les infos d'identité
*/
protected function creerAuteurs(Array $courriels) {
$auteurs = array();
if ($identites = $this->recupererUtilisateursIdentite($courriels)) {
foreach ($identites as $courriel => $infos) {
$auteurs[$courriel] = $info['identite'];
}
}
return $auteurs;
}
protected function recupererUtilisateursIdentite(Array $courriels) {
// Récupération des données au format Json
$service = "utilisateur/identite-par-courriel/".implode(',', $courriels);
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service);
$json = file_get_contents($url);
$utilisateurs = json_decode($json);
foreach ($courriels as $courriel) {
$info = array('id' => null, 'identite' => '');
if (isset($utilisateurs->$courriel)) {
$info['intitule'] = $utilisateurs->$courriel->intitule;
$info['id'] = $utilisateurs->$courriel->id;
} else {
$info['intitule'] = $this->tronquerCourriel($courriel);
}
$noms[$courriel] = $info;
}
return $noms;
}
protected function tronquerCourriel($courriel) {
$courriel = preg_replace('/[^@]+$/i', '...', $courriel);
return $courriel;
}
protected function nettoyerTableau(Array $tableau) {
foreach ($tableau as $cle => $valeur) {
if (is_array($valeur)) {
$valeur = $this->nettoyerTableau($valeur);
} else {
$valeur = $this->nettoyerTexte($valeur);
}
$tableau[$cle] = $valeur;
}
return $tableau;
}
/**
* Fonction nettoyant les caractères spéciaux (&,<) et les valeurs nulles du CEL dans un texte comprenant du HTML.
*/
protected function nettoyerTexte($txt) {
$txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9][a-f]+);)/i', '&amp;', $txt);
// TODO : trouver une regexp qui permet de remplacer les symboles < et > isolés
//$txt = preg_replace('/<(?!([a-z][a-z0-9]*)\b[^>]*>(.*?)<\/\1>|\/\s*([a-z][a-z0-9]*)\s*>)/i', '&lt;', $txt);
//$txt = preg_replace('/(?!<([a-z][a-z0-9]*)\b[^>]*)>(?!(.*?)<\/\1>)/i', '&gt;', $txt);
$txt = preg_replace('/(?:000null|null)/i', '', $txt);
return $txt;
}
/**
* Fonction nettoyant les caractères spéciaux HTML pour les champs de saisie libre du CEL.
*/
protected function protegerCaracteresHtmlDansChamps($donnees) {
$champs = array('mots_cles_texte', 'commentaire',
'zone_geo', 'lieudit', 'station', 'milieu', 'commentaire', 'nom_sel');
foreach ($champs as $champ) {
if (isset($donnees[$champ])) {
$donnees[$champ] = htmlspecialchars($donnees[$champ]);
}
}
return $donnees;
}
protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){
$val = explode(' ', $date_heure_mysql);
$date = explode('-', $val[0]);
$heure = explode(':', $val[1]);
return mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]);
}
protected function etreNull($valeur) {
$etre_null = false;
if ($valeur == '' || $valeur == null || $valeur == '000null' || $valeur == 'null' || $valeur == '*') {
$etre_null = true;
}
return $etre_null;
}
protected function formaterDate($date_heure_mysql, $format = '%A %d %B %Y à %H:%M') {
$date_formatee = '';
if (!$this->etreNull($date_heure_mysql)) {
$timestamp = $this->convertirDateHeureMysqlEnTimestamp($date_heure_mysql);
$date_formatee = strftime($format, $timestamp);
}
return $date_formatee;
}
protected function encoderMotCle($mot_cle) {
return md5(mb_strtolower(trim($mot_cle)));
}
protected function decoderMotsClesObs($utilisateur_id, $mots_cles) {
return $this->decoderMotsCles($utilisateur_id, $mots_cles, self::TYPE_OBS);
}
protected function decoderMotsClesImg($utilisateur_id, $mots_cles) {
return $this->decoderMotsCles($utilisateur_id, $mots_cles, self::TYPE_IMG);
}
private function decoderMotsCles($utilisateur_id, $mots_cles, $type) {
$mots = array();
if (! $this->etreNull($mots_cles)) {
$utilisateur_id = $this->bdd->quote($utilisateur_id);
$mots_cles = $this->protegerMotsCles($mots_cles, $type);
if (! $this->etreNull($mots_cles)) {
$table = ($type == self::TYPE_IMG) ? 'cel_mots_cles_images' : 'cel_mots_cles_obs' ;
$requete = 'SELECT cmc_mot_cle '.
"FROM $table ".
"WHERE cmc_id_mot_cle_utilisateur IN ($mots_cles) ".
"AND cmc_id_proprietaire = $utilisateur_id ";
$elements = $this->executerRequete($requete);
if (is_array($elements)) {
foreach ($elements as $mot) {
$mots[] = $mot['mot_cle'];
}
}
}
}
return $mots;
}
private function protegerMotsCles($mots_cles, $type) {
$separateur = ($type == self::TYPE_IMG) ? ',' : ';' ;
$mots_cles = $this->traiterValeursMultiples($mots_cles, $separateur);
return $mots_cles;
}
protected function traiterValeursMultiples($valeurs, $separateur_entree = ',' , $separateur_sortie = ',') {
if (! $this->etreNull($valeurs)) {
$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree));
foreach ($valeurs_a_proteger as $valeur) {
$valeurs_protegees[] = $this->bdd->quote($valeur);
}
$valeurs = implode($separateur_sortie, $valeurs_protegees);
}
return ($this->etreNull($valeurs)) ? null : $valeurs;
}
//+----------------------------------------------------------------------------------------------------------------+
// GESTION DES SQUELETTES PHP
 
/**
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
*
* @param String $fichier le chemin du fichier du squelette
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette.
*
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
*/
public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
$sortie = false;
if (file_exists($fichier)) {
// Extraction des variables du tableau de données
extract($donnees);
// Démarage de la bufferisation de sortie
ob_start();
// Si les tags courts sont activés
if ((bool) @ini_get('short_open_tag') === true) {
// Simple inclusion du squelette
include $fichier;
} else {
// Sinon, remplacement des tags courts par la syntaxe classique avec echo
$html_et_code_php = self::traiterTagsCourts($fichier);
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
$html_et_code_php = '?>'.$html_et_code_php;
// Interprétation du html et du php dans le buffer
echo eval($html_et_code_php);
}
// Récupèration du contenu du buffer
$sortie = ob_get_contents();
// Suppression du buffer
@ob_end_clean();
} else {
$msg = "Le fichier du squelette '$fichier' n'existe pas.";
trigger_error($msg, E_USER_WARNING);
}
// Retourne le contenu
return $sortie;
}
 
/**
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
*
* @param String $chemin_squelette le chemin du fichier du squelette
*
* @return string le contenu du fichier du squelette php avec les tags courts remplacés.
*/
private static function traiterTagsCourts($chemin_squelette) {
$contenu = file_get_contents($chemin_squelette);
// Remplacement de tags courts par un tag long avec echo
$contenu = str_replace('<?=', '<?php echo ', $contenu);
// Ajout systématique d'un point virgule avant la fermeture php
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
return $contenu;
}
}
/tags/celw-v1.1/jrest/services/CelStatistiqueTxt.php
New file
0,0 → 1,406
<?php
/**
* Service fournissant des statistiques de l'application CEL au format texte (JSON).
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CelStatistiqueTxt/TypeDeStat : retourne les statistiques demandées
* Paramêtres :
* utilisateur=courriel : retourne les statistiques d'un utilisateur donné.
*
* @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 $Id$
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
*/
class CelStatistiqueTxt extends Cel {
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($ressources) {
$graph = null;
$serveur = '';
 
if (isset($ressources[0])) {
$this->analyserParametresUrl();
$stat_demande = array_shift($ressources);
$methode = 'get'.$stat_demande;
if (method_exists($this, $methode)) {
$this->ressources = $ressources;
$stats = $this->$methode($ressources);
} else {
$this->messages[] = "Ce type de statistiques '$stat_demande' n'est pas disponible.";
}
} else {
$this->messages[] = "La ressource du service CEL StatistiqueTxt doit indiquer le type de statistique. Ex. : .../CelStatistiqueTxt/Nombres";
}
 
if (!is_null($stats)) {
$this->envoyerJson($stats);
}
}
private function analyserParametresUrl() {
$this->parametres['utilisateur'] = isset($_GET['utilisateur']) ? $this->bdd->quote($this->verifierSecuriteParametreUrl($_GET['utilisateur'])) : null;
$this->parametres['num_taxon'] = isset($_GET['num_taxon']) ? $this->bdd->quote($this->verifierSecuriteParametreUrl($_GET['num_taxon'])) : null;
$this->parametres['taxon'] = isset($_GET['taxon']) ? $this->bdd->quote($this->verifierSecuriteParametreUrl($_GET['taxon'].'%')) : null;
$this->parametres['tag'] = isset($_GET['tag']) ? $this->verifierSecuriteParametreUrl($_GET['tag']) : null;
$this->parametres['start'] = isset($_GET['start']) ? $this->verifierSecuriteParametreUrl($_GET['start']) : null;
$this->parametres['limit'] = isset($_GET['limit']) ? $this->verifierSecuriteParametreUrl($_GET['limit']) : null;
}
private function getListeUtilisateursNbrePhotos() {
$liste = array();
$requete = $this->construireRequeteListeUtilisateurNbrePhoto();
if ($requete != null) {
$resultats = $this->executerRequete($requete);
if ($resultats != false) {
foreach ($resultats as $resultat) {
$liste[$resultat['identifiant']] = $resultat['nbre'];
}
}
}
return $liste;
}
private function construireRequeteListeUtilisateurNbrePhoto() {
$select = 'SELECT identifiant, COUNT(DISTINCT ci_id_image) AS nbre ';
$from = 'FROM cel_inventory '.
' LEFT JOIN cel_obs_images ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) '.
' LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) ';
$where = 'WHERE transmission = 1 ';
$groupBy = 'GROUP BY identifiant ';
$orderBy = 'ORDER BY nbre DESC ';
$limitSql = 'LIMIT 0,150 ';
$zero_images = false;
if (count($this->parametres) != 0) {
extract($this->parametres);
$filtres = array();
if (isset($utilisateur)) {
$filtres[] = "identifiant = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
if (isset($tag)) {
$limitation = $this->construireWhereTags();
if ($limitation != null) {
$filtres[] = $limitation;
} else {
$zero_images = true;
}
}
$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
if (isset($start)) {
$limitSql = str_replace('0,', "$start,", $limitSql);
}
if (isset($limit)) {
$limitSql = str_replace('150', $limit, $limitSql);
}
}
if ($zero_images) {
$requete = null;
} else {
$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;
//echo $requete;
}
return $requete;
}
private function construireWhereTags() {
$where = null;
if (isset($this->parametres['tag'])) {
$tag = $this->parametres['tag'];
$tag_encode = $this->bdd->quote($this->encoderMotCle(trim($tag)));
 
// Construction de la requête
$requete = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire '.
'FROM cel_mots_cles_images '.
"WHERE cmc_id_mot_cle_general = $tag_encode ";
$elements = $this->executerRequete($requete);
if ($elements != false && count($elements) > 0) {
// Pré-construction du where de la requête
$tpl_where = '(ci_meta_mots_cles LIKE "%%%s%%" AND ci_ce_utilisateur = %s )';
$requete_where = array();
foreach ($elements as $occurence) {
$requete_where[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire']));
}
$where = ' ('.implode(" \nOR ", $requete_where).') ';
} else {
$this->debug[] = "Aucune image ne correspond à ce mot clé.";
}
}
return $where;
}
private function getListeTaxonsNbrePhotos() {
$requete = $this->construireRequeteListeTaxonNbrePhoto();
$resultats = $this->executerRequete($requete);
$liste = array();
if ($resultats != false) {
foreach ($resultats as $resultat) {
$liste[$resultat['nom_ret']] = $resultat['nbre'];
}
}
return $liste;
}
private function construireRequeteListeTaxonNbrePhoto() {
$select = 'SELECT nom_ret, COUNT(DISTINCT ci_id_image) AS nbre ';
$from = 'FROM cel_inventory '.
' LEFT JOIN cel_obs_images ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) '.
' LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) ';
$where = 'WHERE transmission = 1 '.
" AND nom_ret != '' ";
$groupBy = 'GROUP BY nom_ret ';
$orderBy = 'ORDER BY nbre DESC ';
$limitSql = 'LIMIT 0,150 ';
if (count($this->parametres) != 0) {
extract($this->parametres);
$filtres = array();
if (isset($utilisateur)) {
$filtres[] = "identifiant = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
if (isset($start)) {
$limitSql = str_replace('0,', "$start,", $limitSql);
}
if (isset($limit)) {
$limitSql = str_replace('150', $limit, $limitSql);
}
}
$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql;
return $requete;
}
private function getNombres() {
 
$requete = $this->construireRequeteNbreObs();
$info['observations'] = (int) $this->executerRequete($requete, 'Column');
$requete = $this->construireRequeteNbreObsPubliques();
$info['observationsPubliques'] = (int) $this->executerRequete($requete, 'Column');
$requete = $this->construireRequeteNbreImg();
$info['images'] =(int) $this->executerRequete($requete, 'Column');
$requete = $this->construireRequeteNbreImgLiees();
$info['imagesLiees'] =(int) $this->executerRequete($requete, 'Column');
$requete = $this->construireRequeteNbreObsLiees();
$info['observationsLiees'] = (int) $this->executerRequete($requete, 'Column');
$info['moyImagesParObs'] = ($info['observationsLiees'] > 0 ? round($info['imagesLiees']/$info['observationsLiees'], 2) : '');
$requete = $this->construireRequeteNbreObsParCommune();
$info['communes'] = ($resultats = $this->executerRequete($requete)) ? count($resultats) : '' ;
$info['observationsParCommunesMin'] = 1000;
$info['observationsParCommunesMax'] = 0;
$info['observationsParCommunesTotal'] = 0;
foreach ($resultats as $resultat) {
if ($resultat['nbre'] < $info['observationsParCommunesMin']) {
$info['observationsParCommunesMin'] = $resultat['nbre'];
}
if ($resultat['nbre'] > $info['observationsParCommunesMax']) {
$info['observationsParCommunesMax'] = $resultat['nbre'];
}
$info['observationsParCommunesTotal'] += $resultat['nbre'];
}
$info['observationsParCommunesMoyenne'] = ($info['communes'] > 0 ) ? round($info['observationsParCommunesTotal'] / $info['communes'], 2) : 0;
return $info;
}
private function construireRequeteNbreObs() {
$requete = 'SELECT COUNT(id) AS nbre '.
'FROM cel_inventory ';
 
if (count($this->parametres) != 0) {
$filtres = array();
extract($this->parametres);
if (isset($utilisateur)) {
$filtres[] = "identifiant = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
$requete .= ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
}
return $requete;
}
private function construireRequeteNbreObsPubliques() {
$requete = 'SELECT COUNT(id) AS nbre '.
'FROM cel_inventory '.
"WHERE transmission = 1 ";
 
if (count($this->parametres) != 0) {
$filtres = array();
extract($this->parametres);
if (isset($utilisateur)) {
$filtres[] = "identifiant = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
}
return $requete;
}
private function construireRequeteNbreObsParCommune() {
$requete = 'SELECT COUNT(id) AS nbre '.
'FROM cel_inventory '.
"WHERE location != '000null' ".
" AND id_location != '000null' ";
$groupBy = 'GROUP BY location, id_location';
 
if (count($this->parametres) != 0) {
$filtres = array();
extract($this->parametres);
if (isset($utilisateur)) {
$filtres[] = "identifiant = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : '');
}
$requete .= $groupBy;
return $requete;
}
private function construireRequeteNbreImg() {
$select = 'SELECT COUNT(DISTINCT ci_id_image) AS nbre ';
$from = 'FROM cel_images ';
if (count($this->parametres) != 0) {
$filtres = array();
extract($this->parametres);
if (isset($utilisateur)) {
$filtres[] = "ci_ce_utilisateur = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
if (isset($num_taxon) || isset($taxon)) {
$from .= 'LEFT JOIN cel_obs_images ON (coi_ce_image = ci_id_image) '.
'LEFT JOIN cel_inventory ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) ';
}
$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
}
$requete = $select.$from.$where;
return $requete;
}
private function construireRequeteNbreImgLiees() {
$select = 'SELECT COUNT(DISTINCT ci_id_image) AS nbre ';
$from = 'FROM cel_obs_images '.
' LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) ';
if (count($this->parametres) != 0) {
$filtres = array();
extract($this->parametres);
if (isset($utilisateur)) {
$filtres[] = "coi_ce_utilisateur = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
if (isset($num_taxon) || isset($taxon)) {
$from .= 'LEFT JOIN cel_inventory ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) ';
}
$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
}
$requete = $select.$from.$where;
return $requete;
}
private function construireRequeteNbreObsLiees() {
$select = 'SELECT COUNT(DISTINCT coi_ce_observation) AS nbre ';
$from = 'FROM cel_obs_images '.
' LEFT JOIN cel_inventory ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) ';
if (count($this->parametres) != 0) {
$filtres = array();
extract($this->parametres);
if (isset($utilisateur)) {
$filtres[] = "identifiant = $utilisateur ";
}
if (isset($num_taxon)) {
$filtres[] = "num_taxon = $num_taxon ";
}
if (isset($taxon)) {
$filtres[] = "nom_ret LIKE $taxon ";
}
$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : '');
}
$requete = $select.$from.$where;
return $requete;
}
}
?>
/tags/celw-v1.1/jrest/services/CelStatistique.php
New file
0,0 → 1,1085
<?php
/**
* Service fournissant des urls vers des images de graphiques sur les statistiques de l'application CEL.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CelStatistique/TypeDeGraph : retourne le graphique demandé
* Paramêtres :
* serveur=[0-9] : retourne le graphique demandé sur le serveur numéro 0 à 9 (voir http://code.google.com/intl/fr/apis/chart/docs/making_charts.html#enhancements )
*
* @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 $Id$
* @copyright 2009
*/
class CelStatistique extends Cel {
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param) {
$graph = null;
$serveur = '';
 
if (isset($param[0])) {
$graph_demande = array_shift($param);
$methode = 'get'.$graph_demande;
if (method_exists($this, $methode)) {
$graph = $this->$methode($param);
} else {
$this->messages[] = "Ce type de graphique '$graph_demande' n'est pas disponible.";
}
} else {
$this->messages[] = "Le premier paramêtre du service CEL Statistique doit correspondre au type de graphique.";
}
 
if (!is_null($graph)) {
$serveur = (isset($_GET['serveur']) && preg_match('/^[0-9]$/', $_GET['serveur'])) ? $_GET['serveur'].'.' : '';
$url = "http://{$serveur}chart.apis.google.com/chart";
$contexte = stream_context_create(
array('http' => array(
'method' => 'POST',
'content' => http_build_query($graph))));
$image = file_get_contents($url, false, $contexte);
$this->envoyer($image, 'image/png', null, false);
} else {
$info = 'Un problème est survenu : '.print_r($this->messages, true);
$this->envoyer($info);
}
}
 
private function getEvolImgLieesParMois($param) {
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null;
// Récupération des données
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m') AS periode, COUNT(ci_id_image) AS nbre ".
"FROM cel_obs_images LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) ".
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ".
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : '').
'GROUP BY periode '.
'ORDER BY periode ';
$resulats = $this->executerRequete($requete);
 
$img_totale = array();
foreach ($resulats as $info) {
$img_totale[$info['periode']] = $info['nbre'];
}
 
// Trie des dates pour les étiquettes des axes
$dates = array();
$annees = array();
$les_mois = array();
$pas = 3; // intervalle de mois entre deux étiquettes
$periode = 0;
$cumul = 0;
$img_totale_cumul = array();
foreach ($img_totale as $annee_mois => $nbre) {
$annee = substr($annee_mois, 0, 4);
$mois = substr($annee_mois, 4, 2);
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01"));
$cumul += $nbre;
$img_totale_cumul[$annee_mois] = $cumul;
 
if (!isset($dates[$annee][$mois])) {
$annees[] = (!isset($dates[$annee]) ? $annee : '');
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
// Ajouter au tableau dates tjrs à la fin
$dates[$annee][$mois] = 1;
}
}
 
// Post traitement des données
$titre = "Évolution des images liées aux observations par mois";
$valeurs_y = implode(',', $img_totale);
$valeurs_r = implode(',', $img_totale_cumul);
$valeurs_max_y = (count($img_totale) > 0 ) ? max($img_totale) : 0;
$valeurs_max_r = (count($img_totale_cumul) > 0 ) ? max($img_totale_cumul) : 0;
$y_val_fin = $valeurs_max_y;
$y_pas = round(($valeurs_max_y / 6), 0);
$r_val_fin = $valeurs_max_r;
$r_pas = round(($valeurs_max_r / 6), 0);
$etiquettes_x1 = implode('|', $les_mois);
$etiquettes_x2 = implode('|', $annees);
$etiquettes_y = 'Images';
$etiquettes_r2 = 'Cumul';
// Construire de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '007F00,99CC00',
'chd' => 't:'.$valeurs_y.'|'.$valeurs_r,
'chds' => "0,$valeurs_max_y,0,$valeurs_max_r",
'chxt' => 'y,y,x,x,r,r',
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'|5:|'.$etiquettes_r2,
'chxp' => '1,50|3,0|5,50',
'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
'chm' => 'N ** ,000000,0,-1,8,1.0,ht',
'chxs' => '0,007F00|1,007F00|4,99CC00|5,99CC00');
return $graph;
}
 
private function getEvolImgParMois($param) {
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null;
// Récupération des données
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m') AS periode, COUNT(ci_id_image) AS nbre ".
"FROM cel_images ".
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ".
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : '').
'GROUP BY periode '.
'ORDER BY periode ';
$resulats = $this->executerRequete($requete);
 
$img_totale = array();
foreach ($resulats as $info) {
$img_totale[$info['periode']] = $info['nbre'];
}
 
// Trie des dates pour les étiquettes des axes
$dates = array();
$annees = array();
$les_mois = array();
$pas = 3; // intervalle de mois entre deux étiquettes
$periode = 0;
$cumul = 0;
$img_totale_cumul = array();
foreach ($img_totale as $annee_mois => $nbre) {
$annee = substr($annee_mois, 0, 4);
$mois = substr($annee_mois, 4, 2);
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01"));
$this->debug[] = $mois."/".$mois_fmt_B;
$cumul += $nbre;
$img_totale_cumul[$annee_mois] = $cumul;
 
if (!isset($dates[$annee][$mois])) {
$annees[] = (!isset($dates[$annee]) ? $annee : '');
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
// Ajouter au tableau dates tjrs à la fin
$dates[$annee][$mois] = 1;
}
}
 
// Post traitement des données
$titre = "Évolution du dépôt d'images par mois";
$valeurs_y = implode(',', $img_totale);
$valeurs_r = implode(',', $img_totale_cumul);
$valeurs_max_y = (count($img_totale) > 0 ) ? max($img_totale) : 0;
$valeurs_max_r = (count($img_totale_cumul) > 0 ) ? max($img_totale_cumul) : 0;
$y_val_fin = $valeurs_max_y;
$y_pas = round(($valeurs_max_y / 6), 0);
$r_val_fin = $valeurs_max_r;
$r_pas = round(($valeurs_max_r / 6), 0);
$etiquettes_x1 = implode('|', $les_mois);
$etiquettes_x2 = implode('|', $annees);
$etiquettes_y = 'Images';
$etiquettes_r2 = 'Cumul';
// Construire de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '007F00,99CC00',
'chd' => 't:'.$valeurs_y.'|'.$valeurs_r,
'chds' => "0,$valeurs_max_y,0,$valeurs_max_r",
'chxt' => 'y,y,x,x,r,r',
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'|5:|'.$etiquettes_r2,
'chxp' => '1,50|3,0|5,50',
'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,-1,8,1.0,ht',
'chxs' => '0,007F00|1,007F00|4,99CC00|5,99CC00');
return $graph;
}
 
private function getEvolImgParMoisGlissant($param) {
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null;
// Récupération des données
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m%d') AS periode, COUNT(ci_id_image) AS nbre ".
"FROM cel_images ".
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ".
' AND ci_meta_date_ajout > DATE_SUB(NOW(), INTERVAL 31 DAY) '.
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : '').
'GROUP BY periode '.
'ORDER BY periode ';
$resultats = $this->executerRequete($requete);
 
// Traitement du resultat
$img_totale = array();
if ($resultats !== false) {
foreach ($resultats as $info) {
$img_totale[$info['periode']] = $info['nbre'];
}
}
// Trie des dates pour les étiquettes des axes
$dates = array();
$annees = array();
$annees_mois = array();
$jours = array();
foreach ($img_totale as $annee_mois_jours => $nbre) {
$annee = substr($annee_mois_jours, 0, 4);
$mois = substr($annee_mois_jours, 4, 2);
$jour = substr($annee_mois_jours, 6, 2);
$annee_mois_fmt_B = strftime('%B %Y', mktime(0, 0, 0, $mois, 1, $annee));
if (!isset($dates[$annee][$mois][$jour])) {
$annees_mois[] = (!isset($dates[$annee][$mois]) ? $annee_mois_fmt_B : '');
$jours[] = $jour;
// Ajouter au tableau dates tjrs à la fin
$dates[$annee][$mois][$jour] = 1;
}
}
// Post traitement des données
$titre = "Évolution du dépôt d'images sur un mois glissant";
$valeurs_max = (count($img_totale) > 0) ? max($img_totale) : 0;
$valeurs = implode(',', $img_totale);
$y_val_fin = $valeurs_max;
$y_pas = round($valeurs_max / 6);
$etiquettes_x1 = implode('|', $jours);
$etiquettes_x2 = implode('|', $annees_mois);
$etiquettes_y2 = 'Images';
 
// Construction de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '007F00',
'chd' => 't:'.$valeurs,
'chds' => '0,'.$valeurs_max,
'chxt' => 'y,y,x,x',
'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2,
'chxp' => '0,0|1,50',
'chxr' => "0,0,$y_val_fin,$y_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht',
'chxs' => '0,007F00|1,007F00');
$this->debug[] = $graph;
return $graph;
}
private function getEvolImgParAn($param) {
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null;
// Récupération des données
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y') AS periode, COUNT(ci_id_image) AS nbre ".
"FROM cel_images ".
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ".
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : '').
'GROUP BY periode '.
'ORDER BY periode ';
$resulats = $this->executerRequete($requete);
 
$img_totale = array();
foreach ($resulats as $info) {
$img_totale[$info['periode']] = $info['nbre'];
}
 
// Trie des dates pour les étiquettes des axes
$dates = array();
$annees = array();
foreach ($img_totale as $annee => $nbre) {
if (!isset($dates[$annee])) {
$annees[] = $annee;
$dates[$annee] = 1;
}
}
 
// Post traitement des données
$titre = "Évolution du dépôt d'images par année";
$valeurs = implode(',', $img_totale);
$valeurs_max = (count($img_totale) > 0) ? max($img_totale) : 0;
$valeurs_min = (count($img_totale) > 0) ? min($img_totale) : 0;
$y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min);
$y_val_fin = $valeurs_max;
$y_pas = round(($valeurs_max / 6), 0);
$etiquettes_x = implode('|', $annees);;
$etiquettes_y = 'Images';
 
// Construire de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '007F00',
'chd' => 't:'.$valeurs,
'chds' => "$valeurs_min,$valeurs_max",
'chxt' => 'y,y,x',
'chxl' => '1:|'.$etiquettes_y.'|2:|'.$etiquettes_x.'',
'chxp' => '0,0|1,50|2,0',
'chxr' => "0,$y_val_deb,$y_val_fin,$y_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht',
'chxs' => '0,007F00|1,007F00');
return $graph;
}
private function getEvolUtilisateurParMois($param) {
// Récupération des données
$requete = 'SELECT DISTINCT identifiant , '.
' MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '.
' COUNT(id) AS obs_nbre '.
'FROM cel_inventory '.
"WHERE date_creation != '0000-00-00 00:00:00' ".
" AND identifiant LIKE '%@%' ".
'GROUP BY identifiant '.
'ORDER BY date_min ASC ';
$resultats = $this->executerRequete($requete);
 
// Trie des données et des dates pour les étiquettes des axes
$dates = array();
$annees = array();
$utilisateurs = array();
$les_mois = array();
$pas = 3; // intervalle de mois entre deux étiquettes
$periode = 0;
foreach ($resultats as $enrg) {
$annee = substr($enrg['date_min'], 0, 4);
$mois = substr($enrg['date_min'], 5, 2);
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01"));
 
if (!isset($dates[$annee][$mois])) {
$annees[] = (!isset($dates[$annee]) ? $annee : '');
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
$utilisateurs["$annee-$mois"] = 1;
// Ajouter au tableau dates tjrs à la fin
$dates[$annee][$mois] = 1;
} else {
$utilisateurs["$annee-$mois"]++;
}
}
 
// Post traitement des données
$titre = 'Évolution des utilisateurs par mois';
$valeurs = implode(',', $utilisateurs);
$valeurs_max = max($utilisateurs);
$y_val_fin = $valeurs_max;
$y_pas = 5;
$etiquettes_x1 = implode('|', $les_mois);
$etiquettes_x2 = implode('|', $annees);
$etiquettes_y = 'Utilisateurs';
 
// Construire de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '0000FF',//4D89F9
'chd' => 't:'.$valeurs,
'chds' => '0,'.$valeurs_max,
'chxt' => 'y,y,x,x',
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
'chxp' => '1,50|3,0',
'chxr' => "0,0,$y_val_fin,$y_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,2::2,8,1.0,ht',
'chxs' => '0,0000FF|1,0000FF');
return $graph;
}
 
private function getEvolObsParMoisGlissant($param) {
// Récupération des données
$format_date = '%Y%m%d';
$where = 'date_creation > DATE_SUB(NOW(), INTERVAL 31 DAY)';
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id', $format_date, $where);
 
// Trie des dates pour les étiquettes des axes
$dates = array();
$annees = array();
$annees_mois = array();
$jours = array();
foreach ($obs_totale as $annee_mois_jours => $nbre) {
$annee = substr($annee_mois_jours, 0, 4);
$mois = substr($annee_mois_jours, 4, 2);
$jour = substr($annee_mois_jours, 6, 2);
$annee_mois_fmt_B = strftime('%B %Y', mktime(0, 0, 0, $mois, 1, $annee));
if (!isset($dates[$annee][$mois][$jour])) {
$annees_mois[] = (!isset($dates[$annee][$mois]) ? $annee_mois_fmt_B : '');
$jours[] = $jour;
// Ajouter au tableau dates tjrs à la fin
$dates[$annee][$mois][$jour] = 1;
}
}
// Post traitement des données
$titre = 'Évolution des observations sur un mois glissant';
$valeurs_max = (count($obs_totale) > 0 ) ? max($obs_totale) : 0;
$valeurs = implode(',', $obs_totale);
$y_val_fin = $valeurs_max;
$y_pas = round($valeurs_max / 6);
$etiquettes_x1 = implode('|', $jours);
$etiquettes_x2 = implode('|', $annees_mois);
$etiquettes_y2 = 'Observations';
 
// Construction de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '822013',
'chd' => 't:'.$valeurs,
'chds' => '0,'.$valeurs_max,
'chxt' => 'y,y,x,x',
'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2,
'chxp' => '0,0|1,50',
'chxr' => "0,0,$y_val_fin,$y_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht',
'chxs' => '0,822013|1,822013');
return $graph;
}
 
private function getEvolObsParMois($param) {
// Récupération des données
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id');
 
// Trie des dates pour les étiquettes des axes
$dates = array();
$annees = array();
$les_mois = array();
$pas = 3; // intervalle de mois entre deux étiquettes
$periode = 0;
$cumul = 0;
$obs_totale_cumul = array();
foreach ($obs_totale as $annee_mois => $nbre) {
$annee = substr($annee_mois, 0, 4);
$mois = substr($annee_mois, 4, 2);
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01"));
$cumul += $nbre;
$obs_totale_cumul[$annee_mois] = $cumul;
 
if (!isset($dates[$annee][$mois])) {
$annees[] = (!isset($dates[$annee]) ? $annee : '');
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
// Ajouter au tableau dates tjrs à la fin
$dates[$annee][$mois] = 1;
}
}
 
// Post traitement des données
$titre = 'Évolution des observations par mois';
$valeurs_y = implode(',', $obs_totale);
$valeurs_r = implode(',', $obs_totale_cumul);
$valeurs_max_y = (count($obs_totale) > 0 ) ? max($obs_totale) : 0;
$valeurs_max_r = (count($obs_totale_cumul) > 0 ) ? max($obs_totale_cumul) : 0;
$y_val_fin = $valeurs_max_y;
$y_pas = round(($valeurs_max_y / 6), 0);
$r_val_fin = $valeurs_max_r;
$r_pas = round(($valeurs_max_r / 6), 0);
$etiquettes_x1 = implode('|', $les_mois);
$etiquettes_x2 = implode('|', $annees);
$etiquettes_y2 = 'Observations';
$etiquettes_r2 = 'Cumul';
 
// Construire de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '822013,F1841D',
'chd' => 't:'.$valeurs_y.'|'.$valeurs_r,
'chds' => "0,$valeurs_max_y,0,$valeurs_max_r",
'chxt' => 'y,y,x,x,r,r',
'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2.'|5:|'.$etiquettes_r2.'',
'chxp' => '1,50|3,0|5,50',
'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
'chm' => 'N ** ,000000,0,2::2,8,1.0,ht',
'chxs' => '0,822013|1,822013|4,F1841D|5,F1841D');
return $graph;
}
 
private function getEvolObsParAn($param) {
// Récupération des données
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id', '%Y');
 
// Trie des dates pour les étiquettes des axes
$dates = array();
$annees = array();
foreach ($obs_totale as $annee => $nbre) {
if (!isset($dates[$annee])) {
$annees[] = $annee;
$dates[$annee] = 1;
}
}
 
// Post traitement des données
$titre = 'Évolution des observations par année';
$valeurs = implode(',', $obs_totale);
$valeurs_max = (count($obs_totale) > 0 ) ? max($obs_totale) : 0;
$valeurs_min = (count($obs_totale) > 0 ) ? min($obs_totale) : 0;
$y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min);
$y_val_fin = $valeurs_max;
$y_pas = round(($valeurs_max / 6), 0);
$etiquettes_x = implode('|', $annees);;
$etiquettes_y = 'Observations';
 
// Construire de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '600x200',
'chco' => '822013',
'chd' => 't:'.$valeurs,
'chds' => "$valeurs_min,$valeurs_max",
'chxt' => 'y,y,x',
'chxl' => '1:|'.$etiquettes_y.'|2:|'.$etiquettes_x.'',
'chxp' => '0,0|1,50|2,0',
'chxr' => "0,$y_val_deb,$y_val_fin,$y_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht',
'chxs' => '0,822013|1,822013');
return $graph;
}
 
private function getEvolObsHisto($param) {
// Récupération des données
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id');
$obs_identifiee = $this->executerRequeteEvol('cel_inventory', 'id', "identifiant LIKE '%@%' ");
$lignes = array('total', 'obs. identifiée');
 
// Post traitement des données
$titre = 'Évolution des observations';
$valeurs = implode(',', $obs_totale).'|'.implode(',', $obs_identifiee);
$valeurs_max = (count($obs_totale) > 0 ) ? max($obs_totale) : 0;
$etiquettes = implode('|', array_keys($lignes));
 
// Construire de l'url de l'image
$graph = array('cht' => 'lc',
'chtt' => $titre,
'chs' => '500x300',
'chco' => 'FF0000,00FF00',
'chd' => 't:'.$valeurs,
'chds' => "0,$valeurs_max",
'chxt' => 'y',
'chxl' => '0:|'.$etiquettes.'',
'chm' => 'N,000000,0,-1,10');
return $graph;
}
 
private function getNbreObsIdVsTest($param) {
// Récupération des données
$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id');
$obs_identifiee = $this->executerRequeteNombre('cel_inventory', 'id', "identifiant LIKE '%@%' ");
$obs_test = $obs_totale - $obs_identifiee;
$pourcent_identifiee = round(($obs_identifiee / ($obs_totale / 100)), 2).'%';
$pourcent_anonyme = round(($obs_test / ($obs_totale / 100)), 2).'%';
 
// Post traitement des données de la base de données
$titre = "Nombre d'observations|tests vs. identifiées";
$etiquette_obs_test = "tests ($obs_test - $pourcent_anonyme)";
$etiquette_obs_id = "identifiées ($obs_identifiee - $pourcent_identifiee)";
$donnees = array($etiquette_obs_test => $obs_test, $etiquette_obs_id => $obs_identifiee);
$valeurs = implode(',', $donnees);
$etiquettes = implode('|', array_keys($donnees));
 
// Construire les paramêtres de l'url de l'image
$graph = array('cht' => 'p3',
'chtt' => $titre,
'chs' => '250x200',
'chco' => 'FF0000,00FF00',
'chd' => 't:'.$valeurs,
'chds' => "0,$obs_totale",
'chdl' => $etiquettes,
'chdlp' => 'bv|r',
'chts' => '000000,12');
return $graph;
}
 
private function getNbreObsPublicVsPrivee($param) {
// Récupération des données
$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id');
$obs_public = $this->executerRequeteNombre('cel_inventory', 'id', 'transmission = 1');
$obs_privee = $obs_totale - $obs_public;
$pourcent_privee = round(($obs_privee / ($obs_totale / 100)), 2).'%';
$pourcent_public = round(($obs_public / ($obs_totale / 100)), 2).'%';
 
// Post traitement des données de la base de données
$titre = "Nombre d'observations|publiques vs. privées";
$etiquette_obs_public = "publiques ($obs_public - $pourcent_public)";
$etiquette_obs_privee = "privées ($obs_privee - $pourcent_privee)";
$donnees = array($etiquette_obs_privee => $obs_privee, $etiquette_obs_public => $obs_public);
$valeurs = implode(',', $donnees);
$etiquettes = implode('|', array_keys($donnees));
 
// Construire les paramêtres du graph
$graph = array('cht' => 'p3',
'chtt' => $titre,
'chs' => '250x200',
'chco' => 'FF0000,00FF00',
'chd' => 't:'.$valeurs,
'chds' => "0,$obs_totale",
'chdl' => $etiquettes,
'chdlp' => 'bv|r',
'chts' => '000000,12');
return $graph;
}
 
private function getNbreObsDetermineeVsInconnue($param) {
// Récupération des données
$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id');
$obs_determinee = $this->executerRequeteNombre('cel_inventory', 'id', 'num_nom_sel != 0');
$obs_inconnue = $obs_totale - $obs_determinee;
$pourcent_determinee = round(($obs_determinee / ($obs_totale / 100)), 2).'%';
$pourcent_inconnue = round(($obs_inconnue / ($obs_totale / 100)), 2).'%';
 
// Post traitement des données de la base de données
$titre = "Nombre d'observations|determinées vs. inconnues";
$etiquette_obs_determinee = "determinées ($obs_determinee - $pourcent_determinee)";
$etiquette_obs_inconnue = "non déterminées ($obs_inconnue - $pourcent_inconnue)";
$donnees = array($etiquette_obs_inconnue => $obs_inconnue, $etiquette_obs_determinee => $obs_determinee);
$valeurs = implode(',', $donnees);
$etiquettes = implode('|', array_keys($donnees));
 
// Construire les paramêtres du graph
$graph = array('cht' => 'p3',
'chtt' => $titre,
'chs' => '250x200',
'chco' => 'FF0000,00FF00',
'chd' => 't:'.$valeurs,
'chds' => "0,$obs_totale",
'chdl' => $etiquettes,
'chdlp' => 'bv|r',
'chts' => '000000,12');
return $graph;
}
 
private function getNbreObsAvecIndicationGeo($param) {
// Récupération des données
$total = $this->executerRequeteNombre('cel_inventory', 'id');
$where_commune = $this->creerWhereIndicationGeo('location');
$obs['commune'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_commune);
$where_commune_id = $this->creerWhereIndicationGeo('id_location');
$obs['commune identifiée'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_commune_id);
$where_lieudit = $this->creerWhereIndicationGeo('lieudit');
$obs['lieu-dit'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_lieudit);
$where_station = $this->creerWhereIndicationGeo('station');
$obs['station'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_station);
$where_milieu = $this->creerWhereIndicationGeo('milieu');
$obs['milieu'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_milieu);
$where_xy = $this->creerWhereIndicationGeo('coord_x').' AND '.$this->creerWhereIndicationGeo('coord_y');
$obs['coordonnée'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_xy);
 
$donnees = array();
$num = 1;
foreach ($obs as $etiquette => $nbre) {
$pourcent = round(($obs[$etiquette] / ($total / 100)), 1).'%';
$legende = "$num : $etiquette ($nbre - $pourcent)";
$donnees['valeurs'][] = $nbre;
$donnees['etiquettes'][] = $num++;
$donnees['legendes'][] = $legende;
}
 
 
// Post traitement des données de la base de données
$titre = "Nombre d'observations|avec indications géographiques";
$valeurs = implode(',', $donnees['valeurs']);
$etiquettes = implode('|', $donnees['etiquettes']);
$legendes = implode('|', $donnees['legendes']);
 
// Construire les paramêtres du graph
$graph = array('cht' => 'rs',
'chtt' => $titre,
'chs' => '600x300',
'chco' => 'FFFFFF',
'chd' => 't:'.$valeurs,
'chds' => "0,$total",
'chdl' => $legendes,
'chxt' => 'x',
'chxl' => "0:|$etiquettes",
//'chxp' => '1,0,20,40,60,80,100',// Grille sous forme de cible
'chm' => 'B,FF000080,0,1.0,5.0');
return $graph;
}
private function creerWhereIndicationGeo($champ) {
$where = null;
if (isset($champ)) {
$where = "$champ != '000null' ".
"AND $champ != '' ".
"AND $champ IS NOT NULL ";
}
return $where;
}
 
private function getUtilisationJournaliere($param) {
// Sur quel jour, voulons nous estimer l'utilisation
$aujourdhui = date('Y-m-d');
if (isset($param[0]) && preg_match('/^[0-9]{4}(?:-[0-9]{2}){2}$/', $param[0])) {
$aujourdhui = $param[0];
}
$aujourdhui_fmt = strftime('%d %b %Y', strtotime($aujourdhui));
 
// Récupération des données
$max_obs = array();
$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d',
"date_creation NOT LIKE '$aujourdhui%' ", 'date_creation');
$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d',
"date_modification NOT LIKE '$aujourdhui%' ", 'date_modification');
$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d',
"date_transmission NOT LIKE '$aujourdhui%' ", 'date_transmission');
$obs_aujourdhui = $this->executerRequeteNombre('cel_inventory', 'id',
"(date_creation LIKE '$aujourdhui%'
OR date_modification LIKE '$aujourdhui%'
OR date_transmission LIKE '$aujourdhui%') ");
// Cummul des obs crées, modifiées, transmises par jour
$donnees = array();
foreach ($max_obs as $obs_par_jour) {
foreach ($obs_par_jour as $annee_mois_jour => $nbre) {
if (!isset($donnees[$annee_mois_jour])) {
$donnees[$annee_mois_jour] = $nbre;
} else {
$donnees[$annee_mois_jour] += $nbre;
}
}
}
 
// Post traitement des données
$valeur = $obs_aujourdhui;
$valeur_max = 400;
if ($valeur > $valeur_max) {
$pourcentage = 100;
} else {
$pourcentage = round(($valeur / ($valeur_max / 100)), 0);
}
$etiquettes_x = $aujourdhui_fmt;
$etiquettes_y = "faible|moyenne|forte";
$titre = "Intensité d'utilisation pour le $aujourdhui_fmt";
$legende = "$valeur changements";
 
// Construire de l'url de l'image
$graph = array('cht' => 'gom',
'chtt' => $titre,
'chdl' => "$legende",
'chdlp' => 'b',
'chs' => '350x200',
'chco' => 'FFFF00,0A7318',
'chls' => '3|10',
'chma' => '0,0,0,0|300,40',
'chd' => 't:'.$pourcentage,
'chxt' => 'x,y',
'chxl' => '0:|'.$etiquettes_x.'|1:|'.$etiquettes_y.'',
'chxp' => '0,50');
return $graph;
}
 
private function getNbreObsParUtilisateur($param) {
// Récupération des données
$requete = 'SELECT identifiant, COUNT(id) AS nbre '.
'FROM cel_inventory '.
'GROUP BY identifiant ';
$utilisateurs = $this->executerRequete($requete);
 
// Création des classes d'utilisateurs
$classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0);
$donnees['Utilisateurs'] = $classes;
$valeur_max = 0;
foreach ($utilisateurs as $utilisateur) {
$id = $utilisateur['identifiant'];
$nbre = $utilisateur['nbre'];
 
// Détermination de la classe
$classe = '';
if (0 < $nbre && $nbre <= 10) {
$classe = '00->10';
} else if (10 < $nbre && $nbre <= 50) {
$classe = '11->50';
} else if (50 < $nbre && $nbre <= 100) {
$classe = '51->100';
} else if (100 < $nbre && $nbre <= 500) {
$classe = '101->500';
} else if (500 < $nbre) {
$classe = '500->∞';
}
 
// Détermination du type d'utilisateur
if (strstr($id, '@')) {
$type = 'Utilisateurs';
// Incrémentation du tableau de données et récupration de la valeur max
$donnees[$type][$classe]++;
if ($donnees[$type][$classe] > $valeur_max) {
$valeur_max = $donnees[$type][$classe];
}
}
}
 
// Post traitement des données
$titre = "Nombre d'observations par utilisateur";
$y1_val_fin = $valeur_max;
$y1_pas = '100';
$valeurs = implode(',', $donnees['Utilisateurs']);
$etiquettes_x1 = implode('|', array_keys($classes));
$etiquettes_x2 = 'Observations';
$etiquettes_y2 = 'Utilisateurs';
$legendes = implode('|', array_keys($donnees));
 
// Construire de l'url de l'image
$graph = array('cht' => 'bvg',
'chtt' => $titre,
'chs' => '400x200',
'chco' => '00FF00,FF0000',
'chbh' => 'r,0.3,1',
'chd' => 't:'.$valeurs,
'chds' => "0,$valeur_max",
'chxt' => 'x,x,y,y',
'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'',
'chxp' => '1,100|3,100',
'chxr' => "2,0,$y1_val_fin,$y1_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e');
//echo '<pre>'.print_r($graph,true).'</pre>';
return $graph;
}
 
private function getNbreObsParUtilisateurEtTest($param) {
// Récupération des données
$requete = 'SELECT identifiant, COUNT(id) AS nbre '.
'FROM cel_inventory '.
'GROUP BY identifiant ';
$utilisateurs = $this->executerRequete($requete);
 
// Création des classes d'utilisateurs
$classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0);
$donnees['Utilisateurs'] = $classes;
$donnees['Tests'] = $classes;
$valeur_max = 0;
foreach ($utilisateurs as $utilisateur) {
$id = $utilisateur['identifiant'];
$nbre = $utilisateur['nbre'];
 
// Détermination de la classe
$classe = '';
if (0 < $nbre && $nbre <= 10) {
$classe = '00->10';
} else if (10 < $nbre && $nbre <= 50) {
$classe = '11->50';
} else if (50 < $nbre && $nbre <= 100) {
$classe = '51->100';
} else if (100 < $nbre && $nbre <= 500) {
$classe = '101->500';
} else if (500 < $nbre) {
$classe = '500->∞';
}
 
// Détermination du type d'utilisateur
if (strstr($id, '@')) {
$type = 'Utilisateurs';
} else {
$type = 'Tests';
}
 
// Incrémentation du tableau de données et récupration de la valeur max
$donnees[$type][$classe]++;
if ($donnees[$type][$classe] > $valeur_max) {
$valeur_max = $donnees[$type][$classe];
}
}
 
// Post traitement des données
$titre = "Nombre d'observations par utilisateur et test";
$y1_val_fin = $valeur_max;
$y1_pas = '100';
$valeurs = implode(',', $donnees['Utilisateurs']).'|'.implode(',', $donnees['Tests']);
$etiquettes_x1 = implode('|', array_keys($classes));
$etiquettes_x2 = 'Observations';
$etiquettes_y2 = 'Utilisateurs';
$legendes = implode('|', array_keys($donnees));
 
// Construire de l'url de l'image
$graph = array('cht' => 'bvg',
'chtt' => $titre,
'chs' => '400x200',
'chco' => '00FF00,FF0000',
'chbh' => 'r,0.3,1',
'chd' => 't:'.$valeurs,
'chds' => "0,$valeur_max",
'chxt' => 'x,x,y,y',
'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'',
'chxp' => '1,100|3,100',
'chxr' => "2,0,$y1_val_fin,$y1_pas",
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e|N,000000,1,0::1,8,1.0,e',
'chdl' => $legendes,
'chdlp' => 'b');
//echo '<pre>'.print_r($graph,true).'</pre>';
return $graph;
}
 
private function getNuagePointsObsParHeureEtJourSemaine($param) {
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : false;
// Récupération des données de la base
$requete = 'SELECT identifiant, DATE_FORMAT(date_creation, "%w-%H") AS periode, (ROUND(LOG10(COUNT(id))) + 1) AS nbre '.
'FROM cel_inventory '.
'WHERE date_creation != "0000-00-00 00:00:00" '.
' AND identifiant '.($utilisateur ? "= $utilisateur " : 'LIKE "%@%" ').
'GROUP BY periode, identifiant ';
$infos = $this->executerRequete($requete);
// Traitement résulat requête
$observations = array();
foreach ($infos as $info) {
if (isset($observations[$info['periode']])) {
$observations[$info['periode']] += $info['nbre'];
} else {
$observations[$info['periode']] = $info['nbre'];
}
}
// Postraitement des données
// Jour de la semaine
$donnees['joursSemaine'] = array();
for ($njs = 0; $njs < 7; $njs++) {
$donnees['joursSemaine'][] = strftime('%A', strtotime('2010-05-'.(16+$njs)));
}
// Heure
$donnees['heures'] = array();
for ($h = 0; $h < 24; $h++) {
$heure_fmt = sprintf('%02s', $h);// Format numérique 00
$donnees['heures'][] = strftime('%H', strtotime("0000-00-00 $heure_fmt:00:00"));
}
// Nbre
$valeur_max = max($observations);
for ($njs = 0; $njs < 7; $njs++) {
for ($h = 0; $h < 24; $h++) {
$hfmt = sprintf('%02s', $h);// Format numérique 00
$periode = $njs.'-'.$hfmt;
$donnees['valeurs_x'][] = round(($h + 1) * (100 / 24), 0);
$donnees['valeurs_y'][] = round(($njs + 1) * (100 / 7), 0);
$ps = 0;
if (isset($observations[$periode])) {
$ps = round($observations[$periode] * (100 / $valeur_max), 0);
}
$donnees['valeurs_ps'][] = $ps;
}
}
//echo '<pre>'.print_r($donnees,true).'</pre>';
// Préparation des paramêtres du graph
$titre = "Nombre de création d'observation|par heure et jour de la semaine";
$valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']);
$etiquettes_x1 = '|'.implode('|', $donnees['heures']);
$etiquettes_x2 = 'Heures';
$etiquettes_y1 = '|'.implode('|', $donnees['joursSemaine']);
$x_axis_step_size = str_replace(',', '.', (100 / 24));
$y_axis_step_size = str_replace(',', '.', (100 / 7));
 
// Construction du tableau des paramêtres du graph
$graph = array('cht' => 's',
'chtt' => $titre,
'chs' => '400x200',
'chco' => '00FF00',
'chd' => 't:'.$valeurs,
'chxt' => 'x,x,y',
'chxr' => "0,-1,23,1|2,-1,6,1",
'chxp' => '1,100',
'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'',
'chg' => "$x_axis_step_size,$y_axis_step_size,1,5");
//echo '<pre>'.print_r($graph,true).'</pre>';
return $graph;
}
 
private function getNuagePointsObsAnciennete($param) {
// Récupération des données de la base
$requete = 'SELECT DISTINCT identifiant , '.
' MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '.
' COUNT(id) AS obs_nbre '.
'FROM cel_inventory '.
"WHERE date_creation != '0000-00-00 00:00:00' ".
" AND identifiant LIKE '%@%' ".
'GROUP BY identifiant '.
'ORDER BY date_min ASC ';
$resultats = $this->executerRequete($requete);
 
// Trie des données
$max_obs = 0;
$max_obs_log = 0;
$max_anciennete = 0;
$donnees = array();
foreach ($resultats as $enrg) {
$tps_deb = strtotime($enrg['date_min']);
$tps_fin = strtotime($enrg['date_max']);
 
$donnee = array();
if (($tps_fin - $tps_deb) == 0) {
$donnee['anciennete'] = 1;
} else {
$donnee['anciennete'] = round((($tps_fin - $tps_deb) / 86400), 0);
}
$donnee['obs'] = $enrg['obs_nbre'];
$donnee['obs_log'] = log10($enrg['obs_nbre']);
$donnees[] = $donnee;
 
$max_obs_log = ($donnee['obs_log'] > $max_obs_log) ? $donnee['obs_log'] : $max_obs_log;
$max_obs = ($donnee['obs'] > $max_obs) ? $donnee['obs'] : $max_obs;
$max_anciennete = ($donnee['anciennete'] > $max_anciennete) ? $donnee['anciennete'] : $max_anciennete;
}
 
// Postraitement des données
foreach ($donnees as $donnee) {
$donnees['valeurs_x'][] = round($donnee['anciennete'] * (100 / $max_anciennete), 0);
$donnees['valeurs_y'][] = round($donnee['obs_log'] * (100 / $max_obs_log), 0);
$donnees['valeurs_ps'][] = 20;
}
 
// Échelle log des obs
$donnees['echelle_y1'] = array();
$pas = $max_obs_log / 100 ;
for ($i = 0 ; $i < 5 ; $i++) {
$donnees['echelle_y1'][] = round(pow(10, (($i*20) * $pas)), 0);
}
$donnees['echelle_y1'][] = $max_obs;
 
//echo '<pre>'.print_r($donnees['valeurs_x'],true).'</pre>';
// Préparation des paramêtres du graph
$titre = "Répartition des utilisateurs en fonction|du nombre d'observations et de l'ancienneté";
$valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']);
$etiquettes_x2 = 'Ancienneté en jours';
$etiquettes_y1 = implode('|', $donnees['echelle_y1']);
$etiquettes_y2 = 'Observations';
$x_axis_step_size = $max_anciennete;
 
// Construction du tableau des paramêtres du graph
$graph = array('cht' => 's',
'chtt' => $titre,
'chs' => '400x200',
'chco' => '0000FF',
'chxt' => 'x,x,y,y',
'chd' => 't:'.$valeurs,
'chxr' => "0,0,$x_axis_step_size|2,0,$max_obs",//|2,0,$y_axis_step_size,$pas
'chxp' => '1,100|3,100',
'chm' => 'h,C3C3C3,0,-0.2,0.2,-1',
'chxl' => '1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'|3:|'.$etiquettes_y2.'');//
//echo '<pre>'.print_r($graph,true).'</pre>';
return $graph;
}
 
private function executerRequeteEvol($table, $champ, $format_date = '%Y%m', $where = null, $champ_date = 'date_creation', $order_by = null, $limit = null) {
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : false;
$requete = "SELECT DATE_FORMAT($champ_date, '$format_date') AS periode, COUNT($champ) AS nbre ".
"FROM $table ".
"WHERE $champ_date != '0000-00-00 00:00:00' ".
(($utilisateur != false) ? " AND identifiant = $utilisateur " : '').
((is_null($where)) ? '' : " AND $where ").
'GROUP BY periode '.
((is_null($order_by)) ? '' : "ORDER BY $order_by ");
((is_null($limit)) ? '' : "LIMIT $limit ");
$evolution = $this->executerRequete($requete);
 
// Traitement du tableau
$donnees_traitees = array();
if ($evolution !== false) {
foreach ($evolution as $info) {
$donnees_traitees[$info['periode']] = $info['nbre'];
}
}
return $donnees_traitees;
}
 
private function executerRequeteNombre($table, $champ, $where = null) {
$utilisateur = null;
if (isset($_GET['utilisateur'])) {
$utilisateur = $this->bdd->quote($_GET['utilisateur']);
$where = isset($where) ? $where.' AND ' : '';
$where .= "identifiant = $utilisateur ";
}
$requete = "SELECT COUNT($champ) AS nbre ".
"FROM $table ".
((isset($where)) ? "WHERE $where " : '');
$nbre = $this->executerRequete($requete, 'Column');
return $nbre;
}
}
/tags/celw-v1.1/jrest/services/InventoryByDept.php
New file
0,0 → 1,146
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <delon@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/
*/
 
/**
*
* in=utf8
* out=iso3859
*
* Liste des Nouvelles observations par departement
* A voir avec David mais ne devrait plus être utilisé
* ou fait autrement
*
*/
class InventoryByDept extends Cel {
 
var $extendSpreadsheetProductor;
function InventoryByDept($config) {
 
parent::__construct($config);
// Pas d'heritage multiple en php :(
$this->extendSpreadsheetProductor = new SpreadsheetProductor();
$this->extendSpreadsheetProductor->initSpreadsheet();
}
//TODO : faire une fonction qui prend en paramètre un departement
function getRessource(){
$requete_obs = "SELECT ce_zone_geo, ce_utilisateur, courriel_utilisateur, ordre, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, zone_geo, date_observation," .
" lieudit, station, milieu, commentaire, transmission FROM cel_obs ".
"WHERE ce_zone_geo != '000null' AND ce_zone_geo != '' AND transmission = 1 AND nt!=0 ORDER BY ce_zone_geo, nom_ret LIMIT 50";
 
$resultat_obs = $this->executerRequete($requete_obs);
// Creating a workbook
$workbook = new Spreadsheet_Excel_Writer();
// Creating a worksheet
$worksheet = $workbook->addWorksheet('Liste');
 
$worksheet->write(0,0,'Departement');
$worksheet->write(0,1,'Nom saisi');
$worksheet->write(0,2,'Numero nomenclatural');
$worksheet->write(0,3,'Nom retenu');
$worksheet->write(0,4,'Numero nomenclatural nom retenu');
$worksheet->write(0,5,'Numero taxonomique');
$worksheet->write(0,6,'Famille');
$worksheet->write(0,7,'Commune');
$worksheet->write(0,8,'Date Observation');
$worksheet->write(0,9,'Lieu dit');
$worksheet->write(0,10,'Station');
$worksheet->write(0,11,'Milieu');
$worksheet->write(0,12,'Commentaire');
$worksheet->write(0,13,'Observateur');
 
$i=1;
$observations = array();
$chercheur_infos_taxon = null;
if (is_array($resultat_obs)) {
$observations = &$resultat_obs;
$chercheur_infos_taxon = new RechercheInfosTaxon($this->config);
}
foreach ($observations as $obs) {
 
$code_departement = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']);
$taxon_deja_vu = $chercheur_infos_taxon->taxonEstPresentDansDepartement($obs['nt'], $code_departement);
if (!$taxon_deja_vu) {
// Denullifiage
foreach($obs as $k=>$v) {
if (($v=="null") || ($v=="000null")) {
$obs[$k]="";
}
else {
$obs[$k]=utf8_decode($v);
}
}
 
if ($obs['date_observation']!="0000-00-00 00:00:00") {
list($year,$month,$day)= split ('-',$obs['date_observation']);
list($day)= split (' ',$day);
$obs['date_observation']=$day."/".$month."/".$year;
}
else {
$obs['date_observation']="00/00/0000";
}
 
$worksheet->write($i,0,$code_departement);
$worksheet->write($i,1,$obs['nom_sel']);
$worksheet->write($i,2,$obs['nom_sel_nn']);
$worksheet->write($i,3,$obs['nom_ret']);
$worksheet->write($i,4,$obs['nom_ret_nn']);
$worksheet->write($i,5,$obs['nt']);
$worksheet->write($i,6,$obs['famille']);
$worksheet->write($i,7,$obs['zone_geo']);
$worksheet->write($i,8,$obs['date_observation']);
$worksheet->write($i,9,$obs['lieudit']);
$worksheet->write($i,10,$obs['station']);
$worksheet->write($i,11,$obs['milieu']);
$worksheet->write($i,12,$obs['commentaire']);
$worksheet->write($i,13,$obs['courriel_utilisateur']);
$i++;
}
}
// sending HTTP headers
$workbook->send('liste.xls');
$workbook->close();
exit();
}
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.1 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.2 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.1 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
?>
/tags/celw-v1.1/jrest/services/InventoryObservationList.php
New file
0,0 → 1,126
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* InventoryObservationList.php
*
* in=utf8
* out=utf8
*
* Cas d'utilisation :
* 1: Service recherche d'observations a partir de divers critères
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service renvoie la liste des observations correspondantes
*
* 2: Service modification en masse d'observations
* a: Le service recherche les observations correspondant aux identifiants donnés
* b: Le service modifie les observations correspondantes avec les infos données en paramètres
*
* 3: Service de suppression d'observations en masse
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service supprime la liste des observations correspondantes
*/
class InventoryObservationList extends Cel {
/**
* renvoie les observations correspondant au critères de filtrage
*
* uid[0] : utilisateur obligatoire
* uid[1] : criteres de filtrage de la forme critere1=valeur1&critere2=valeur2
*/
function getElement($uid)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$chercheur_observations = new RechercheObservation($this->config);
 
$numero_page = 0;
$taille_page = 50;
$criteres = array();
 
if (isset($uid[1]))
{
$criteres = $chercheur_observations->parserRequeteCriteres($uid[1]) ;
if (isset($criteres['numero_page']) && isset($criteres['limite'])) {
$numero_page = $criteres['numero_page'];
$taille_page = $criteres['limite'];
}
}
 
$retour = $chercheur_observations->rechercherObservations($uid[0], $criteres, $numero_page, $taille_page);
$retour_encode = json_encode($retour) ;
 
header("Content-type: application/json");
print($retour_encode);
exit();
}
 
/**
* met à jour les métadonnées d'une liste d'observations
*
* uid[0] : utilisateur obligatoire
* uid[1] : ordres des observations à modifier séparés par des virgules
* pairs : données à mettre à jour sous la forme de clés => valeurs
*/
function updateElement($uid,$pairs) {
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if (!isset($uid[1])) {
//TODO: envoyer un message d'erreur
return;
}
$uid[1] = rtrim($uid[1],',');
$gestionnaire_observation = new GestionObservation($this->config);
$modification_observation = $gestionnaire_observation->modifierObservation($uid[0],$uid[1],$pairs);
return true;
}
 
/**
* Supprime une liste d'observations
*
* uid[0] : utilisateur obligatoire
* uid[1] : ordres des observations à supprimer séparés par des virgules
*/
function deleteElement($uid)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if (!isset($uid[1])) {
//TODO: envoyer un message d'erreur
return;
}
$uid[1] = rtrim($uid[1],',');
$gestionnaire_observation = new GestionObservation($this->config);
$modification_observation = $gestionnaire_observation->supprimerObservation($uid[0],$uid[1]);
if ($modification_observation) {
echo "OK";
}
exit() ;
}
}
?>
/tags/celw-v1.1/jrest/services/InventoryItemList.php
New file
0,0 → 1,199
<?php
 
 
// In : utf8
// Out : utf8
 
Class InventoryItemList extends DBAccessor {
 
 
var $config;
function InventoryItemList($config) {
 
$this->config=$config;
}
 
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
// uid[0] : utilisateur obligatoire
// uid[1] : si absent : valeur 'all' (departement)
// uid[2] : si absent : valeur 'all' (commune)
// uid[3] : si absent : valeur 'all' (annee)
// uid[4] : si absent : valeur 'all' (mois)
// uid[5] : si absent : valeur 'all' (jour)
// uid[6] : si absent : valeur 'all' (recherche libre)
// uid[7] : si absent : valeur 'all' (lieudit)
// uid[8] et uid[9] : selection intervalle
$DB=$this->connectDB($this->config,'database_cel');
 
 
if (!isset($uid[1]) || $uid[1]=="" || $uid[1]=="all" ) {
$uid[1]="all";
$query_id_location="";
}
else {
$query_id_location=" AND id_location='".$DB->escapeSimple($uid[1])."' ";
}
 
if (!isset($uid[2]) || $uid[2]=="" || $uid[2]=="all" ) {
$uid[2]="all";
$query_location="";
}
else {
$query_location=" AND location='".$DB->escapeSimple($uid[2])."' ";
}
if (!isset($uid[3]) || $uid[3]=="" || $uid[3]=="all") {
$uid[3]="all";
$query_year="";
}
else {
$query_year=" AND year(date_observation)='".$DB->escapeSimple($uid[3])."' ";
}
 
if (!isset($uid[4]) || $uid[4]=="" || $uid[4]=="all") {
$uid[4]="all";
$query_month="";
}
else {
$query_month=" AND month(date_observation)='".$DB->escapeSimple($uid[4])."' ";
}
 
if (!isset($uid[5]) || $uid[5]=="" || $uid[5]=="all") {
$uid[5]="all";
$query_day="";
}
else {
$query_day=" AND day(date_observation)='".$DB->escapeSimple($uid[5])."' ";
}
if (!isset($uid[6]) || $uid[6]=="" || $uid[6]=="all") {
$uid[6]="all";
$query_libre="";
}
else {
$query_libre=" AND (nom_sel like '%".$DB->escapeSimple($uid[6])."%' OR nom_ret like '%".$DB->escapeSimple($uid[6])."%' OR station like '%".$DB->escapeSimple($uid[6])."%' OR milieu like '%".$DB->escapeSimple($uid[6])."%' OR commentaire like '%".$DB->escapeSimple($uid[6])."%') ";
}
 
if (!isset($uid[7]) || $uid[7]=="" || $uid[7]=="all") {
$uid[7]="all";
$query_lieudit="";
}
else {
$query_lieudit=" AND lieudit='".$DB->escapeSimple($uid[7])."' ";
}
 
$value=array();
if (isset($uid[8]) && isset($uid[9])) {
$query="SELECT identifiant, ordre, nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, date_observation," .
" lieudit, station, milieu, commentaire, transmission FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
$query_id_location.
$query_location.
$query_year.
$query_month.
$query_day.
$query_libre.
$query_lieudit.
" ORDER BY ordre LIMIT ".$uid[8].",".$uid[9];
}
else {
if (isset($uid[8])) {
// les n derniers
$query="SELECT identifiant, ordre, nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, date_observation," .
" lieudit, station, milieu, commentaire, transmission FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
$query_id_location.
$query_location.
$query_year.
$query_month.
$query_day.
$query_libre.
$query_lieudit.
" ORDER BY ordre LIMIT ".$uid[8].",18446744073709551615";
}
else {
$query="SELECT count(*) as count FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."'" .
$query_id_location.
$query_location.
$query_year.
$query_month.
$query_day.
$query_libre.
$query_lieudit;
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$value=$row['count'];
}
$output = json_encode((integer)$value);
print($output);
return true;
}
}
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
if ($row['date_observation']!="0000-00-00 00:00:00") {
list($year,$month,$day)= split ('-',$row['date_observation']);
list($day)= split (' ',$day);
$row['date_observation']=$day."/".$month."/".$year;
}
$value[]=array($row['nom_sel'], $row['num_nom_sel'],$row['nom_ret'],$row['num_nom_ret'],$row['num_taxon'],$row['famille'], $row['location'], $row['ordre'], $row['date_observation'], $row['lieudit'], $row['station'], $row['milieu'], $row['commentaire'], $row['transmission']);
}
$output = json_encode($value);
print($output);
return true;
 
 
}
 
 
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.7 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.6 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.5 2007-05-22 12:54:08 ddelon
* Securisation acces utilisateur
*
*
*
*/
 
?>
/tags/celw-v1.1/jrest/services/squelettes/opml.tpl.xml
New file
0,0 → 1,18
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?>
<opml version="1.0">
<head>
<text/>
</head>
<body>
<outline text="CEL">
<?php foreach ($liste_flux as $flux) : ?>
<outline title="<?=$flux['titre']?>"
description="<?=$flux['description']?>"
htmlUrl="<?=$flux['url_html']?>"
xmlUrl="<?=$flux['url_xml']?>"
type="<?=$flux['type']?>"
text="<?=$flux['texte']?>"/>
<?php endforeach; ?>
</outline>
</body>
</opml>
/tags/celw-v1.1/jrest/services/squelettes/rss1.tpl.xml
New file
0,0 → 1,45
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?>
 
<!DOCTYPE rdf:RDF [
<!ENTITY % HTMLlat1 PUBLIC
"-//W3C//ENTITIES Latin 1 for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
%HTMLlat1;
]>
 
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns="http://purl.org/rss/1.0/">
 
<channel rdf:about="<?=$guid?>">
<title><?=$titre?></title>
<link><?=$lien_cel?></link>
<description><?=$description?></description>
<dc:publisher><?=$editeur?></dc:publisher>
<dc:date><?=$date_maj_W3C?></dc:date>
<?php if (isset($items)) : ?>
<items>
<rdf:Seq>
<?php foreach ($items as $item) : ?>
<rdf:li resource="<?=$item['guid']?>" />
<?php endforeach; ?>
</rdf:Seq>
</items>
<?php endif; ?>
 
</channel>
<?php if (isset($items)) : ?>
<?php foreach ($items as $item) : ?>
<item rdf:about="<?=$item['guid']?>">
<title><?=$item['titre']?></title>
<link><?=(isset($item['lien'])) ? $item['lien'] : 'http://www.tela-botanica.org/'?></link>
<description><?=$item['description_encodee']?></description>
<dc:date><?=$item['date_maj_W3C']?></dc:date>
</item>
<?php endforeach; ?>
<?php endif; ?>
</rdf:RDF>
/tags/celw-v1.1/jrest/services/squelettes/rss2.tpl.xml
New file
0,0 → 1,25
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title><?=$titre?></title>
<link><?=$lien_cel?></link>
<atom:link href="<?=$lien_service?>" rel="self" type="application/rss+xml" />
<description><?=$description?></description>
<?php if (isset($items)) : ?>
<?php foreach ($items as $item) : ?>
<item>
<guid><?=$item['guid']?></guid>
<title><?=$item['titre']?></title>
<? if (isset($item['lien'])) : ?>
<link><?=$item['lien']?></link>
<? endif; ?>
<description><?=$item['description_encodee']?></description>
<category><?= $item['categorie'] ?></category>
<pubDate><?=$item['date_maj_RSS']?></pubDate>
</item>
<?php endforeach; ?>
<?php endif; ?>
</channel>
</rss>
/tags/celw-v1.1/jrest/services/squelettes/doublon_defaut.tpl.html
New file
0,0 → 1,52
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Images en doublon - <?=$utilisateur?></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<style type="text/css">
html, body{
margin:0;
padding:0;
height: 100%;
font-family: Arial;
font-size: 12px;
}
ul{
list-style-type:none;
}
.doublon{
float:left;
}
.doublon-liste{
clear:left;
}
</style>
<!-- JavaScript -->
<script type="text/javascript" src="http://www.tela-botanica.org/commun/jquery/1.4.4/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="http://www.tela-botanica.org/commun/jquery/lazyload/1.5.0/jquery.lazyload.mini.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("img").lazyload();
});
</script>
</head>
 
<body>
<h1><?=count($doublons)?> images en doublon - <?=$utilisateur?></h1>
<ul>
<?php foreach ($doublons as $doublon) : ?>
<li class="doublon-liste">
<?php foreach ($doublon as $img) : ?>
<ul class="doublon">
<li>Image : <?=$img['img_ordre']?></li>
<li>Observation(s) : <?=implode(', ', $img['obs_ordre'])?></li>
<li><img src="<?=$img['url']?>" alt="Id #<?=$img['img_id']?>"/></li>
</ul>
<?php endforeach; ?>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
/tags/celw-v1.1/jrest/services/squelettes/atom.tpl.xml
New file
0,0 → 1,35
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><?=$titre?></title>
<link href="<?=$lien_cel?>" rel="alternate" type="text/html" hreflang="fr" />
<link href="<?=$lien_service?>" rel="self" type="application/atom+xml"/>
<updated><?=$date_maj_ATOM?></updated>
<author>
<name><?=$editeur?></name>
</author>
<id><?=$guid?></id>
<rights>Copyright (c) <?=$annee_courante?>, <?=$editeur?></rights>
<generator uri="<?=$lien_service?>" version="<?=$generateur_version?>"><?=$generateur?></generator>
 
<?php if (isset($items)) : ?>
<?php foreach ($items as $item) : ?>
<entry>
<id><?=$item['guid']?></id>
<title><?=$item['titre']?></title>
<? if (isset($item['lien'])) : ?>
<link href="<?=$item['lien']?>"/>
<? endif; ?>
<updated><?=$item['date_maj_ATOM']?></updated>
<author><name><?=$item['modifier_par']?></name></author>
<content type="xhtml" xml:lang="fr">
<div xmlns="http://www.w3.org/1999/xhtml">
<?=$item['description'];?>
</div>
</content>
</entry>
<?php endforeach; ?>
<?php endif; ?>
 
</feed>
/tags/celw-v1.1/jrest/services/InventoryImportExcel.php
New file
0,0 → 1,1051
<?php
 
// In : utf8
// Out : utf8
 
 
// TODO : traiter image multilignes
// TODO : doublons
 
/*
 
Octobre 2010 David Delon.
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
et liaison d'images déjà chargee aux observations ainsi crées.
 
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
Aucune valeur dans les colonnes n'est obligatoire
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
 
*/
 
 
// Nom des colonnes
 
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
define('LIEUDIT','lieu-dit'); // Texte libre
define('STATION','station'); // Texte libre
define('MILIEU','milieu'); // Texte libre
define('LATITUDE','latitude'); // En decimal systeme WGS84
define('LONGITUDE','longitude'); // En decimal systeme WGS84
define('NOTES','notes'); // Texte libre
define('DATEOBS','date'); // date au format jj/mm/aaaa
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
define('IMAGE','image'); // nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
define('DEPARTEMENT','departement'); // Texte libre
define('TRANSMETTRE','transmettre'); // "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non""
 
 
// Resultat de l'analyse d'une ligne
define('LIGNE_VIDE',1); //
define('LIGNE_NORMALE',2); //
define('LIGNE_IMAGE_SEULEMENT',3); //
 
// Parser de Nom
include('NameParser.php');
 
Class InventoryImportExcel extends DBAccessor {
 
// Element constituant une observation
 
var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
 
// Fichier configuration
var $config;
 
// Encapsulation classe lecture fichier excel
var $extendExcelReader;
 
// Dernier numero d'ordre utilise
var $dernier_ordre=1;
var $cpt_images_liees=0;
 
/**
Constructeur
**/
function InventoryImportExcel($config) {
 
$this->config=$config;
// Pas d'heritage multiple en php :(
 
$this->extendExcelReader = new ExcelReader();
$this->extendExcelReader->initExcelReader();
}
 
/**
Sur post
**/
function createElement($pairs) {
 
 
$pairs['utilisateur']=$_POST['identifiant'];
session_start();
$this->controleUtilisateur($pairs['utilisateur']);
 
 
foreach($_FILES as $file) { // C'est le plus simple
$infos_fichier = $file ;
}
 
 
// Chargement tableau en memoire
$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire.
$arr = array();
 
$rowcount=$data->rowcount(0);
$colcount=$data->colcount(0);
 
if ($rowcount<=1) { // TODO : retour erreur
print "Tableau vide";
exit;
}
 
// Chargement tableau
for($row=1;$row<=$rowcount;$row++)
for($col=1;$col<=$colcount;$col++)
$arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
// 1 : Traitement intitules
 
$line = array();
 
/* Les colonnes ne sont pas forcemment dans l'ordre : on les extrait pour traitement futur */
 
for($col=1;$col<=$colcount;$col++) {
$colonne=strtolower($arr[$col][1]);
$colonne=trim($colonne);
$colonne=cp1252_to_utf8($colonne);
$colonne=remove_accent($colonne);
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter
case COMMUNE:
case LIEUDIT:
case STATION:
case MILIEU:
case DEPARTEMENT:
case LATITUDE:
case LONGITUDE:
case NOTES:
case DATEOBS:
case ESPECE:
case TRANSMETTRE:
case IMAGE:
$selection=array_values($arr[$col]);
array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
$line[$colonne]=$selection;
break;
 
}
}
// print_r($line[COMMUNE]);
// print_r($line[LIEUDIT]);
// print_r($line[STATION]);
// print_r($line[MILIEU]);
// print_r($line[DEPARTEMENT]);
// print_r($line[LATITUDE]);
// print_r($line[LONGITUDE]);
// print_r($line[NOTES]);
// print_r($line[DATEOBS]);
// print_r($line[ESPECE]);
// print_r($line[IMAGE]);
 
// 1 : Traitement lignes
 
$cpt_obs=0;
$cpt_img=0;
 
 
/* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
 
 
$DB=$this->connectDB($this->config,'database_cel');
$query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($pairs['utilisateur'])."' ";
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$this->dernier_ordre=$row['ordre']; // 1 par defaut
}
 
for ($i=0;$i<=$rowcount-1;$i++) {
// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
if ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
// print "image non rattachee a une observation";
}
else {
// print "vide";
}
$i++;
}
while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur'],$DB);
if ($ordre>0) {
$cpt_obs++; // Compteur d'observations crees
}
$i++;
// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
if ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$ordre); // images supplementaires
}
else {
// print "vide";
}
$i++;
}
}
}
//print $cpt_obs ." nouvelle(s) observation(s) !";
$message = '';
if($this->cpt_images_liees > 0) {
$message = $this->cpt_images_liees.' images liees pour ';
}
$message .= $cpt_obs;
print $message;
 
}
 
function analyserLigne($line,$i) {
$ligne_vide=true;
$ligne_image_seulement=true;
$ligne_normale=true;
$ligne_identique_sauf_image = true;
foreach ($this->format_observation as $colonne) {
if($i < 1) {
$ligne_identique_sauf_image = false;
} else {
if($colonne!= IMAGE && $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
$ligne_identique_sauf_image = false;
}
}
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
if ($colonne!=IMAGE) {
$ligne_image_seulement=false;
$ligne_vide=false;
}
$ligne_vide=false;
}
}
if ($ligne_vide) {
return LIGNE_VIDE;
}
else {
if ($ligne_image_seulement || $ligne_identique_sauf_image) {
return LIGNE_IMAGE_SEULEMENT;
}
else {
return LIGNE_NORMALE;
}
}
 
}
 
function traiterLigne($line,$i,$utilisateur,$DB) { // Controle donnee et insertion
$info_image=array();
$info_transmettre = "0";
foreach ($this->format_observation as $colonne) {
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter
case COMMUNE:
$info_commune=$this->traiterCommune($line[COMMUNE][$i]);
break;
case LIEUDIT:
$info_lieudit=$this->traiterLieudit($line[LIEUDIT][$i]);
break;
case STATION:
$info_station=$this->traiterStation($line[STATION][$i]);
break;
case MILIEU:
$info_milieu=$this->traiterMilieu($line[MILIEU][$i]);
break;
case DEPARTEMENT:
$info_commune['code']=$this->traiterDepartement($line[DEPARTEMENT][$i]);
break;
case LATITUDE:
$info_latitude=$this->traiterLatitude($line[LATITUDE][$i]);
break;
case LONGITUDE:
$info_longitude=$this->traiterLongitude($line[LONGITUDE][$i]);
break;
case NOTES:
$info_notes=$this->traiterNotes($line[NOTES][$i]);
break;
case DATEOBS:
$info_dateobs=$this->traiterDateObs($line[DATEOBS][$i]);
break;
case TRANSMETTRE:
$info_transmettre=$this->traiterTransmettre($line[TRANSMETTRE][$i]);
break;
case ESPECE:
$info_espece=$this->traiterEspece($line[ESPECE][$i]);
if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') {
$complement=$this->rechercherInformationsComplementaires($info_espece['en_id_nom']);
$info_espece['nom_ret']=$complement['Nom_Retenu'];
$info_espece['num_nom_ret']=$complement['Num_Nom_Retenu'];
$info_espece['num_taxon']=$complement['Num_Taxon'];
$info_espece['famille']=$complement['Famille'];
}
break;
case IMAGE:
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
break;
}
}
else {
switch($colonne) {
case COMMUNE:
$info_commune['name']="000null";
$info_commune['code']="000null";
break;
case LIEUDIT:
$info_lieudit="000null";
break;
case STATION:
$info_station="000null";
break;
case MILIEU:
$info_milieu="000null";
break;
case DEPARTEMENT:
/*if (!isset ($info_commune['code']) || $info_commune['code']=='') {
$info_commune['code']="000null";
}*/
break;
case LATITUDE:
$info_latitude="000null";
break;
case LONGITUDE:
$info_longitude="000null";
break;
case TRANSMETTRE:
$info_transmettre = "0";
break;
 
}
 
}
}
 
$this->dernier_ordre++;
 
list($jour,$mois,$annee)=split("/",$info_dateobs);
$info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
$query = "INSERT INTO cel_inventory (identifiant,ordre,nom_sel,num_nom_sel,nom_ret,num_nom_ret,num_taxon,famille,location,id_location,date_observation,lieudit,station, milieu, commentaire, transmission, date_creation,date_modification,coord_x,coord_y) " .
" VALUES('".$DB->escapeSimple($utilisateur)."','".
$DB->escapeSimple($this->dernier_ordre)."','".
$DB->escapeSimple($info_espece['nom_sel'])."','".
$DB->escapeSimple($info_espece['en_id_nom'])."','".
$DB->escapeSimple($info_espece['nom_ret'])."','".
$DB->escapeSimple($info_espece['num_nom_ret'])."','".
$DB->escapeSimple($info_espece['num_taxon'])."','".
$DB->escapeSimple($info_espece['famille'])."','".
$DB->escapeSimple($info_commune['name'])."','".
$DB->escapeSimple($info_commune['code'])."','".
$DB->escapeSimple($info_dateobs)."','".
$DB->escapeSimple($info_lieudit)."','".
$DB->escapeSimple($info_station)."','".
$DB->escapeSimple($info_milieu)."','".
$DB->escapeSimple($info_notes)."','".
$DB->escapeSimple($info_transmettre)."',".
"now() , now(),'".
$DB->escapeSimple($info_latitude)."','".
$DB->escapeSimple($info_longitude)."')";
// print "\n";
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
return false;
}
// creation lien image
foreach ($info_image as $pic) {
 
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation ) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
return false;
} else {
$this->cpt_images_liees++;
}
}
 
 
 
return $this->dernier_ordre;
 
 
}
 
function traiterLigneComplement($line,$i,$utilisateur, $ordre = null) {
 
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur
// creation lien image
foreach ($info_image as $pic) {
 
$DB=$this->connectDB($this->config,'cel_db');
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
return false;
} else {
$this->cpt_images_liees++;
}
}
}
function traiterCommune($identifiant_commune) { // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
 
 
$identifiant_commune=trim($identifiant_commune);
 
$identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
 
preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
 
$DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici
 
if ($elements[1]) { // commune + departement : montpellier (34)
$nom_commune=$elements[1];
$code_commune=$elements[2];
 
$query="SELECT DISTINCT name, code FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."' AND code ='".$DB->escapeSimple($code_commune)."'";
}
else { // Code insee seul
preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
if ($elements[1]) { // code insee commune
$code_insee_commune=$elements[1];
$query="SELECT DISTINCT name, code FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'";
}
else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
// Commune
preg_match('/(.*)/',$identifiant_commune,$elements);
if ($elements[1]) { // commune
$nom_commune=$elements[1];
$nom_commune=trim($nom_commune);
$nom_commune=utf8_decode($nom_commune);
$nom_commune=cp1252_to_utf8($nom_commune);
$nom_commune=remove_accent($nom_commune);
$nom_commune=preg_replace("/ /","%",$nom_commune);
$query="SELECT DISTINCT name, code FROM locations WHERE name like '".$DB->escapeSimple($nom_commune)."'";
}
}
}
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
return $res->fetchrow(DB_FETCHMODE_ASSOC);
 
 
 
}
 
function traiterLieudit($lieudit) { // texte libre
 
//echo "traitement lieudit";
$lieudit=fix_latin($lieudit);
return trim($lieudit);
}
 
function traiterStation($station) { // texte libre
// echo "traitement station";
$station=fix_latin($station);
return trim($station);
}
 
function traiterMilieu($milieu) { // texte libre
// echo "traitement milieu";
$milieu=fix_latin($milieu);
return trim($milieu);
}
 
function traiterDepartement($departement) { // texte libre
 
if(is_numeric($departement) && strlen($departement) == 5) {
$departement = substr($departement,0,2);
}
if(is_numeric($departement) && strlen($departement) == 4) {
$departement = substr($departement,0,1);
$departement = "0"+$departement;
}
return utf8_encode(trim($departement));
}
 
function traiterLatitude($latitude) { // verifier formal decimal + limite france ? TODO
// echo "traitement latitude";
return trim($latitude);
}
 
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO
// echo "traitement longitude";
return trim($longitude);
}
 
function traiterNotes($notes) { // texte libre
// echo "traitement notes";
$notes=remove_accent($notes);
return utf8_encode(trim($notes));
}
 
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO
// echo "traitement dateobs";
return trim($dateobs);
}
 
function traiterTransmettre($transmettre) {
$transmission = '0';
if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
$transmission = '1';
}
return $transmission;
}
 
function traiterEspece($identifiant_espece) { // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999) ou code taxonomique (format BDNFFnt999999)
 
// echo "traitement espece";
$identifiant_espece=trim($identifiant_espece);
$identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau
 
preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements);
if ($elements[1]) { // Numero nomenclatural
 
 
// Recherche du nom associe
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a, " .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" WHERE a.esn_id_nom= '".$elements[1]. "'".
" AND a.esn_id_version_projet_taxon = 25 ".
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = a.esn_id_nom" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
 
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$elements[1]);
 
}
 
else { // Numero taxonomique ou nom scientifique
preg_match('/BDNFFnt([0-9][0-9]*)/',$identifiant_espece,$elements);
if ($elements[1]) { // Numero taxonomique
$DB=$this->connectDB($this->config);
 
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
" FROM eflore_nom, eflore_nom_rang," .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" , eflore_selection_nom ".
" WHERE esn_id_taxon = '".$elements[1]. "'".
" AND esn_id_version_projet_taxon = 25 ".
" AND esn_ce_statut=3 ".
" AND en_id_nom = esn_id_nom" .
" AND en_ce_rang = enrg_id_rang" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom ";
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$row['en_id_nom']);
 
 
}
 
else { // Nom scientifique
$nameparser=new NameParser();
$nom_latin_decoupe=$nameparser->parse($identifiant_espece);
 
//print_r($nom_latin_decoupe);
$DB=$this->connectDB($this->config); // FIXME regarder si opportun ici
 
// requete sous espece (on privilegie les noms retenu cf tri par esn_ce_statut)
if (isset($nom_latin_decoupe['infra']) && $nom_latin_decoupe['infra']!="") {
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
" AND enrg_abreviation_rang = '".$DB->escapeSimple($nom_latin_decoupe['infra_type'])."' " .
" AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['infra'])."' " .
" AND esn_id_nom= en_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
" ORDER BY esn_ce_statut ".
" LIMIT 1";
}
else { // espece (on privilegie les noms retenu cf tri par esn_ce_statut)
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " .
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " .
" AND enrg_abreviation_rang = 'sp.' " .
" AND esn_id_nom= en_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " .
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " .
" ORDER BY esn_ce_statut ".
" LIMIT 1";
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
$id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC);
 
// Recherche du nom associe
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" .
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a, " .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" WHERE a.esn_id_nom= '".$id_nom['en_id_nom']. "'".
" AND a.esn_id_version_projet_taxon = 25 ".
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = a.esn_id_nom" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
if ($res->numRows() > 0 ) {
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC);
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']);
}
else {
return array("nom_sel"=>$identifiant_espece);
}
 
 
}
}
 
}
 
 
 
function traiterImage($images,$utilisateur) { // recherche id image de ce nom
 
$DB=$this->connectDB($this->config,'cel_db');
 
$liste_images = explode("/",$images) ;
 
$row =array();
foreach($liste_images as $image) {
 
$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'";
 
$res =& $DB->query($query);
$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
}
return $row;
 
 
}
 
function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ...
 
$DB=$this->connectDB($this->config);
 
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,".
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ".
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ".
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ".
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ".
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, b.esn_id_taxon, b.esn_id_nom" .
" FROM eflore_nom, eflore_nom_rang," .
" eflore_naturaliste_intitule_abreviation AS auteur_bex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_b ".
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ".
" , eflore_naturaliste_intitule_abreviation AS auteur_m ".
" ,eflore_selection_nom a, eflore_selection_nom b".
" WHERE a.esn_id_nom= ".$numNom.
" AND a.esn_id_version_projet_taxon = 25 ".
" AND a.esn_id_taxon=b.esn_id_taxon ".
" AND b.esn_ce_statut=3 ".
" AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" .
" AND en_ce_rang = enrg_id_rang" .
" AND en_id_nom = b.esn_id_nom" .
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ".
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ".
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
 
 
$res =& $DB->query($query);
 
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
// Nom retenu, Num Nomenclatural nom retenu, Num Taxon,
 
$value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>"");
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$fam=$this->rechercherFamille($row['esn_id_taxon'],$DB);
 
// Recherche Famille
while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) {
$fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB);
}
if ($fam['en_ce_rang']==120) {
$famille=$fam['en_nom_supra_generique'];
}
else {
$famille="Famille inconnue";
}
 
$value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille);
}
 
return $value;
 
 
 
}
 
function formaterNom($rawnom) {
 
 
// Constitution du nom:
$nom = '';
 
if ($rawnom['en_nom_supra_generique'] != '') {
$nom .= $rawnom['en_nom_supra_generique'];
} else if ($rawnom['en_epithete_infra_generique'] != '') {
$nom .= $rawnom['en_epithete_infra_generique'];
} else {
if ($rawnom['en_nom_genre'] != '') {
$nom .= $rawnom['en_nom_genre'];
}
if ($rawnom['en_epithete_espece']!= '') {
$nom .= ' '.$rawnom['en_epithete_espece'];
}
if ($rawnom['en_epithete_infra_specifique'] != '') {
if (!empty($rawnom['enrg_abreviation_rang'])) {
$nom .= ' '.$rawnom['enrg_abreviation_rang'].'';
}
$nom .= ' '.$rawnom['en_epithete_infra_specifique'];
}
 
}
 
return $nom .$this->retournerAuteur($rawnom) ;
 
}
 
 
function rechercherFamille($taxon,&$DB) {
 
$row=array();
 
$query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ".
" FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ".
" WHERE etr_id_taxon_1 = ".$taxon.
" AND etr_id_version_projet_taxon_1 = 25 ".
" AND etr_id_categorie_taxon = 3 ".
" AND etr_id_valeur_taxon = 3 ".
" AND esn_id_taxon = etr_id_taxon_2 ".
" AND esn_ce_statut = 3 ".
" AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ".
" AND en_id_nom = esn_id_nom ".
" AND esn_id_version_projet_taxon=en_id_version_projet_nom ";
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
return $row;
}
else {
$row['en_ce_rang']='fin';
return $row;
}
 
}
 
 
function retournerAuteur($rawnom) {
 
$auteurs = '';
$auteur_basio = '';
$auteur_modif = '';
if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' ) {
$auteur_basio .= $rawnom['abreviation_auteur_basio_ex'];
if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
$auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio'];
}
} else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') {
$auteur_basio .= $rawnom['abreviation_auteur_basio'];
}
 
if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') {
$auteur_modif .= $rawnom['abreviation_auteur_modif_ex'];
if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
$auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif'];
}
} else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') {
$auteur_modif .= $rawnom['abreviation_auteur_modif'];
}
 
if (!empty($auteur_modif)) {
$auteurs = ' ('.$auteur_basio.') '.$auteur_modif;
} elseif (!empty($auteur_basio)) {
$auteurs = ' '.$auteur_basio;
}
 
return $auteurs ;
}
 
 
 
 
}
 
function init_byte_map(){
$byte_map = array();
for($x=128;$x<256;++$x){
$byte_map[chr($x)]=utf8_encode(chr($x));
}
$cp1252_map=array(
"\x80"=>"\xE2\x82\xAC", // EURO SIGN
"\x82" => "\xE2\x80\x9A", // SINGLE LOW-9 QUOTATION MARK
"\x83" => "\xC6\x92", // LATIN SMALL LETTER F WITH HOOK
"\x84" => "\xE2\x80\x9E", // DOUBLE LOW-9 QUOTATION MARK
"\x85" => "\xE2\x80\xA6", // HORIZONTAL ELLIPSIS
"\x86" => "\xE2\x80\xA0", // DAGGER
"\x87" => "\xE2\x80\xA1", // DOUBLE DAGGER
"\x88" => "\xCB\x86", // MODIFIER LETTER CIRCUMFLEX ACCENT
"\x89" => "\xE2\x80\xB0", // PER MILLE SIGN
"\x8A" => "\xC5\xA0", // LATIN CAPITAL LETTER S WITH CARON
"\x8B" => "\xE2\x80\xB9", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
"\x8C" => "\xC5\x92", // LATIN CAPITAL LIGATURE OE
"\x8E" => "\xC5\xBD", // LATIN CAPITAL LETTER Z WITH CARON
"\x91" => "\xE2\x80\x98", // LEFT SINGLE QUOTATION MARK
"\x92" => "\xE2\x80\x99", // RIGHT SINGLE QUOTATION MARK
"\x93" => "\xE2\x80\x9C", // LEFT DOUBLE QUOTATION MARK
"\x94" => "\xE2\x80\x9D", // RIGHT DOUBLE QUOTATION MARK
"\x95" => "\xE2\x80\xA2", // BULLET
"\x96" => "\xE2\x80\x93", // EN DASH
"\x97" => "\xE2\x80\x94", // EM DASH
"\x98" => "\xCB\x9C", // SMALL TILDE
"\x99" => "\xE2\x84\xA2", // TRADE MARK SIGN
"\x9A" => "\xC5\xA1", // LATIN SMALL LETTER S WITH CARON
"\x9B" => "\xE2\x80\xBA", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
"\x9C" => "\xC5\x93", // LATIN SMALL LIGATURE OE
"\x9E" => "\xC5\xBE", // LATIN SMALL LETTER Z WITH CARON
"\x9F" => "\xC5\xB8" // LATIN CAPITAL LETTER Y WITH DIAERESIS
);
foreach($cp1252_map as $k=>$v){
$byte_map[$k]=$v;
}
return $byte_map;
}
 
function fix_latin($instr){
$byte_map = init_byte_map();
$ascii_char='[\x00-\x7F]';
$cont_byte='[\x80-\xBF]';
$utf8_2='[\xC0-\xDF]'.$cont_byte;
$utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
$utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
$utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
$nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
 
if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
$outstr='';
$char='';
$rest='';
while((strlen($instr))>0){
if(1==@preg_match($nibble_good_chars,$instr,$match)){
$char=$match[1];
$rest=$match[2];
$outstr.=$char;
}elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
$char=$match[1];
$rest=$match[2];
$outstr.=$byte_map[$char];
}
$instr=$rest;
}
return $outstr;
}
 
 
function remove_accent($str)
{
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
$b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
return str_replace($a, $b, $str);
}
 
 
function cp1252_to_utf8($str) {
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
"\xc2\x82" => "\xe2\x80\x9a",
"\xc2\x83" => "\xc6\x92",
"\xc2\x84" => "\xe2\x80\x9e",
"\xc2\x85" => "\xe2\x80\xa6",
"\xc2\x86" => "\xe2\x80\xa0",
"\xc2\x87" => "\xe2\x80\xa1",
"\xc2\x88" => "\xcb\x86",
"\xc2\x89" => "\xe2\x80\xb0",
"\xc2\x8a" => "\xc5\xa0",
"\xc2\x8b" => "\xe2\x80\xb9",
"\xc2\x8c" => "\xc5\x92",
"\xc2\x8e" => "\xc5\xbd",
"\xc2\x91" => "\xe2\x80\x98",
"\xc2\x92" => "\xe2\x80\x99",
"\xc2\x93" => "\xe2\x80\x9c",
"\xc2\x94" => "\xe2\x80\x9d",
"\xc2\x95" => "\xe2\x80\xa2",
"\xc2\x96" => "\xe2\x80\x93",
"\xc2\x97" => "\xe2\x80\x94",
 
"\xc2\x98" => "\xcb\x9c",
"\xc2\x99" => "\xe2\x84\xa2",
"\xc2\x9a" => "\xc5\xa1",
"\xc2\x9b" => "\xe2\x80\xba",
"\xc2\x9c" => "\xc5\x93",
"\xc2\x9e" => "\xc5\xbe",
"\xc2\x9f" => "\xc5\xb8"
);
return strtr ( utf8_encode ( $str ), $cp1252_map );
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
*
*
*/
 
 
?>
/tags/celw-v1.1/jrest/services/PlantNetRss.php
New file
0,0 → 1,225
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
class PlantNetRss extends DBAccessor {
 
var $config;
 
function PlantNetRss($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
$rss = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n";
$rss .= "<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n";
$rss .='
<channel>
<title>Carnet en ligne</title>
<link>http://www.tela-botanica.org/cel/jrest/ImageRss</link>
<description>Carnet en ligne</description>
<language>fr</language>';
 
$DB=$this->connectDB($this->config,'cel_db');
$motcle = 'plantnet';
$query_id_id_img = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE cmc_id_mot_cle_general = md5("'.$motcle.'")' ;
 
$res =& $DB->query($query_id_id_img);
 
if (DB::isError($res)) {
 
die($res->getMessage());
}
 
$query='SELECT * FROM cel_images';
 
$premier_item = true ;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
if($premier_item) {
$query .= ' WHERE ';
$premier_item = false ;
}
else{
$query .= ' OR ';
}
 
$query .= '(ci_meta_mots_cles LIKE "%'.$row['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur ="'.$row['cmc_id_proprietaire'].'")' ;
}
 
$query .= ' ORDER BY ci_meta_date_ajout DESC LIMIT 0,100' ;
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$row['ci_nom_original'] = htmlspecialchars($row['ci_nom_original']);
$row['ci_id_image'] = htmlspecialchars($row['ci_id_image']);
$row['ci_meta_date_ajout'] = htmlspecialchars($row['ci_meta_date_ajout']);
$row['ci_ce_utilisateur'] = htmlspecialchars($row['ci_ce_utilisateur']);
$row['ci_meta_user_comment'] = htmlspecialchars($row['ci_meta_user_comment']);
$row['ci_note_image'] = htmlspecialchars($row['ci_note_image']);
$tailleXY = $this->calculerDimensions(array($row['ci_meta_width'], $row['ci_meta_height']));
 
$id = $row['ci_id_image'];
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
 
$req_liaison = 'SELECT * FROM cel_inventory WHERE ordre IN (SELECT coi_ce_observation FROM cel_obs_images WHERE coi_ce_image = "'.$row['ci_id_image'].'") AND identifiant = "'.$row['ci_ce_utilisateur'].'"' ;
$res_liaison =& $DB->query($req_liaison);
 
if (DB::isError($res_liaison)) {
die($res_liaison->getMessage());
}
 
if (DB::isError($res_liaison)) {
die($res_liaison->getMessage());
}
 
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$id_fichier = $id.".jpg" ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
 
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ;
$chemin_fichier_m = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ;
 
$rss.= ' <item>
<title>'.$row['ci_nom_original']." (".$row['ci_id_image'].") ". ' par ' . $row['ci_ce_utilisateur'].'</title>
<author>'.$row['ci_ce_utilisateur'].'</author>
<link>'.$chemin_fichier.'</link>
<guid>'.$chemin_fichier.'</guid>
<description>'.
' <![CDATA[<img src="'.$chemin_fichier_m.'" alt="'.$row['ci_nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img><br/>'.
$row['ci_nom_original']. ' modifiée le ' .$row['ci_meta_date_ajout'] . ' par ' . $row['ci_ce_utilisateur'].'<br/>' ;
 
if(trim($row['ci_meta_mots_cles']) != '') {
$row['ci_meta_mots_cles'] = rtrim($row['ci_meta_mots_cles'],',');
 
$mots_cles_chaine = '' ;
$mots_cles_tab = split(',',$row['ci_meta_mots_cles']);
foreach($mots_cles_tab as $item) {
$mots_cles_chaine .= '\''.$item.'\',';
}
$mots_cles_chaine = rtrim($mots_cles_chaine,',');
 
$req_mots_cles = 'SELECT cmc_mot_cle FROM cel_mots_cles_images WHERE cmc_id_mot_cle_utilisateur IN ('.$mots_cles_chaine.') AND cmc_id_proprietaire = "'.$row['ci_ce_utilisateur'].'"' ;
$res_mots_cles =& $DB->query($req_mots_cles);
 
if (DB::isError($res_mots_cles)) {
die($res_mots_cles->getMessage());
}
 
 
$mots_cles = '' ;
 
while($mot_cle = & $res_mots_cles->fetchrow(DB_FETCHMODE_ASSOC)) {
$mots_cles .= $mot_cle['cmc_mot_cle'].' , ' ;
}
 
$mots_cles = rtrim($mots_cles,', ');
 
if(trim($mots_cles) != '') {
// $rss .= 'Mot clés : '.mb_convert_encoding($mots_cles,'HTML-ENTITIES','UTF-8').' <br/>' ;
}
}
 
if(trim($row['ci_meta_comment']) != '') {
// $rss .= 'Commentaire : '.mb_convert_encoding($row['ci_meta_comment'],'HTML-ENTITIES','UTF-8').' <br/>';
}
 
/* while($ligne = & $res_liaison->fetchrow(DB_FETCHMODE_ASSOC)) {
$rss .= '<p> Liée à l\'observation '.$ligne['id'].'<br/>' ;
$rss .= 'Nom saisi : '.$ligne['nom_sel'].'<br/>' ;
$rss .= 'Nom retenu : '.$ligne['nom_ret'].'<br/>' ;
$rss .= 'Datée du '.$ligne['date_observation'].'<br/>' ;
$rss .= 'Lieu : '.trim($ligne['location'],'000null').' ('.trim($ligne['id_location'],'000null').') '.trim($ligne['station'],'000null').' '.trim($ligne['lieudit'],'000null').'<br/></p>' ;
}*/
$rss .= ']]>' ;
$rss .= '</description>
<dc:format>text/html</dc:format>
</item>';
}
 
$rss.= '</channel> </rss>';
 
 
header("Content-Type: text/xml; charset=UTF-8");
print $rss;
exit;
}
 
 
function getRessource(){
 
$uid[] = array() ;
$this->getElement($uid);
}
 
function calculerDimensions($tailleXY) {
 
$tailleOr = 300 ;
 
if($tailleXY[1] == 0) {
$tailleXY[1] = $tailleOr;
}
 
if($tailleXY[0] == 0) {
$tailleXY[0] = $tailleOr;
}
 
$maxTaille = max($tailleXY[1],$tailleXY[0]) ;
 
if($maxTaille == $tailleXY[1]) {
 
$rapport = $tailleXY[1]/$tailleXY[0] ;
$tailleXY[1] = 300 ;
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ;
 
}else {
$rapport = $tailleXY[0]/$tailleXY[1] ;
$tailleXY[0] = 300 ;
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ;
}
 
return $tailleXY ;
}
}
 
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.5 2008-11-13 11:29:12 ddelon
* Reecriture gwt-ext
*
* Revision 1.4 2007-06-06 13:31:16 ddelon
* v0.09
*
* Revision 1.3 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*
*
*/
 
?>
/tags/celw-v1.1/jrest/services/UserOpenId.php
New file
0,0 → 1,246
<?php
/**
 
David Delon david.delon@clapas.net 2007
 
Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA
sur le site "http://www.cecill.info".
En contrepartie de l'accessibilit� au code source et des droits de copie,
de modification et de redistribution accord�s par cette licence, il n'est
offert aux utilisateurs qu'une garantie limit�e. Pour les m�mes raisons,
seule une responsabilit� restreinte p�se sur l'auteur du programme, le
titulaire des droits patrimoniaux et les conc�dants successifs.
 
A cet �gard l'attention de l'utilisateur est attir�e sur les risques
associ�s au chargement, � l'utilisation, � la modification et/ou au
d�veloppement et � la reproduction du logiciel par l'utilisateur �tant
donn� sa sp�cificit� de logiciel libre, qui peut le rendre complexe �
manipuler et qui le r�serve donc � des d�veloppeurs et des professionnels
avertis poss�dant des connaissances informatiques approfondies. Les
utilisateurs sont donc invit�s � charger et tester l'ad�quation du
logiciel � leurs besoins dans des conditions permettant d'assurer la
s�curit� de leurs syst�mes et ou de leurs donn�es et, plus g�n�ralement,
� l'utiliser et l'exploiter dans les m�mes conditions de s�curit�.
 
Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez
pris connaissance de la licence CeCILL, et que vous en avez accept� les
termes.
 
*/
 
/*
* User.php
*
* Cas d'utilisation :
* Service identification utilisateur
*
*
* 1: Aucun identifiant ni mot de passe transmis
* 1: L'application retourne l'identifiant de session en cours
* 2: Une identification est toujours active, cette identification est retournee
*
* 1: L'application recoit un identifiant et un mot de passe
* 1 : On tente login
* 2 : Si reussi etat connecte
* 3 : sinon pas connecte
*
* 1: L'application recoit un identifiant et pas de mot de passe :
* 1 : Deconnection
*
 
/* En resume :
* /User/ : retour id si jamais connecte, sinon retour login_utilisateur
* /User/login_utilisateur : logout
* /User/login_utilisateur/password : login
*
*/
 
 
 
Class UserOpenId extends DBAccessor {
 
function UserOpenId($config) {
 
$this->config=$config;
 
}
 
 
// TODO : controle systematique ....dans tous les services
// Si connected : name cookie = name service
 
 
 
 
function getRessource(){
 
 
$expireTime = 60*60*24*100; // 100 jours
session_set_cookie_params($expireTime);
 
$connected=false;
$admin=false;
 
session_start();
 
if (!$this->GetUser()) {
if (isset($_COOKIE["cel_name"]) && ($this->RememberedUser($_COOKIE["cel_name"], $_COOKIE["cel_password"]))) {
$retour= $this->GetUserName();
$connected=true;
}
else {
$retour = session_id();
$connected=false;
}
}
else {
$retour= $this->GetUserName();
$connected=true;
}
 
$admin = $this->isAdmin($retour) ;
 
$output = json_encode(array($retour,$connected,$admin));
print($output);
 
}
 
 
function getElement($uid){
 
$connected=false;
 
session_start();
// Non connect� : verification
if (isset($uid[1])) { // Identification
if (!$this->GetUser()) { // Si non identifi�
if ($this->LoginUser($uid[0],$uid[1],1)) { // identification reussi
$retour= $this->GetUserName();
$connected=true;
}
else {
$retour = session_id();
$connected=false;
}
}
else { // Deja identifi�
$retour= $this->GetUserName();
$connected=true;
}
}
else { // Deconnection
$this->LogoutUser();
$retour = session_id();
$connected=false;
}
 
$admin = $this->isAdmin($retour) ;
 
$output = json_encode(array($retour,$connected,$admin));
 
print($output);
 
}
// USERS
 
function LoadUser($name) {
 
$password = ;
 
$admin = $this->isAdmin($name) ;
 
$retour= array("name"=>$name,"password"=>$password,"admin"=>$admin);
 
return $retour;
 
}
 
 
 
function GetUserName() {
if ($user = $this->GetUser()) {
$name = $user["name"];
}
else {
$name ="";
}
return $name;
}
 
function GetUser() {
return (isset($_SESSION["user"]) ? $_SESSION["user"] : '');
}
 
function SetUser($user, $remember=1) {
$_SESSION["user"] = $user;
$this->SetPersistentCookie("cel_name", $user["name"], $remember);
$this->SetPersistentCookie("cel_password", $user["password"], $remember);
$this->SetPersistentCookie("cel_remember", $remember, $remember);
}
 
function LogoutUser() {
$_SESSION["user"] = "";
$this->DeleteCookie("cel_name");
$this->DeleteCookie("cel_password");
$this->DeleteCookie("cel_remember");
}
 
function SetPersistentCookie($name, $value, $remember = 1) {
SetCookie($name, $value, time() + ($remember ? 90*24*60*60 : 60 * 60),'/');
$_COOKIE[$name] = $value;
}
 
function DeleteCookie($name) {
SetCookie($name, "", 1,'/'); $_COOKIE[$name] = "";
}
 
function LoginUser($name,$password,$remember=1) {
if ($existingUser = $this->LoadUser($name)) {
 
if ($password!="debug") {
if ($existingUser["password"] == md5($password)) {
$this->SetUser($existingUser, $remember);
return true;
}
else {
return false;
}
}
else {
$this->SetUser($existingUser, $remember);
return true;
}
}
}
 
function RememberedUser($name,$password,$remember=1) {
if ($existingUser = $this->LoadUser($name)) {
if ($existingUser["password"] == $password) {
$this->SetUser($existingUser, $remember);
return true;
}
else {
return false;
}
}
}
}
 
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.5 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.4 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
* Revision 1.3 2007-05-21 18:12:20 ddelon
* Gestion des importations locale de releves
*
*
*/
 
?>
/tags/celw-v1.1/jrest/services/NameMap.php
New file
0,0 → 1,81
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* NameMap.php
*
* in utf8
* out utf8
*
* Cas d'utilisation :
* Service recherche d'image a partir d'un numero nomenclatural
*
* 1: Le service recoit un numero nomenclatural
* 2: Le service calcul le numero taxonomique associe
* 3: Le service recherche une carte disponible
* A: Pas de carte disponible, generation de l'image
*/
 
// TODO: externaliser ceci dans le fichier de config
/** Constante stockant l'URL o. sont accessible les cartes. Le %s correspond au nom du fichier.*/
define('EF_URL_CARTO', 'http://www.tela-botanica.org/sites/eflore/generique/images/cartes/');
// france_BDNFF_4.02_nt8523.png
/** Constante stockant l'URL d'appel du module chorologie*/
define('EF_URL_CHORO', 'http://www.tela-botanica.org/eflore/BDNFF/4.02/nn/');
// 182/chorologie
 
class NameMap extends Cel {
 
// TODO: voir avec David quoi faire de cette variable inutilisée
private $extendMapProductor;
 
function getElement($uid){
 
$nt = null;
 
if(isset($uid[0])) {
$recherche_infos_taxon = new RechercheInfosTaxon($this->config);
$nt = $recherche_infos_taxon->rechercherNumTaxSurNumNom($uid[0]);
}
$retour = array('');
// si le taxon cherché existe
if ($nt) {
$file = EF_URL_CARTO."france_BDNFF_4.02_nt".$nt.".png";
$file_headers = @get_headers($file);
if ($file_headers[0] == 'HTTP/1.1 404 Not Found') {
}
else {
$service=EF_URL_CHORO.$uid[0].'/chorologie';
@get_headers($service);
}
$retour = array($file);
}
 
$output = json_encode($retour);
header("content-type: application/json");
print($output);
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.1 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.1 2007-06-06 13:31:16 ddelon
* v0.09
*/
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/tags/celw-v1.1/jrest/services/InventoryKeyWordObsLink.php
New file
0,0 → 1,81
<?php
// declare(encoding='UTF-8');
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* in : utf8
* out : utf8
*
* Service de liaisons de mots clés à des observations.
* Le service lie une ou plusieurs mots clés à une ou plusieurs observations
*
*/
class InventoryKeyWordObsLink extends Cel {
public function getElement($uid) {
}
public function createElement($pairs) {
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['ce_utilisateur']);
if (!isset($pairs['mots_cles']) || !isset($pairs['observations']) || !isset($pairs['ce_utilisateur'])) {
return;
}
$observations = explode(',',$pairs['observations']);
$mots_cles = explode(',',$pairs['mots_cles']);
$gestionnaire_observation = new RechercheObservation($this->config);
$ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($pairs['ce_utilisateur'],$observations);
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'obs');
$liaison_mot_cle = $gestionnaire_mots_cles->ajouterLiaisonMotsCles($ids_obs, $mots_cles);
return $liaison_mot_cle;
}
 
public function deleteElement($uid){
$retour = false;
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) {
return;
}
$mots_cles = $this->nettoyerMotsCles($uid[2]);
$mots_cles = explode(',',$mots_cles);
$ordre_observations = explode(',',$uid[1]);
$id_utilisateur = $uid[0];
$gestionnaire_observation = new RechercheObservation($this->config);
$ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($id_utilisateur,$ordre_observations);
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'obs');
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsCles($ids_obs, $mots_cles);
 
return $suppression_liaison_mot_cle;
}
 
private function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
}
?>
/tags/celw-v1.1/jrest/services/CelSyndicationObservation.php
New file
0,0 → 1,585
<?php
/**
* Service fournissant des informations concernant le CEL au format RSS1, RSS2 ou ATOM.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
* Format du service :
* /CelSyndicationObservation/liste-des-flux
* /CelSyndicationObservation/opml
* /CelSyndicationObservation/par-defaut/(rss1|rss2|atom)?start=0&limit=150
* /CelSyndicationObservation/pour-admin/(rss1|rss2|atom)?start=0&limit=150
* /CelSyndicationObservation/par-mots-cles/(rss1|rss2|atom)/mot-cle?start=0&limit=150
* /CelSyndicationObservation/par-commune/(rss1|rss2|atom)/nom-commune?start=0&limit=150
*
* Les paramêtres :
* - "start" indique le numéro du premier item à afficher
* - "limit" nombre d'items à afficher
*
* @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 $Id$
* @copyright 2010
*/
class CelSyndicationObservation extends Cel {
private $parametres_origines = null;
private $format = null;
private $service = null;
private $squelette = null;
private $squelette_dossier = null;
private $auteurs = array();
private $flux = array();
private $criteres = array(
'utilisateur' => 'identifiant',
'commune' => 'location',
'dept' => 'id_location',
'taxon' => 'nom_ret',
'commentaire' => 'commentaire',
'date' => 'date_observation',
'projet' => 'mots-cles');
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params = array()) {
// Initialisation des variables
$this->parametres_origines = $params;
$info = array();
$contenu = '';
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
// Pré traitement des paramêtres
$pour_bdd = false;
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
extract($p);
$this->parametres = $params;
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
// Récupération de la liste des flux
$this->chargerListeDesFlux();
// Chargement du bon type de service demandé
if (isset($service)) {
$this->service = $this->traiterNomService($service);
$methode = $this->getNomMethodeService();
if (method_exists($this, $methode)) {
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
// Mise en minuscule de l'indication du format
$this->format = strtolower($format);
// Définition du fichier squelette demandé
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
} else if (isset($this->flux[$this->service])) {
$this->format = '';
$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
}
if (!isset($this->flux[$this->service]) || isset($this->format)) {
// Suppression des paramêtres inutile pour le reste des méthodes
array_shift($this->parametres);
array_shift($this->parametres);
// Récupération du contenu à renvoyer
$contenu = $this->$methode();
}
} else {
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
}
} else {
$this->messages[] = "Le service CEL Syndication Observation nécessite d'indiquer en premier paramètre le type d'information demandé.";
}
}
// Envoie sur la sortie standard
$encodage = 'utf-8';
$mime = $this->getTypeMime();
$formatage_json = $this->getFormatageJson();
$this->envoyer($contenu, $mime, $encodage, $formatage_json);
}
private function getUrlBase() {
$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
return $url_base;
}
private function getUrlServiceBase() {
$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
return $url_service;
}
private function traiterNomService($nom) {
$nom = strtolower($nom);
return $nom;
}
private function getNomMethodeService() {
$methode = '';
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
$methode = 'getService'.$service_formate;
return $methode;
}
private function getTypeMime() {
$mime = '';
$test = isset($this->format) ? $this->format : $this->service;
switch ($test) {
case 'atom' :
$mime = 'application/atom+xml';
break;
case 'rss1' :
case 'rss2' :
$mime = 'application/rss+xml';
break;
case 'opml' :
$mime = 'text/x-opml';
break;
default:
$mime = 'text/html';
}
return $mime;
}
private function getFormatageJson() {
$json = false;
switch ($this->service) {
case 'liste-des-flux' :
$json = true;
break;
default:
$json = false;
}
return $json;
}
private function getFlux($nom) {
return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
}
 
private function setFlux($nom, $titre, $description) {
$url_base = $this->getUrlBase();
$formats = array('atom', 'rss2', 'rss1');
$flux = array();
foreach ($formats as $format) {
$url = $url_base.$nom.'/'.$format;
$flux[$format] = $url;
}
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
}
private function chargerListeDesFlux() {
$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL',
'Ce flux fournit des informations sur les observations du CEL.');
$this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
$this->setFlux('par-commune','Flux de syndication obsolète',
"Ce flux est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
$this->setFlux('multicriteres','Flux de syndication des nouvelles observations publiques du CEL '.
'filtrées par un ou plusieurs critères',
"Ce flux fournit des informations sur les nouvelles observations du CEL filtrées par ".
"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, projet ".
"et/ou date.");
}
private function getServiceListeDesFlux() {
return $this->flux;
}
private function getServiceOpml() {
$donnees = array();
$id = 1;
foreach ($this->flux as $flux_nom => $flux){
$info = array();
$info['type'] = 'atom';
$info['titre'] = $flux['titre'];
$info['texte'] = "CEL - Obs - $flux_nom";
$info['description'] = $flux['description'];
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
$donnees['liste_flux'][] = $info;
}
$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
private function getServiceParDefaut() {
// Construction de la requête
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM cel_inventory WHERE identifiant like "%@%" '.
(($this->etreFluxAdmin()) ? '' : 'AND transmission = 1 ').
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequete($requete);
// Création du contenu
$contenu = $this->executerService($elements);
return $contenu;
}
private function getServiceParMotsCles() {
$infos=array();
$infos[0]['num_nom_sel'] = '';
$infos[0]['date_modification'] = '2011-06-28';
$donnees = $this->construireDonneesCommunesAuFlux($infos);
$donnees['items'][0]['guid'] = 0;
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationObservation/multicriteres/atom?projet=';
if (isset($this->parametres[0])) {
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
} else {
$donnees['items'][0]['description'] .= '</b>';
}
$donnees['items'][0]['titre'] = '';
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
private function getServiceParCommune() {
$infos=array();
$infos[0]['num_nom_sel'] = '';
$infos[0]['date_modification'] = '2011-06-28';
$donnees = $this->construireDonneesCommunesAuFlux($infos);
$donnees['items'][0]['guid'] = 0;
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationObservation/multicriteres/atom?commune=';
if (isset($this->parametres[0])) {
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
} else {
$donnees['items'][0]['description'] .= '</b>';
}
$donnees['items'][0]['titre'] = '';
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
private function getServiceMultiCriteres() {
$contenu = '';
if (isset($_GET['debut'])) $this->start = $_GET['debut'];
if (isset($_GET['limite'])) $this->limite = $_GET['limite'];
// Construction de la requête
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM cel_inventory '.
'WHERE identifiant like "%@%" AND '.(($this->etreFluxAdmin()) ? '' : ' transmission = 1 AND ');
if ($this->estUneRechercheGenerale()) {
$chaine_requete = $_GET['recherche'];
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
} else {
$criteres = $this->traiterCriteresMultiples($_GET) ;
if (!empty($criteres)) {
$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
}
}
$requete = rtrim($requete, 'AND ');
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby :
'date_modification DESC, location ASC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequete($requete);//echo $requete;
 
// Création du contenu
if ($elements != false && count($elements) > 0) {
$contenu = $this->executerService($elements);
} else {
$this->messages[] = "Aucune observation disponible.";
}
return $contenu;
}
private function creerSousRequeteRechercheParCriteres($criteres) {
$requete = '';
foreach ($criteres as $pair) {
$nom_valeur = explode("=",$pair);
if (sizeof($nom_valeur) != 0) {
switch ($nom_valeur[0]) {
case "ci_limite" : $this->limite = $this->bdd->quote($nom_valeur[1]); break;
case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
foreach($mots_comment_liste as $mot_comment) {
$mot_comment = trim($mot_comment) ;
$requete .= $nom_valeur[0].' LIKE '.$this->bdd->quote('%'.$mot_comment.'%').' AND ';
}
break;
case "date_observation" :
$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
}
$requete .= $nom_valeur[0].'='.$this->bdd->quote($nom_valeur[1]).' AND '; break;
case "nom_ret" :
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'.
$nom_valeur[1].'%") AND '; break;
case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break;
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
}
}
}
$requete = rtrim($requete,' AND ');
return $requete;
}
private function creerSousRequeteMotsCles($mot_cle) {
$requete = 'mots_cles like "inexistant" OR';
if (preg_match('/.*OU.*/', $mot_cle)) {
$requete = $this->creerSousRequeteMotsClesOu($mot_cle);
} else if (preg_match('/.*ET.*/', $mot_cle)) {
$requete = $this->creerSousRequeteMotsClesEt($mot_cle);
} else {
// Construction de la requête
$prerequete = 'SELECT * '.
'FROM cel_mots_cles_obs '.
'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle));
$elements = $this->executerRequete($prerequete);
if ($elements != false && count($elements) > 0) {
$requete = '';
foreach ($elements as $occurence) {
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
}
}
$requete = rtrim($requete,' OR ').' AND ';
return $requete;
}
private function creerSousRequeteMotsClesOu($mot_cle) {
$requete = 'mots_cles like "inexistant" OR';
$tab_mots_cles = explode('OU', $mot_cle);
$where = '';
foreach ($tab_mots_cles as $mot) {
$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR ';
}
$where = rtrim($where,' OR ');
// Construction de la requête
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where ";
$elements = $this->executerRequete($prerequete);//print_r($elements);
if ($elements != false && count($elements) > 0) {
$requete = '';
foreach ($elements as $occurence) {
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
}
return $requete;
}
private function creerSousRequeteMotsClesEt($mot_cle) {
$requete = 'mots_cles like "inexistant" OR';
$where = '';
$champs = 'a.cmc_id_proprietaire , ';
$table = '';
$i = "a"; $j = "a";
$tab_mots_cles = explode("ET", $mot_cle);
foreach ($tab_mots_cles as $mot) {
$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , ";
$table .= "cel_mots_cles_obs $i , ";
$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND ';
if ($i !== "a") {
$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND ";
$j++;
}
$i++;
}
$where = rtrim($where,' AND '); $champs = rtrim($champs,' , '); $table = rtrim($table,' , ');
// Construction de la requête
$prerequete = "SELECT $champs FROM $table WHERE $where ";
$elements = $this->executerRequete($prerequete);//print_r($elements);
if ($elements != false && count($elements) > 0) {
$requete = '';
foreach ($elements as $occurence) {
$requete = ' (';
for ($j = 'a'; $j < $i; $j++) {
$requete .= 'mots_cles like "%'.$occurence[$j].'%" AND ';
}
$requete .= ' identifiant = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
}
}
return $requete;
}
private function traiterCriteresMultiples($tableau_criteres) {
$tableau_criteres_pour_bdd = array();
foreach($tableau_criteres as $nom_critere => $valeur_critere) {
if (isset($this->criteres[$nom_critere])) {
$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
}
}
return $tableau_criteres_pour_bdd;
}
private function creerSousRequeteRechercheGenerale($chaine_requete) {
$requete = '';
if (trim($chaine_requete) != '') {
$chaine_requete = strtolower($chaine_requete);
$chaine_requete = str_replace(' ', '_', $chaine_requete);
$requete = ' ('.
'nom_ret LIKE "'.$chaine_requete.'%"'.
' OR '.
'nom_sel LIKE "'.$chaine_requete.'%"'.
' OR '.
'location LIKE "'.$chaine_requete.'%" '.
' OR '.
'id_location LIKE "'.$chaine_requete.'%" '.
' OR '.
'identifiant LIKE "'.$chaine_requete.'%" '.
') ';
}
return $requete;
}
private function estUneRechercheGenerale() {
return isset($_GET['recherche']);
}
private function executerService($elements) {
$contenu = '';
if (is_array($elements)) {
// Prétraitement des données
$donnees = $this->construireDonneesCommunesAuFlux($elements);
foreach ($elements as $element) {
$identifiants[$element['identifiant']] = $element['identifiant'];
}
$this->auteurs = $this->creerAuteurs($identifiants);
foreach ($elements as $element) {
$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
}
// Création du contenu à partir d'un template PHP
if (isset($this->squelette)) {
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
}
}
return $contenu;
}
private function construireDonneesCommunesAuFlux($observations) {
$donnees = $this->getFlux($this->service);
$donnees['guid'] = $this->getUrlServiceBase();
$donnees['titre'] = 'Flux des observations du CEL';
$donnees['lien_service'] = $this->creerUrlService();
$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu'];
$donnees['editeur'] = $this->config['settings']['editeur'];
$derniere_info_en_date = reset($observations);
$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']);
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
$donnees['annee_courante'] = date('Y');
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation';
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0';
return $donnees;
}
private function construireDonneesCommunesAuxItems($observation) {
$item = array();
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']);
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation']));
$item['titre'] = $this->creerTitre($observation);
$item['guid'] = $this->creerGuidItem($observation);
$item['lien'] = $this->creerLienItem($observation);
$item['categorie'] = $this->creerCategorie($item);
$item['description'] = $this->creerDescription($this->protegerCaracteresHtmlDansChamps($observation), $item);
$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item));
$item['modifier_par'] = $this->auteurs[$observation['identifiant']];
return $item;
}
private function creerTitre($obs) {
$nom_plante = $obs['nom_sel'].' [nn'.$obs['num_nom_sel'].']';
$lieu = $obs['location'].' ('.$obs['id_location'].')';
$utilisateur = $this->auteurs[$obs['identifiant']];
$titre = "$nom_plante à $lieu par $utilisateur";
$titre = $this->nettoyerTexte($titre);
return $titre;
}
private function creerGuidItem($element) {
$guid = sprintf($this->config['settings']['guidObsTpl'], $element['id']);
return $guid;
}
private function creerLienItem($element) {
$lien = null;
if ($element['num_nom_sel'] != 0) {
$lien = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($element['num_nom_sel']), 'cel');
}
return $lien;
}
private function creerDescription($obs, $item) {
$id_obs = $obs['id'];
$famille = $obs['famille'];
$nom_saisi = $obs['nom_sel'];
$nom_retenu = $obs['nom_ret'];
$auteur = $this->auteurs[$obs['identifiant']];
$auteur_mail = $obs['identifiant'];
$mots_cles_obs = $this->decoderMotsClesObs($obs['identifiant'], $obs['mots_cles']);
$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id']);
$lieu = $obs['location'].' ('.$obs['id_location'].') > '.$obs['lieudit'].' > '.$obs['station'];
$milieu = $obs['milieu'];
$coordonnees = ($this->etreNull($obs['coord_x']) && $this->etreNull($obs['coord_y'])) ? '' : $obs['coord_x'].'/'.$obs['coord_y'];
$commentaire = $obs['commentaire'];
$date_observation = $this->formaterDate($obs['date_observation'], '%A %d %B %Y');
$date_transmission = $this->formaterDate($obs['date_transmission']);
$date_modification = $this->formaterDate($obs['date_modification']);
$date_creation = $this->formaterDate($obs['date_creation']);
$transmission = $obs['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
$description = '<h2>'."Observation #$id_obs de $nom_saisi".'</h2>'.
'<ul>'.
'<li>'.'Famille : '.$famille.'</li>'.
'<li>'.'Nom saisi : '.$nom_saisi.'</li>'.
'<li>'.'Nom retenu : '.$nom_retenu.'</li>'.
'<li>'.'Observée le : '.$date_observation.'</li>'.
'<li>'.'Lieu : '.$lieu.'</li>'.
'<li>'.'Milieu : '.$milieu.'</li>'.
(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : '').
'<li>'.'Commentaire : '.$commentaire.'</li>'.
'<li>'.'Mots-clés : '.implode(', ', $mots_cles_obs).'</li>'.
(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : '').
'<li>Modifiée le : '.$date_modification.'</li>'.
'<li>Créée le : '.$date_creation.'</li>'.
'<li>'.'Par : '.
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
'</li>'.
(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : '').
'</ul>';
$description = $this->nettoyerTexte($description);
return $description;
}
private function creerCategorie($element) {
$categorie = '';
$categorie = 'Observation';
$categorie = $this->nettoyerTexte($categorie);
return $categorie;
}
private function etreFluxAdmin() {
return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
}
private function creerUrlService() {
$url_service = $this->getUrlServiceBase();
if (count($_GET) > 0) {
$parametres_get = array();
foreach ($_GET as $cle => $valeur) {
$parametres_get[] = $cle.'='.$valeur;
}
$url_service .= '?'.implode('&amp;', $parametres_get);
}
return $url_service;
}
}
/tags/celw-v1.1/jrest/services/.
New file
Property changes:
Added: svn:ignore
+MigrationImages.php
+MigrationMotsCles.php
+MigrationObs.php