Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Ignore whitespace Rev 415 → Rev 416

/trunk/jrest/services/ImageRss.php
New file
0,0 → 1,368
<?php
 
 
Class ImageRss extends DBAccessor {
 
var $config;
function ImageRss($config) {
 
$this->config=$config;
}
function getElement($uid){
$this->authentifier();
$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');
$query_id_id_img = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles WHERE cmc_id_mot_cle_general = md5("'.$DB->escapeSimple($uid[0]).'")' ;
$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>
<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']. ' modifie 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 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 : '.htmlentities($mots_cles).' <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(){
$this->authentifier();
$DB=$this->connectDB($this->config,'cel_db');
$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>';
 
$query='SELECT * FROM cel_images 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());
}
$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']. ' modifie 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 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 : '.htmlentities($mots_cles).' <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 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 ;
}
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) ;
}
}
 
 
/* +--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
*
*
*
*/
 
?>
/trunk/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
*
*
*
*/
 
?>
/trunk/jrest/services/User.php
New file
0,0 → 1,260
<?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 User extends DBAccessor {
 
function User($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) ;
 
$json = new Services_JSON();
$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) ;
 
$json = new Services_JSON();
$output = $json->encode(array($retour,$connected,$admin));
 
print($output);
 
}
// USERS
 
function LoadUser($name) {
 
$DB=$this->connectDB($this->config,'database_ident');
$query="SELECT ".$this->config['database_ident']['ann_id']." as name, ".$this->config['database_ident']['ann_pwd']." as password FROM ".$this->config['database_ident']['annuaire']." WHERE ".$this->config['database_ident']['ann_id']." ='".$DB->escapeSimple($name)."'";
 
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$password=$row['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
*
*
*/
 
?>
/trunk/jrest/services/NameMap.php
New file
0,0 → 1,139
<?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.
*/
 
// in utf8
// out utf8
 
/*
* NameMap.php
*
* 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
*/
 
/** 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 DBAccessor {
 
 
var $config;
var $extendMapProductor;
function NameMap($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
 
// Num nomenclatural : recherche nt
$DB=$this->connectDB($this->config);
$query = "SELECT DISTINCT b.esn_id_taxon FROM eflore_nom, eflore_nom_rang," .
" eflore_selection_nom a, eflore_selection_nom b".
" WHERE a.esn_id_nom= ".$uid[0].
" 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 a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$nt=$row['esn_id_taxon'];
}
 
// si le taxon cherché n'existe pas
if(!$nt) {
$json = new Services_JSON();
$output = $json->encode(array(''));
print($output);
exit();
}
$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);
}
$json = new Services_JSON();
$output = $json->encode(array($file));
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
/trunk/jrest/services/ImageRDF.php
New file
0,0 → 1,132
<?php
/**
* PHP Version 5
*
* Retourne un RDF des images pour eflore
*
* @category PHP
* @package jrest
* @author david <david@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/
*/
Class ImageRDF extends DBAccessor {
 
var $config;
 
function ImageRDF($config) {
 
$this->config=$config;
}
 
/**
* Recherche des images associee au numero nomenclatural
* @param numeric $uid [0] : numero nomenclatural obligatoire , $uid[1] (optionnel) : taille image : S , M, L (default)
*/
// TODO : recherche taxon ?
function getElement($uid){
 
// Taille
if (isset($uid[1])) {
$taille=$uid[1]; // S , M ou L
}
else {
$taille='L';
}
$DB=$this->connectDB($this->config,'cel_db');
// Recherche de toutes les observations transmises du taxon pour lesquelles une photo est associee.
$query = 'SELECT * FROM cel_inventory, cel_obs_images, cel_images '.
' WHERE cel_inventory.num_nom_sel = "'.mysql_escape_string($uid[0]).'"'.
' AND cel_obs_images.coi_ce_utilisateur = cel_inventory.identifiant '.
' AND cel_obs_images.coi_ce_observation = cel_inventory.ordre '.
' AND cel_inventory.transmission = 1 '.
' AND cel_images.ci_ce_utilisateur = cel_obs_images.coi_ce_utilisateur '.
' AND ci_id_image = cel_obs_images.coi_ce_image';
 
$result =& $DB->query($query);
 
if (DB::isError($result)) {
die($result->getMessage());
}
 
 
$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";
 
while ($picture =& $result->fetchrow(DB_FETCHMODE_ASSOC)) {
 
// Calcul du chemin sur le serveur en fonction de l'identifiant (id)
$id = $picture['ci_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 ;
 
$xml .= ' <rdf:Description about="'.$picture_path_with_level.'/'.$taille.'/'.$id.'_'.$taille.'.jpg'.'"'."\n";
$xml .= ' dc:identifier="'.'urn:lsid:tela-botanica.org:celpic:'.$picture['ci_id_image'].'"'."\n";
$xml .= ' dc:title="'.$picture['nom_sel'].'"'."\n";
$xml .= ' dc:description="'.$picture['nom_sel']." - [fichier_origine:".$picture['ci_nom_original'].'][image_identifiant:'.$picture['ci_id_image'].']';
$xml .= '[image_ordre:'.$picture['ci_ordre'].']';
$xml .= '[observation_identifiant:'.$picture['id'].']';
$xml .= '[observation_ordre:'.$picture['ordre'].']'.'"'."\n";
list($identifiant) = split("@", $picture['identifiant']);
$creator=$identifiant."@...";
$xml .= ' dc:creator="'.$creator.'"'."\n";
$xml .= ' dc:publisher="CEL"'."\n";
$xml .= ' dcterms:spatial="'.utf8_decode($picture['location'])." (".$picture['id_location'].")".'"'."\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(html_entity_decode(str_replace(' & ', ' &#38; ', $xml)));
 
}
 
 
}
?>
/trunk/jrest/services/InventoryImageLink.php
New file
0,0 → 1,246
<?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
/*
* InventoryImageLink.php
*
* 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 DBAccessor {
 
var $config;
 
function InventoryImageLink($config) {
 
$this->config=$config;
}
 
function createElement($pairs)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['identifiant']);
 
$DB=$this->connectDB($this->config,'cel_db');
 
$ids_images = $pairs['coi_ce_image'] ;
$ids_images = rtrim($ids_images,',') ;
 
$ids_images_liste = explode(",",$ids_images) ;
 
$utilisateur = $pairs['identifiant'] ;
 
$ids_observations = $pairs['coi_ce_observation'] ;
$ids_observations = rtrim($ids_observations,',') ;
$ids_observations_liste = explode(",",$ids_observations) ;
 
foreach($ids_images_liste as $image)
{
foreach($ids_observations_liste as $observation)
{
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($image).'","'.$DB->escapeSimple($utilisateur).'","'.$DB->escapeSimple($observation).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
}
}
}
 
echo "OK" ;
exit ;
}
 
// renvoie les numeros des images liées à une observation ou l'inverse, suivant le paramètre
function getElement($uid)
{
// uid[0] : utilisateur obligatoire
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'cel_db');
 
if($uid) {
 
$param = $uid[1] ;
$param = ltrim($param,'&') ;
 
$tab_param = split('=',$param) ;
 
$field = $tab_param[0] ;
$value = $tab_param[1] ;
 
$query = "" ;
 
if ($field == 'coi_ce_observation')
{
$column = 'coi_ce_image' ;
$query = 'SELECT coi_ce_image, ci_meta_height , ci_meta_width '.
'FROM cel_obs_images, cel_images '.
'WHERE coi_ce_image = ci_id_image '.
'AND coi_ce_observation = "'.$DB->escapeSimple($value).'" AND coi_ce_utilisateur ="'.$DB->escapeSimple($uid[0]).'"' ;
}
else
{
$column = 'coi_ce_observation' ;
$query = 'SELECT nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, ordre, date_observation, lieudit,' .
'station, milieu, commentaire, transmission, id_location from cel_inventory WHERE ordre IN (SELECT '.$column.' FROM cel_obs_images WHERE '.$field.' = "'.$DB->escapeSimple($value).'") AND identifiant = "'.$DB->escapeSimple($uid[0]).' "' ;
}
 
}
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
}
 
while ($image_liee = $res->fetchrow(DB_FETCHMODE_ORDERED)) {
 
$images_liees[] = $image_liee ;
}
 
$res = json_encode($images_liees) ;
 
header("content-type: text/json") ;
print $res ;
exit() ;
}
 
// met à jour les associations entre images et observations
function updateElement($uid,$pairs)
{
/* // Controle detournement utilisateur
session_start();
if (($_SESSION['user']!="") && $_SESSION['user']['name']!=$uid[0]) {
print "Acces interdit";
return;
}
 
$DB=$this->connectDB($this->config,'cel_db');
 
$query = "SELECT * FROM cel_obs_images WHERE " ;
$query .= ' WHERE '.$ci_id_image.' = "'.$DB->escapeSimple($pairs['ci_id_image']).'"' ;
}
 
function deleteElement($uid)
{
 
// uid[0] : utilisateur obligatoire
// uid[1] : identifiant(s) image(s) obligatoire(s)
 
// Controle detournement utilisateur
session_start();
if (($_SESSION['user']!="") && $_SESSION['user']['name']!=$uid[0]) {
print "Acces interdit";
return;
}
 
$DB=$this->connectDB($this->config,'cel_db');
 
$id = rtrim($uid[1],",") ;
 
if (isset($id)) {
$query="DELETE FROM cel_images WHERE ci_id_image in (".$DB->escapeSimple($id) .")";
//$query = "DELETE FROM cel_obs_images WHERE coi_fk__image in (".$DB->escapeSimple($uid[1]) .")";
}
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
die($res->getMessage());
}
else
{
echo "OK" ;
exit() ;
}
 
$id_fichiers = explode(",",$id) ;
foreach($id_fichiers as $en_cours)
{
supprimer_fichier($en_cours) ;
}
 
*/
}
 
function deleteElement($uid)
{
 
// uid[0] : utilisateur obligatoire
// uid[1] : identifiant(s) image(s) obligatoire(s)
// uid[2] : identifiant(s) observations
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'cel_db');
 
$id_img = $DB->escapeSimple($uid[1]) ;
$id_obs = $DB->escapeSimple($uid[2]) ;
 
$id = $uid[0] ;
 
if (isset($id)) {
$query = "DELETE FROM cel_obs_images WHERE coi_ce_image = ".$id_img." AND coi_ce_observation IN (".$id_obs.") AND coi_ce_utilisateur = '".$id."'" ;
}
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
die($res->getMessage());
}
else
{
echo "OK" ;
exit() ;
}
 
}
 
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/jrest/services/Name.php
New file
0,0 → 1,200
<?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.
*/
// in : utf8
// out : utf8
/*
* Name.php
*
* 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 DBAccessor {
 
 
var $config;
function Name($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
$value=array();
// Num nomenclatural
if (isset($uid[0])) {
$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_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= '".$uid[0]. "'".
" 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 ";
}
else {
print "[\"null\"]";
return ;
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
 
$value=array("null");
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$value=array(($this->formaterNom($row)));
}
$json = new Services_JSON();
$output = $json->encode($value);
print($output);
 
 
}
function getRessource(){
print "[\"null\"]";
return;
}
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 .retournerAuteur($rawnom) ;
}
}
 
 
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 ;
}
 
/* +--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
/trunk/jrest/services/CelSyndicationObservation.php
New file
0,0 → 1,431
<?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 $format = null;
private $service = null;
private $parametres = null;
private $squelette = null;
private $squelette_dossier = null;
private $flux = array();
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params = array()) {
// Initialisation des variables
$info = array();
$contenu = '';
// 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']['baseURLAbsoluDyn'], get_class($this).'/');
return $url_base;
}
private function getUrlServiceBase() {
$url_service = $this->getUrlBase().$this->service.'/'.$this->format;
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 des observations publiques du CEL filtrées par mots clés',
"Ce flux fournit des informations sur les observations du CEL filtrées par mots-clés. Il nécessite d'être
paramétré en indiquant en dernier position de l'url le mot-clé à rechercher.");
$this->setFlux('par-commune','Flux de syndication des observations publiques du CEL filtrées par commune',
"Ce flux fournit des informations sur les observations du CEL filtrées par commune. Il nécessite d'être
paramétré en indiquant en dernier position de l'url le nom de la commune à rechercher.");
}
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 = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM cel_inventory '.
'WHERE transmission = 1 '.
'ORDER BY '.((!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 getServicePourAdmin() {
$contenu = '';
if ($this->authentifier()) {
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM cel_inventory '.
'ORDER BY '.((!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() {
$contenu = '';
$mot_cle = $this->parametres[0];
 
if (isset($mot_cle)) {
$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($mot_cle));
 
// Construction de la requête
$requete = 'SELECT * '.
'FROM cel_mots_cles_obs '.
"WHERE cmc_id_mot_cle_general = $mot_cle_encode ";
$elements = $this->executerRequete($requete);
if ($elements != false && count($elements) > 0) {
// Pré-construction du where de la requête
$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %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']));
}
// Construction de la requête
$requete = 'SELECT * '.
'FROM cel_inventory '.
'WHERE transmission = 1 '.
'AND '.implode(" \nOR ", $requete_where).' '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'date_modification, date_creation DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequete($requete);
// Création du contenu
$contenu = $this->executerService($elements);
} else {
$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
}
} else {
$this->messages[] = "Le service demandé nécessite d'indiquer un mot-clé en dernier paramêtre.";
}
return $contenu;
}
private function getServiceParCommune() {
$contenu = '';
$commune = $this->parametres[0];
if (isset($commune)) {
$commune = $this->bdd->quote($commune);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM cel_inventory '.
'WHERE transmission = 1 '.
"AND location = $commune ".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'date_modification DESC, location ASC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequete($requete);
// Création du contenu
$contenu = $this->executerService($elements);
} else {
$this->messages[] = "Le service demandé nécessite d'indiquer une nom de commune en dernier paramêtre.";
}
return $contenu;
}
private function executerService($elements) {
$contenu = '';
if (is_array($elements)) {
// Prétraitement des données
$donnees = $this->construireDonneesCommunesAuFlux($elements);
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['lien_service'] = $this->creerUrlService();
$donnees['lien_cel'] = $this->config['settings']['celUrlAbsolu'];
$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';
preg_match('/([0-9]+)/', '$Revision$', $match);
$donnees['generateur_version'] = $match[1];
return $donnees;
}
private function construireDonneesCommunesAuxItems($observation) {
$item = array();
$date_modification_timestamp = strtotime($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['description'] = $this->creerDescription($observation, $item);
$item['categorie'] = $this->creerCategorie($item);
$item['description_encodee'] = htmlspecialchars($item['description']);
$item['modifier_par'] = $this->creerAuteur($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->creerAuteur($obs['identifiant']);
$titre = "$nom_plante à $lieu par $utilisateur";
$titre = $this->nettoyerTexte($titre);
return $titre;
}
private function creerAuteur($courriel) {
$auteur = ($this->etreFluxAdmin()) ? $courriel : $this->traiterCourriel($courriel);
return $auteur;
}
private function traiterCourriel($courriel) {
$courriel = preg_replace('/[^@]+$/i', '...', $courriel);
return $courriel;
}
private function nettoyerTexte($txt) {
$txt = preg_replace('/&(?!(a-z+|#0-9+|#x0-9a-f+);)/i', '&amp;', $txt);
$txt = preg_replace('/000null/i', '', $txt);
return $txt;
}
private function creerGuidItem($element) {
$guid = sprintf($this->config['settings']['guidObsTpl'], 'obs'.$element['id']);
return $guid;
}
private function creerLienItem($element) {
$lien = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($element['num_nom_sel']));
return $lien;
}
private function creerDescription($obs, $item) {
$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id']);
$description =
'<ul>'.
' <li>Nom saisi : '.$obs['nom_sel'].'</li>'.
(($obs['nom_sel'] != $obs['nom_ret']) ? ' <li>Nom retenu : '.$obs['nom_ret'].'</li>' : '').
' <li>Lieu : '.$obs['location'].' ('.$obs['id_location'].')</li>'.
($this->etreNull($obs['station']) ? '': ' <li>Station : '.$obs['station'].'</li>').
($this->etreNull($obs['milieu']) ? '': ' <li>Milieu : '.$obs['milieu'].'</li>').
($this->etreNull($obs['commentaire']) ? '': ' <li>Commentaire : '.$obs['commentaire'].'</li>').
(($this->etreFluxAdmin()) ? ' <li>Transmis (= public) : '.($obs['transmission'] == 1 ? 'oui' : 'non').'</li>' : '').
' <li>Modifiée le : '.$item['date_maj_simple'].'</li>'.
' <li>Créée le : '.$item['date_creation_simple'].'</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 ($this->service == 'pour-admin') ? true : false;
}
private function etreNull($valeur) {
$etre_null = false;
if ($valeur == '' || $valeur == null || $valeur == '000null' || $valeur == 'null') {
$etre_null = true;
}
return $etre_null;
}
private function creerUrlService() {
$url_service = $this->getUrlServiceBase();
if (isset($this->start) || isset($this->limit)) {
$arguments = array();
if (isset($this->start) && isset($_GET['start'])) {
$arguments[] = 'start='.$this->start;
}
if (isset($this->limit) && isset($_GET['limit'])) {
$arguments[] = 'limit='.($this->limit);
}
if (count($arguments) > 0) {
$url_service .= '?'.implode('&', $arguments);
}
}
return $url_service;
}
}
/trunk/jrest/services/InventoryKeyWordObsLink.php
New file
0,0 → 1,139
<?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
/*
* InventoryImageLink.php
*
* 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 InventoryKeyWordObsLink extends DBAccessor {
 
var $config;
 
function InventoryKeyWordObsLink($config) {
 
$this->config=$config;
}
 
// met à jour les associations entre images et observations
function updateElement($uid,$pairs)
{
// Controle detournement utilisateur
session_start();
if (($_SESSION['user']!="") && $_SESSION['user']['name']!=$uid[0]) {
print "Acces interdit";
return;
}
 
$DB=$this->connectDB($this->config,'database_cel');
 
if(!isset($pairs['mots_cles']) || !isset($uid[1])) {
return;
}
 
if(isset($pairs['action'])) {
$action = $pairs['action'];
}
 
$valeur = $pairs['mots_cles'];
 
$valeur = trim($valeur, "null");
$valeur = trim($valeur, ";;");
 
$query="UPDATE cel_inventory SET " ;
$query .= "mots_cles = CONCAT(IFNULL(mots_cles,''),'".$DB->escapeSimple($valeur).";') ";
$query .= "WHERE ordre IN (".$uid[1].") AND identifiant = '".$DB->escapeSimple($uid[0])."'";
 
echo $query;
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur d'ajout de plusieurs observations :".$res->getMessage()." ".$query);
die($res->getMessage());
}
echo $query;
 
return true;
}
 
function deleteElement($uid){
 
// Controle detournement utilisateur
session_start();
if (($_SESSION['user']!="") && $_SESSION['user']['name']!=$uid[0]) {
print "Acces interdit";
return;
}
 
$DB=$this->connectDB($this->config,'database_cel');
 
if(!isset($uid[2]) || !isset($uid[1])) {
echo 'pas de mots clés';
return;
}
 
$valeur = $uid[2] ;
 
$valeur = trim($valeur, "null");
$valeur = trim($valeur, ";;");
 
$query="UPDATE cel_inventory SET " ;
$chaine = $DB->escapeSimple($valeur);
 
$query .= "mots_cles = REPLACE(REPLACE(mots_cles,'".$chaine."',''),';;',';') ";
$query .= "WHERE ordre IN (".$uid[1].") AND identifiant = '".$DB->escapeSimple($uid[0])."'";
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de suppression des mots clés de plusieurs observations :".$res->getMessage()." ".$query);
die($res->getMessage());
}
 
return true;
 
 
}
 
}
?>
/trunk/jrest/services/CelDao.php
New file
0,0 → 1,219
<?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.
* Elle est abstraite donc doit obligatoirement être étendue.
*
* @category Php5
* @package Referentiel
* @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$
*/
class CelDao {
const ORDRE_ASCENDANT = 'ASC';
const ORDRE_DESCENDANT = 'DESC';
const HTTP_REQUETE_SEPARATEUR = '&';
protected $distinction = '0';
protected $limite_debut = null;
protected $limite_nbre = null;
protected $ordre = null;
public $url_jrest = null;
public function __construct($url_jrest_distant) {
$this->url_jrest = $url_jrest_distant;
}
//+----------------------------------------------------------------------------------------------------------------+
// ACCESSEURS
public function setDistinction($distinct) {
$this->distinction = $distinct;
}
public function getDistinction() {
return $this->distinction;
}
public function viderDistinction() {
$this->distinction = null;
}
public function avoirLimitation() {
$limitation = false;
if (!is_null($this->limite_debut) && !is_null($this->limite_nbre)) {
$limitation = true;
}
return $limitation;
}
public function setLimitation($limite_debut, $limite_nbre) {
$this->limite_debut = $limite_debut;
$this->limite_nbre = $limite_nbre;
}
public function getLimiteDebut() {
return $this->limite_debut;
}
public function getLimiteNbre() {
return $this->limite_nbre;
}
public function viderLimite() {
$this->limite_debut = null;
$this->limite_nbre = null;
}
public function addOrdre($champ, $trie = self::ORDRE_ASCENDANT) {
if (!isset($this->ordre[$champ])) {
if (self::ORDRE_ASCENDANT == $trie || self::ORDRE_DESCENDANT == $trie) {
$this->ordre[$champ] = $trie;
} else {
$e = "La valeur pour le trie doit être : {self::ORDRE_ASCENDANT} ou {self::ORDRE_DESCENDANT}.";
trigger_error($e, E_USER_WARNING);
}
} else {
$e = "Le champ $champ existe déjà dans le tableau des ordres.";
trigger_error($e, E_USER_WARNING);
}
}
public function getOrdre() {
$champs = array();
foreach ($this->ordre as $champ => $trie) {
$champs[] = "$champ $trie";
}
return implode(', ', $champs);
}
public function viderOrdre() {
$this->ordre = null;
}
//+----------------------------------------------------------------------------------------------------------------+
// MÉTHODES
public function envoyerRequeteConsultation($url) {
$url = $this->traiterUrlParametres($url);
$retour = $this->envoyerRequete($url, 'GET');
return $retour;
}
public function envoyerRequeteAjout($url, Array $donnees) {
$retour = $this->envoyerRequete($url, 'PUT', $donnees);
return $retour;
}
public function envoyerRequeteModif($url, Array $donnees) {
$retour = $this->envoyerRequete($url, 'POST', $donnees);
return $retour;
}
public function envoyerRequeteSuppression($url) {
$retour = $this->envoyerRequete($url, 'DELETE');
return $retour;
}
private function envoyerRequete($url, $mode, Array $donnees = array()) {
$contenu = false;
if ($mode != 'GET' && $mode != 'PUT' && $mode != 'POST' && $mode != 'DELETE') {
$e = "Le mode de requête '$mode' n'est pas accepté!";
trigger_error($e, E_USER_WARNING);
} else {
$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_REQUETE_SEPARATEUR))));
$flux = @fopen($url, 'r', false, $contexte);
if (!$flux) {
$this->traiterEntete($http_response_header, $url);
$e = "L'ouverture de l'url '$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
$entetes = stream_get_meta_data($flux);
$this->traiterEntete($entetes, $url);
// Contenu actuel de $url
$contenu = stream_get_contents($flux);
fclose($flux);
}
}
$this->reinitialiser();
return $contenu;
}
private function traiterUrlParametres($url) {
$parametres = array();
if (! is_null($this->getLimiteDebut())) {
$parametres[] = 'start='.$this->getLimiteDebut();
}
if (! is_null($this->getLimiteNbre())) {
$parametres[] = 'limit='.$this->getLimiteNbre();
}
if (! is_null($this->ordre)) {
$parametres[] = 'orderby='.urlencode($this->getOrdre());
}
if ($this->getDistinction() != 0) {
$parametres[] = 'distinct='.$this->getDistinction();
}
if (count($parametres) > 0) {
$url_parametres = implode('&', $parametres);
$url = $url.'?'.$url_parametres;
}
return $url;
}
private function traiterEntete($entetes, $uri) {
$infos = $this->analyserEntete($entetes, $uri);
$this->traiterEnteteDebug($infos);
$this->traiterEnteteMessage($infos);
}
private function analyserEntete($entetes, $uri) {
$infos = array('date' => null, 'uri' => $uri, 'debugs' => null, 'messages' => null);
if (isset($entetes['wrapper_data'])) {
$entetes = $entetes['wrapper_data'];
}
foreach ($entetes as $entete) {
if (preg_match('/^X-DebugJrest-Data: (.+)$/', $entete, $match)) {
$infos['debugs'] = json_decode($match[1]);
}
if (preg_match('/^X-MessageJrest-Data: (.+)$/', $entete, $match)) {
$infos['messages'] = 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 traiterEnteteDebug($entetes) {
if (isset($entetes['debugs'])) {
$date = $entetes['date'];
$uri = $entetes['uri'];
$debugs = $entetes['debugs'];
foreach ($debugs as $debug) {
$e = "DEBUG : $date - $uri :\n$debug";
trigger_error($e, E_USER_NOTICE);
}
}
}
private function traiterEnteteMessage($entetes) {
if (isset($entetes['messages'])) {
$date = $entetes['date'];
$uri = $entetes['uri'];
$messages = $entetes['messages'];
foreach ($messages as $message) {
$e = "MESSAGE : $date - $uri :\n$message";
trigger_error($e, E_USER_NOTICE);
}
}
}
private function reinitialiser() {
$this->viderDistinction();
$this->viderLimite();
$this->viderOrdre();
}
}
/trunk/jrest/services/InventoryUserList.php
New file
0,0 → 1,96
<?php
// in utf8
// out utf8
 
// List des stations par utilisateur et par commune
 
Class InventoryUserList extends DBAccessor {
 
 
var $config;
function InventoryUserList($config) {
 
$this->config=$config;
}
 
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
// uid[0] : utilisateur obligatoire
$DB=$this->connectDB($this->config,'database_cel');
$value=array();
 
$query='SELECT DISTINCT identifiant FROM cel_inventory' ;
if(isset($uid[1]) && $uid[1] != null && $uid[1] != '*') {
$query .= ' WHERE identifiant LIKE "'.$DB->escapeSimple($uid[1]).'%"';
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
$i = 0;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$value[$i] =$row['identifiant'];
$i++;
}
usort($value,'trierUtilisateurs');
$json = new Services_JSON();
$output = $json->encode($value);
print($output);
return true;
}
}
 
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
*
*
*
*/
 
?>
/trunk/jrest/services/InventoryImport.php
New file
0,0 → 1,125
<?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.
*/
 
// in : utf8
// out : utf8
 
/*
* InventoryImport.php
*
* Cas d'utilisation :
* Service importation releve en cours
*
* 1 : L'utilisateur � traiter est communique au service
* 2 : Les releves associ� � la session en cours sont transfer�s � l'utilisateur transmis
*/
 
 
Class InventoryImport extends DBAccessor {
 
var $config;
function InventoryImport($config) {
 
$this->config=$config;
}
 
function getElement($uid){
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
// uid[0] : utilisateur obligatoire
// Recuperation Dernier num�ro d'ordre utilis� :
$DB=$this->connectDB($this->config,'database_cel');
$query="SELECT max(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' ";
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
$ordre=0;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$ordre=$row['ordre']+1;
}
 
// Recuperation relev�s associ�s a la session
session_start();
$query=" SELECT ordre FROM cel_inventory WHERE identifiant = '".session_id()."' ORDER BY ordre";
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$query="UPDATE cel_inventory set identifiant ='".$DB->escapeSimple($uid[0]).
"',ordre='".$ordre."' WHERE identifiant = '".session_id()."' AND ordre = '".$row['ordre']."' ";
$res_update =& $DB->query($query);
if (DB::isError($res_update)) {
die($res_update->getMessage());
}
print $query;
$ordre++;
}
}
 
 
}
 
 
/* +--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
/trunk/jrest/services/CelImageDoublon.php
New file
0,0 → 1,115
<?php
/**
* Service fournissant une liste d'images doublon.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CelImageDoublon/Sortie/Utilisateur : images doublon d'un utilisateur.
*
* Sortie = Type de sortie : html ou json. Par défaut : html
* Utilisateur = identifiant (= courriel) de l'utilisateur.
*
* @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) {
$retour = null;
$parametres = $this->traiterParametres(array('sortie', 'utilisateur'), $params, false);
extract($parametres);
 
if (isset($sortie)) {
$methode = $this->traiterNomMethodeGet($sortie);
if (method_exists($this, $methode)) {
$retour = $this->$methode($parametres);
} else {
$this->messages[] = "Ce type de carte '$methode' n'est pas disponible.";
}
} else {
$this->messages[] = "Vous devez indiquer un type de sortie.";
}
 
if (is_null($retour)) {
$info = 'Un problème est survenu : '.print_r($this->messages, true);
$this->envoyer($info);
} else {
if ($retour['type'] == 'widget') {
$squelette = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR.$retour['squelette'].'.tpl.html';
$html = $this->traiterSquelettePhp($squelette, $retour['donnees']);
$this->envoyer($html);
} else if ($retour['type'] == 'json') {
$this->envoyer($retour['donnees']);
}
}
}
 
/**
* Carte par défaut
*/
public function getDoublonHtml($parametres) {
$widget = null;
extract($parametres);
 
// 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();
$md5 = array();
foreach ($images as $img) {
if (!isset($md5[$img['ci_md5']])) {
$md5[$img['ci_md5']][] = array('url' => $this->creerUrlImage($img['ci_id_image']), 'num' => $img['ci_ordre']);
} else {
if (!isset($doublons[$img['ci_md5']])) {
$doublons[$img['ci_md5']] = $md5[$img['ci_md5']];
}
$doublons[$img['ci_md5']][] = array('url' => $this->creerUrlImage($img['ci_id_image']), 'num' => $img['ci_ordre']);
}
}
}
 
//echo '<pre>'.print_r($doublons, true).'</pre>';
return $doublons;
}
 
private function creerUrlImage($id_image, $taille = 'S') {
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
$id_image = sprintf('%09s', $id_image);
$id_image = wordwrap($id_image, 3 , '_', true);
 
$niveauDossier = split('_', $id_image);
$dossierNiveau1 = $niveauDossier[0];
$dossierNiveau2 = $niveauDossier[1];
 
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2;
$chemin_img = "$chemin_sur_serveur_final/$taille/{$id_image}_$taille.jpg";
return $chemin_img;
}
}
/trunk/jrest/services/InventoryCheck.php
New file
0,0 → 1,83
<?php
 
// In utf8
// Out utf8
 
// Utilitaire mise a jour enregistrement inventaire
 
 
Class InventoryCheck extends DBAccessor {
 
 
var $config;
function InventoryCheck($config) {
 
$this->config=$config;
}
 
function getRessource(){
$DB=$this->connectDB($this->config,'database_cel');
// $query="SELECT id, location, id_location, date_observation, identifiant FROM cel_inventory WHERE transmission=1 ";
$query="SELECT id, location, id_location, date_observation, identifiant FROM cel_inventory";
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
if ($row['id_location']!="000null") {
$query="select * from locations where name = '".mysql_escape_string($row['location'])."' and code='".mysql_escape_string($row['id_location'])."' limit 1";
}
else {
$query="select * from locations where name = '".mysql_escape_string($row['location'])."' limit 1";
}
$resloc =& $DB->query($query);
if (DB::isError($resloc)) {
die($resloc->getMessage());
}
if ($resloc->numRows() == 0) {
print $row['id'];
print " ";
print $row['identifiant'];
print " : ";
print $row['location'];
print " - ";
print $row['id_location'];
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=".$row['id'];
$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
/trunk/jrest/services/InventoryStationList.php
New file
0,0 → 1,115
<?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'];
}
$json = new Services_JSON();
$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']);
}
$json = new Services_JSON();
$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
/trunk/jrest/services/CoordSearch.php
New file
0,0 → 1,63
<?php
// CRUD ligne d'inventaire :
// In get : utf8
// In post : utf8
// out : utf8
 
Class CoordSearch extends DBAccessor {
 
function Inventory($config) {
 
$this->config=$config;
}
 
 
function getElement($uid){
 
// Controle detournement utilisateur
session_start();
$value=array();
 
$lat = str_replace('"','',urldecode($uid[0]));
$lng = str_replace('"','',urldecode($uid[1]));
 
$commune = urldecode($uid[2]);
$code_postal = str_replace('"','',urldecode($uid[3]));
 
if(isset($uid[4]) && $uid[4] != "*" && $uid[4] != "?") {
$code_pays = urldecode($uid[4]);
} else {
$code_pays = 'FR';
}
 
if($lat != '*' && $lng != '*') {
 
$commune_json = file_get_contents("http://ws.geonames.org/findNearbyJSON?featureClass=ADM4&lat=".urlencode($lat)."&lng=".urlencode($lng)."&style=full") ;
header("Content-Type: text/html; charset=UTF-8");
$value = $commune_json ;
 
} elseif($commune != '*') {
 
$requete = "http://ws.geonames.org/postalCodeSearchJSON?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);
 
header("Content-Type: text/html; charset=UTF-8");
$value = $coord_json ;
 
} else {
 
header('HTTP/1.0 400 Bad Request');
echo "Commune ou Coordonnées non spécifiées " ;
exit;
}
 
print $value;
}
}
?>
/trunk/jrest/services/InventoryKeyWordList.php
New file
0,0 → 1,630
<?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
/*
* InventoryKeyWordList.php
*
* Cas d'utilisation :
* Service recherche et modifie 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
*/
 
Class InventoryKeyWordList extends DBAccessor {
 
var $config ;
 
protected $suffix = "";
 
function InventoryKeyWordList($config) {
 
$this->config=$config;
}
 
function verifierPresenceRacine($id)
{
$DB=$this->connectDB($this->config,'cel_db');
 
$query = 'SELECT COUNT(*) FROM cel_mots_cles'.$this->suffix.' WHERE cmc_id_proprietaire = "'.$DB->escapeSimple($id).'"' ;
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
 
die($res->getMessage());
}
else
{
$valeurs = $res->fetchrow(DB_FETCHMODE_ORDERED) ;
 
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] == 0)
{
$query = 'INSERT INTO cel_mots_cles'.$this->suffix.' VALUES ("'.$nom_racine.'",1,2,"'.$id_racine.'","'.$id_racine.'","'.$DB->escapeSimple($id).'","",0) ' ;
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
 
die($res->getMessage());
}
}
}
}
 
function desactiverAutoCommitEtCommencerTransaction()
{
$DB=$this->connectDB($this->config,'cel_db');
 
// desactive l'autocommit le temps de la maniulation de l'arbre
$query = "SET AUTOCOMMIT = 0" ;
$res =& $DB->query($query);
 
// et debute une nouvelle transaction
$query = "BEGIN " ;
$res =& $DB->query($query);
}
 
function reactiverAutoCommitEtCompleterTransaction()
{
$DB=$this->connectDB($this->config,'cel_db');
 
// complete la transaction
$query = "COMMIT " ;
$res =& $DB->query($query);
 
// reactive l'autocommit le temps de la maniulation de l'arbre
$query = "SET AUTOCOMMIT = 1" ;
$res =& $DB->query($query);
 
echo "OK" ;
}
 
function reactiverAutoCommitEtAnnulerTransaction()
{
$DB=$this->connectDB($this->config,'cel_db');
 
// annule la transaction
$query = "ROLLBACK " ;
$res =& $DB->query($query);
 
// reactive l'autocommit le temps de la maniulation de l'arbre
$query = "SET AUTOCOMMIT = 1" ;
$res =& $DB->query($query);
 
echo "ERROR" ;
}
 
// renvoie les bornes d'un noeud de l'arbre des mots cl�s
function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
 
$query = 'SELECT cmc_bd, cmc_bg, cmc_niveau FROM cel_mots_cles'.$this->suffix.' WHERE cmc_id_mot_cle_utilisateur = "'.$DB->escapeSimple($id_mot_cle).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
}
 
$results = array() ;
$valeurs = $res->fetchrow(DB_FETCHMODE_ASSOC) ;
 
 
return $valeurs ;
 
}
 
// decale les bornes de deux pour inserer un nouvel element
function decalerBornesPlusDeux($valeur,$id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
 
// decalage borne droite
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd + 2 WHERE cmc_bd >= "'.$DB->escapeSimple($valeur).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
$reussi_1 = false ;
}
else
{
$reussi_1 = true ;
}
 
// decalage borne gauche
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg + 2 WHERE cmc_bg >= "'.$DB->escapeSimple($valeur).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
$reussi_2 = false ;
}
else
{
$reussi_2 = true ;
}
 
$reussi = $reussi_1 && $reussi_2 ;
 
return $reussi ;
}
 
// decale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre)
function decalerBornesMoinsIntervalle($bg, $bd,$id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
 
 
$decalage = $bd - $bg + 1 ;
 
// decalage borne droite
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd - "'.$DB->escapeSimple($decalage).'" WHERE cmc_bd >= "'.$DB->escapeSimple($bg).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
$reussi_1 = false ;
}
else
{
$reussi_1 = true ;
}
 
// decalage borne gauche
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg - "'.$DB->escapeSimple($decalage).'" WHERE cmc_bg > "'.$DB->escapeSimple($bg).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
$reussi_2 = false ;
}
else
{
$reussi_2 = true ;
}
 
$reussi = $reussi_1 && $reussi_2 ;
 
return $reussi ;
}
 
// decale � droite des bornes don�es d'un intervalle positif donne (pour l'ajout d'un sous arbre)
function decalerBornesPlusIntervalle($valeur_bornes, $largeur,$id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
 
$decalage = $largeur ;
 
// decalage borne droite
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd + "'.$DB->escapeSimple($decalage).'" WHERE cmc_bd >= "'.$DB->escapeSimple($valeur_bornes).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
$reussi_1 = false ;
}
else
{
$reussi_1 = true ;
}
 
// decalage borne gauche
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg + "'.$DB->escapeSimple($decalage).'" WHERE cmc_bg >= "'.$DB->escapeSimple($valeur_bornes).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
$reussi_2 = false ;
}
else
{
$reussi_2 = true ;
}
 
$reussi = $reussi_1 && $reussi_2 ;
 
return $reussi ;
}
 
// inverse les bornes dun intervalle pour l'exclure des modifications sur l'arbre sans changer la hierarchie
function exclureIntervalle($bg, $bd, $id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
 
// decalage bornes
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd - "'.$DB->escapeSimple($bd).'" - 1 , cmc_bg = cmc_bg - "'.$DB->escapeSimple($bd).'" - 1 WHERE cmc_bd <= "'.$DB->escapeSimple($bd).'" AND cmc_bg >= "'.$DB->escapeSimple($bg).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
return false ;
}
else
{
return true ;
}
}
 
// recale les bornes dun intervalle pour l'inclure dans l'arbre � la bonne place
function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
 
// decalage borne droite
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg + "'.$DB->escapeSimple($decalage).'" , cmc_bd = cmc_bd + "'.$DB->escapeSimple($decalage).'", cmc_niveau = cmc_niveau + "'.$modif_niveau.'" WHERE cmc_bg >= "'.$DB->escapeSimple($bg).'" AND cmc_bd <= "'.$DB->escapeSimple($bd).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
return false ;
}
else
{
return true ;
}
}
 
function changerPere($id_mot_cle, $id_pere, $id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
 
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_id_parent = "'.$DB->escapeSimple($id_pere).'" WHERE cmc_id_mot_cle_utilisateur = "'.$DB->escapeSimple($id_mot_cle).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
return false ;
}
else
{
return true ;
}
}
 
function getElement($uid)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[1]);
$DB=$this->connectDB($this->config,'cel_db');
 
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1] ;
 
$query = 'SELECT cmc_mot_cle, cmc_id_mot_cle_utilisateur, cmc_id_parent FROM cel_mots_cles'.$this->suffix.' WHERE cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'" ORDER BY cmc_niveau' ;
 
$result = array() ;
 
$res =& $DB->query($query);
if (PEAR::isError($res))
{
die($res->getMessage());
}
else
{
while($motcle = $res->fetchrow(DB_FETCHMODE_ASSOC))
{
$result[] = $motcle ;
}
 
$res = json_encode($result) ;
 
header("content-type: text/json") ;
print $res ;
exit() ;
}
}
 
// met � jour les mots clés d'une image
function updateElement($uid,$pairs)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[1]);
 
$this->suffix = '_'.$uid[0];
 
$id_utilisateur = $uid[1] ;
$id_mot_cle = $pairs['id'] ;
$action = $pairs['action'] ;
 
if($action == 'modification')
{
$nouveau_nom = $pairs['motcle'] ;
$nouvel_id_general = md5($nouveau_nom) ;
 
$DB=$this->connectDB($this->config,'cel_db');
 
$query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_mot_cle = "'.$DB->escapeSimple($nouveau_nom).'" , cmc_id_mot_cle_general = "'.$DB->escapeSimple($nouvel_id_general).'" WHERE cmc_id_mot_cle_utilisateur = "'.$DB->escapeSimple($id_mot_cle).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
 
$res =& $DB->query($query);
if (PEAR::isError($res))
{
die($res->getMessage());
$transaction_reussie_1 = false ;
}
else
{
$transaction_reussie_1 = true ;
echo "OK" ;
}
}
 
if($action == 'deplacement')
{
$this->desactiverAutoCommitEtCommencerTransaction() ;
 
$transaction_reussie_1 = true ;
 
$id_pere = $pairs['parent'] ;
 
$bornes = $this->calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) ;
$bg = $bornes['cmc_bg'] ;
$bd = $bornes['cmc_bd'] ;
$niveau = $bornes['cmc_niveau'] ;
 
// on inverse l'intervalle de l'�l�ment d�plac� et du sous arbre
if($this->exclureIntervalle($bg,$bd,$id_utilisateur))
{
$transaction_reussie_2 = true ;
}
else
{
$transaction_reussie_2 = false ;
}
 
$bg_negative = $bg - $bd - 1 ;
$bd_negative = $bd - $bd - 1 ;
 
// on recalcule les intervalles de l'arbre priv� de ce sous arbre
if($this->decalerBornesMoinsIntervalle($bg,$bd,$id_utilisateur))
{
$transaction_reussie_3 = true ;
}
else
{
$transaction_reussie_3 = false ;
}
 
$bornes_pere = $this->calculerBornesEtNiveau($id_pere,$id_utilisateur) ;
$bg_pere = $bornes_pere['cmc_bg'] ;
$bd_pere = $bornes_pere['cmc_bd'] ;
 
$niveau_pere = $bornes_pere['cmc_niveau'] ;
 
$decalage = $bd - $bg + 1 ;
 
// on decale les bornes droite du pere pour pr�parer l'insertion
if($this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur))
{
$transaction_reussie_4 = true ;
}
else
{
$transaction_reussie_4 = false ;
}
 
$nouvelle_bd = $bd_pere + $decalage ;
 
$modif_niveau = $niveau_pere - $niveau + 1 ;
 
if($this->inclureIntervalle($bg_negative,$bd_negative,$nouvelle_bd,$modif_niveau,$id_utilisateur))
{
$transaction_reussie_5 = true ;
}
else
{
$transaction_reussie_5 = false ;
}
 
if($this->changerPere($id_mot_cle,$id_pere,$id_utilisateur))
{
$transaction_reussie_6 = true ;
}
else
{
$transaction_reussie_6 = false ;
}
 
if($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6)
{
$this->reactiverAutoCommitEtCompleterTransaction() ;
}
else
{
$this->reactiverAutoCommitEtAnnulerTransaction() ;
}
 
}
}
 
function createElement($pairs)
{
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['identifiant']);
 
$this->suffix = '_'.$pairs['mode'];
 
$id_utilisateur = $pairs['identifiant'] ;
$mot_cle = $pairs['motcle'] ;
 
// TODO supprimer accents et majuscules
$id_mot_cle_general = md5(mb_strtolower($mot_cle)) ;
$id_mot_cle = $pairs['id'] ;
$id_parent = $pairs['parent'] ;
 
$this->verifierPresenceRacine($id_utilisateur) ;
 
$transaction_reussie = false ;
 
$this->desactiverAutoCommitEtCommencerTransaction() ;
 
$bornes = $this->calculerBornesEtNiveau($id_parent,$id_utilisateur) ;
 
$bg = $bornes['cmc_bd'] ;
$bd = $bg + 1 ;
$borne_pere = $bornes['cmc_bd'] ;
 
$niveau = $bornes['cmc_niveau'] + 1;
 
if($this->decalerBornesPlusDeux($borne_pere,$id_utilisateur))
{
$transaction_reussie_1 = true ;
}
else
{
$transaction_reussie_1 = false ;
}
 
$DB=$this->connectDB($this->config,'cel_db');
$query = 'INSERT INTO cel_mots_cles'.$this->suffix.' VALUES (' ;
$query .= '"'.$DB->escapeSimple($mot_cle).'",' ;
$query .= '"'.$DB->escapeSimple($bg).'",' ;
$query .= '"'.$DB->escapeSimple($bd).'",' ;
$query .= '"'.$DB->escapeSimple($id_mot_cle_general).'",' ;
$query .= '"'.$DB->escapeSimple($id_mot_cle).'",' ;
$query .= '"'.$DB->escapeSimple($id_utilisateur).'",' ;
$query .= '"'.$DB->escapeSimple($id_parent).'",' ;
$query .= '"'.$DB->escapeSimple($niveau).'"' ;
$query .= ')' ;
 
$res =& $DB->query($query);
if (PEAR::isError($res))
{
die($res->getMessage());
$transaction_reussie_2 = false ;
}
else
{
$transaction_reussie_2 = true ;
}
 
if($transaction_reussie_1 && $transaction_reussie_2)
{
$this->reactiverAutoCommitEtCompleterTransaction() ;
echo "OK" ;
}
else
{
$this->reactiverAutoCommitEtAnnulerTransaction() ;
}
 
}
 
function deleteElement($uid){
 
session_start();
$this->controleUtilisateur($uid[1]);
$this->suffix = '_'.$uid[0];
 
$DB=$this->connectDB($this->config,'cel_db');
 
$this->desactiverAutoCommitEtCommencerTransaction() ;
 
$id_mot_cle= $uid[2] ;
$id_utilisateur = $uid[1] ;
 
$bornes = $this->calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) ;
 
$bg = $bornes['cmc_bg'] ;
$bd = $bornes['cmc_bd'] ;
 
$query = 'DELETE FROM cel_mots_cles'.$this->suffix.' WHERE cmc_bg >= "'.$DB->escapeSimple($bg).'" AND cmc_bd <= "'.$DB->escapeSimple($bd).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ;
 
$res =& $DB->query($query);
if (PEAR::isError($res))
{
die($res->getMessage());
$transaction_reussie_1 = false ;
}
else
{
if($DB->affectedRows() <= 0)
{
$transaction_reussie_1 = false ;
}
else
{
$transaction_reussie_1 = true ;
}
}
 
 
if($this->decalerBornesMoinsIntervalle($bg,$bd, $id_utilisateur))
{
$transaction_reussie_2 = true ;
}
else
{
$transaction_reussie_2 = false ;
}
 
if($transaction_reussie_1 && $transaction_reussie_2)
{
$this->reactiverAutoCommitEtCompleterTransaction() ;
}
else
{
$this->reactiverAutoCommitEtAnnulerTransaction() ;
}
}
 
}
?>
/trunk/jrest/services/LocationSearch.php
New file
0,0 → 1,137
<?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.
 
*/
 
 
// in : utf8
// out : utf8
 
/*
*
*
 
/*
* LocationSearch.php
*
* Cas d'utilisation :
* Service completion nom de commune
*
* 1 : L'application recoit un debut de nom de commune
* 2 : Si la longueur du prefix est >2, l'application retourne les 50 premieres communes commencant par ce prefix
*/
 
 
Class LocationSearch extends DBAccessor {
 
 
var $config;
 
function LocationSearch($config) {
 
$this->config=$config;
}
 
 
function getElement($uid){
 
$value=array();
 
if (isset($uid[0])) {
 
foreach ($uid as $element) {
$lieu=$lieu." ".$element;
}
$lieu=ltrim($lieu);
 
 
$lieu=ereg_replace('\*+','%',$lieu);
if ((strlen($lieu) > 0) && ($lieu != '%')) {
$DB=$this->connectDB($this->config,'database_cel');
$query="SELECT DISTINCT name, code FROM locations WHERE " .
"maj_name LIKE '".$DB->escapeSimple($lieu)."%' OR name LIKE '".$DB->escapeSimple($lieu)."%' ORDER BY name LIMIT 50";
}
else {
print "[]";
return ;
}
}
else {
print "[]";
return ;
}
 
 
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
// $value[]=array($row['name']." (".sprintf("%02s",$row['code']).")",$row['code']);
$value[]=array($row['name']." (".sprintf("%02s",$row['code']).")",$row['code']);
}
 
 
$json = new Services_JSON();
$output = $json->encode($value);
print($output);
 
 
 
}
 
function getRessource(){
 
print "[]";
return;
}
 
 
}
 
/* +--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"
*
*
*/
 
 
 
?>
/trunk/jrest/services/InventoryExport.php
New file
0,0 → 1,237
<?php
 
// In : utf8
// Out : iso8859
 
// Export vers feuille de calcul d'une selection de releves
 
Class InventoryExport extends DBAccessor {
 
 
var $config;
var $extendSpreadsheetProductor;
 
function InventoryExport($config) {
 
$this->config=$config;
// Pas d'heritage multiple en php :(
 
 
$this->extendSpreadsheetProductor = new SpreadsheetProductor();
$this->extendSpreadsheetProductor->initSpreadsheet();
}
 
 
function getElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
 
 
$DB=$this->connectDB($this->config,'database_cel');
 
 
$criteres = array() ;
 
if(isset($uid[1]))
{
$criteres = explode("&", $uid[1]) ;
}
 
$query="SELECT 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, coord_x, coord_y, ref_geo FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' AND " ;
 
 
 
foreach($criteres as $pair)
{
$nom_valeur = explode("=",$pair) ;
 
 
if(sizeof($nom_valeur) != 0) {
 
if($nom_valeur[0] == 'limite')
{
$limite = $DB->escapeSimple($nom_valeur[1]) ;
}
elseif($nom_valeur[0] == 'numero_page') {
$numero_page = $DB->escapeSimple($nom_valeur[1]) ;
}
elseif($nom_valeur[0] == 'annee') {
$query .= "year(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'mois') {
$query .= "month(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'jour') {
$query .= "day(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'mots_cles') {
$liste_mc = explode(";",$nom_valeur[1]);
$query .= '(' ;
foreach($liste_mc as $mot) {
if(trim($mot) != '')
{
$query .= "mots_cles LIKE '%".$DB->escapeSimple($mot)."%' OR " ;
}
}
$query = rtrim($query,' OR ');
$query .= ') AND ' ;
}
elseif ($nom_valeur[0] == 'nom_taxon') {
$nom_valeur[1] = str_replace("*","%",$nom_valeur[1]);
$query .= "(nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR identifiant LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR ordre LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR nom_ret LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_nom_ret LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_taxon LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR location LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR id_location LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR date_observation LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR lieudit LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR station LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR milieu LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR commentaire LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR transmission LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR coord_x LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR coord_y LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%')";
 
//"%' OR famille LIKE '%".$DB->escapeSimple($nom_valeur[1]).
}
else {
if(trim($nom_valeur[0]) != '')
{
$query .= $nom_valeur[0]." = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
}
}
}
 
$query = rtrim($query,' AND ') ;
 
 
$query .=" ORDER BY ordre ";
 
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
 
 
// Creating a workbook
$workbook = new Spreadsheet_Excel_Writer();
 
 
// Creating a worksheet
$worksheet = $workbook->addWorksheet('Liste');
 
 
$worksheet->write(0,0,'Nom saisi');
$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 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,'X');
$worksheet->write(0,14,'Y');
$worksheet->write(0,15,'Referentiel Geographique');
 
 
 
$i=1;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
// Denullifiage
foreach($row as $k=>$v) {
if (($v=="null") || ($v=="000null")) {
$row[$k]="";
}
else {
$row[$k]=utf8_decode($v);
}
}
 
 
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;
}
else {
$row['date_observation']="00/00/0000";
}
 
 
$worksheet->write($i,0,$row['nom_sel']);
$worksheet->write($i,1,$row['num_nom_sel']);
$worksheet->write($i,2,$row['nom_ret']);
$worksheet->write($i,3,$row['num_nom_ret']);
$worksheet->write($i,4,$row['num_taxon']);
$worksheet->write($i,5,$row['famille']);
$worksheet->write($i,6,$row['location']);
$worksheet->write($i,7,$row['id_location']);
$worksheet->write($i,8,$row['date_observation']);
$worksheet->write($i,9,$row['lieudit']);
$worksheet->write($i,10,$row['station']);
$worksheet->write($i,11,$row['milieu']);
$worksheet->write($i,12,$row['commentaire']);
$worksheet->write($i,13,$row['coord_x']);
$worksheet->write($i,14,$row['coord_y']);
$worksheet->write($i,15,$row['ref_geo']);
$i++;
}
 
// sending HTTP headers
$workbook->send('liste.xls');
$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
*
*
*
*/
 
 
?>
/trunk/jrest/services/Resume.php
New file
0,0 → 1,140
<?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/
*/
 
Class Resume extends DBAccessor {
 
function Resume($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
$DB=$this->connectDB($this->config,'cel_db');
 
$query = 'SELECT * FROM cel_inventory'.
' WHERE identifiant = "'.$uid[1].'"'.
/*' AND ordre IN (SELECT coi_ce_observation
FROM cel_obs_images
WHERE coi_ce_utilisateur ="'.$uid[1].'" )'.*/
' AND transmission = 1'.
' ORDER BY date_modification DESC LIMIT 0,5';
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$resume = array();
 
$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(!$res || $res->numRows() == 0) {
$resume['message'] = 'Aucune observation saisie pour le moment';
}
 
while ($obs =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
 
$req_liaison = 'SELECT * FROM cel_images WHERE ci_id_image IN (SELECT coi_ce_image FROM cel_obs_images WHERE coi_ce_observation = "'.$obs['ordre'].'") AND ci_ce_utilisateur = "'.$obs['identifiant'].'"' ;
$res_liaison =& $DB->query($req_liaison);
 
if (DB::isError($res_liaison)) {
die($res_liaison->getMessage());
}
 
$date = 'Datée du '.$obs['date_modification'].'<br/>' ;
$lieu = 'Lieu : '.trim($obs['location'],'000null').' ('.trim($obs['id_location'],'000null').') '.trim($obs['station'],'000null').' '.trim($obs['lieudit'],'000null').'<br/>' ;
 
$image ='';
$cible_lien = '';
$row = null;
 
while ($img =& $res_liaison->fetchrow(DB_FETCHMODE_ASSOC)) {
$row = $img;
}
 
if($row != null) {
$row['ci_nom_original'] = htmlspecialchars($row['ci_nom_original']);
$row['ci_id_image'] = htmlspecialchars($row['ci_id_image']);
$id = $row['ci_id_image'];
$tailleXY = $this->calculerDimensions(array($row['ci_meta_width'], $row['ci_meta_height']));
$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['ci_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: text/html; charset=UTF-8");
print json_encode($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 ;
}
 
}
?>
/trunk/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.'/L/'.$id."_L.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
*
*
*
*/
 
?>
/trunk/jrest/services/CelStatistique.php
New file
0,0 → 1,909
<?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é
* /CelStatistique/TypeDeGraph/1 : retourne le graphique demandé sur le serveur 1 (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)) {
$serveur = isset($param[1]) ? array_shift($param).'.' : '';
$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)) {
$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) {
// 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' ".
'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 = 1; // 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("0000-$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 = max($img_totale);
$valeurs_max_r = max($img_totale_cumul);
$y_val_fin = $valeurs_max_y;
$y_pas = 200;
$r_val_fin = $valeurs_max_r;
$r_pas = 1000;
$etiquettes_x1 = implode('|', $les_mois);
$etiquettes_x2 = implode('|', $annees);
$etiquettes_y = 'Images';
 
// 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',
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
'chxp' => '1,50|3,0',
'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|4,99CC00');
return $graph;
}
 
private function getEvolImgParMois($param) {
// 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' ".
'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 = 1; // 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("0000-$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 du dépôt d'images par mois";
$valeurs_y = implode(',', $img_totale);
$valeurs_r = implode(',', $img_totale_cumul);
$valeurs_max_y = max($img_totale);
$valeurs_max_r = max($img_totale_cumul);
$y_val_fin = $valeurs_max_y;
$y_pas = 500;
$r_val_fin = $valeurs_max_r;
$r_pas = 1000;
$etiquettes_x1 = implode('|', $les_mois);
$etiquettes_x2 = implode('|', $annees);
$etiquettes_y = 'Images';
 
// 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',
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
'chxp' => '1,50|3,0',
'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|4,99CC00');
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 = 2; // 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("0000-$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 = 2;
$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');
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);
$annee_mois_fmt_B = strftime('%B %Y', strtotime($annee.'-'.($mois+1).'-00'));
$jour = substr($annee_mois_jours, 6, 2);
 
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 = implode(',', $obs_totale);
$valeurs_max = max($obs_totale);
$y_val_fin = $valeurs_max;
$y_pas = 25;
$etiquettes_x1 = implode('|', $jours);
$etiquettes_x2 = implode('|', $annees_mois);
$etiquettes_y1 = 'observations';
 
// Construire 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_y1.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1,
'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');
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 = 2; // 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("0000-$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 = max($obs_totale);
$valeurs_max_r = max($obs_totale_cumul);
$y_val_fin = $valeurs_max_y;
$y_pas = 500;
$r_val_fin = $valeurs_max_r;
$r_pas = 2500;
$etiquettes_x1 = implode('|', $les_mois);
$etiquettes_x2 = implode('|', $annees);
$etiquettes_y = 'Observations';
 
// 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',
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
'chxp' => '1,50|3,0',
'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|4,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 = max($obs_totale);
$valeurs_min = min($obs_totale);
$y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min);
$y_val_fin = $valeurs_max;
$y_pas = 1000;
$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');
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 = max($obs_totale);
$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');
$obs['commune'] = $this->executerRequeteNombre('cel_inventory', 'id', "location != '000null' AND location != '' AND location IS NOT NULL");
$obs['commune identifiée'] = $this->executerRequeteNombre('cel_inventory', 'id', "id_location != '000null' AND id_location != '' AND id_location IS NOT NULL");
$obs['lieu-dit'] = $this->executerRequeteNombre('cel_inventory', 'id', "lieudit != '000null' AND lieudit != '' AND lieudit IS NOT NULL");
$obs['station'] = $this->executerRequeteNombre('cel_inventory', 'id', "station != '000null' AND station != '' AND station IS NOT NULL");
$obs['milieu'] = $this->executerRequeteNombre('cel_inventory', 'id', "milieu != '000null' AND milieu != '' AND milieu IS NOT NULL");
$obs['coordonnée'] = $this->executerRequeteNombre('cel_inventory', 'id', "coord_x != '000null' AND coord_x != '' AND coord_x IS NOT NULL AND coord_y != '000null' AND coord_y != '' AND coord_y IS NOT NULL");
 
$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 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;max($donnees);
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) {
// Récupération des données de la base
$observations = $this->executerRequeteEvol('cel_inventory', 'id', '%w-%H', null, 'date_creation');
 
// 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) {
$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' ".
((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();
foreach ($evolution as $info) {
$donnees_traitees[$info['periode']] = $info['nbre'];
}
 
return $donnees_traitees;
}
 
private function executerRequeteNombre($table, $champ, $where = null) {
$requete = "SELECT COUNT($champ) AS nbre ".
"FROM $table ".
((is_null($where)) ? '' : "WHERE $where ");
$nbre = $this->executerRequete($requete, 'Column');
return $nbre;
}
}
/trunk/jrest/services/InventoryObservationList.php
New file
0,0 → 1,461
<?php
 
 
/**
 
David Delon Cecill / GPL 2008
 
*/
 
 
// in : utf8
// out : utf8
/*
* InventoryObservationList.php
*
* Cas d'utilisation :
* Service recherche d'Observations a partir de divers crit�res
*
* 2: Le service recherche l'Observation correspondant au crit�res demand�
* 3: Le service renvoie l'adresse de base de l'Observation qui permet de la localiser sous ses diff�rents formats (X, M ou L)
*/
 
 
Class InventoryObservationList extends DBAccessor {
 
var $config;
 
function InventoryObservationList($config) {
 
$this->config=$config;
}
 
 
// renvoie l'enregistrement correspond a une Observation
function getElement($uid)
{
// uid[0] : utilisateur obligatoire
// uid[1] : criteres de filtrage de la forme critere1:valeur1;critere2:valeur2
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'database_cel');
 
$criteres = array() ;
 
if(isset($uid[1]))
{
$criteres = explode("&", $uid[1]) ;
}
//$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])."' AND " ;
 
$query="SELECT nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, ordre, date_observation, lieudit," .
"station, milieu, commentaire, transmission, id_location, coord_x, coord_y, mots_cles FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' AND " ;
 
 
 
 
$numero_page = 0 ;
$limite = 30 ; // limite par defaut
 
foreach($criteres as $pair) {
 
$nom_valeur = explode("=",$pair) ;
 
 
if(sizeof($nom_valeur) != 0) {
 
if($nom_valeur[0] == 'limite')
{
$limite = $DB->escapeSimple($nom_valeur[1]) ;
}
elseif($nom_valeur[0] == 'numero_page') {
$numero_page = $DB->escapeSimple($nom_valeur[1]) ;
}
elseif($nom_valeur[0] == 'annee') {
$query .= "year(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'mois') {
$query .= "month(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'jour') {
$query .= "day(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'mots_cles') {
$liste_mc = explode(";",$nom_valeur[1]);
$query .= '(' ;
foreach($liste_mc as $mot) {
if(trim($mot) != '')
{
$query .= "mots_cles LIKE '%".$DB->escapeSimple($mot)."%' OR " ;
}
}
$query = rtrim($query,' OR ');
$query .= ') AND ' ;
}
elseif ($nom_valeur[0] == 'nom_taxon') {
$nom_valeur[1] = str_replace("*","%",$nom_valeur[1]);
$query .= "(nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR identifiant LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR ordre LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR nom_ret LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_nom_ret LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_taxon LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR location LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR id_location LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR date_observation LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR lieudit LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR station LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR milieu LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR commentaire LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR transmission LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR coord_x LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR coord_y LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%')";
 
//"%' OR famille LIKE '%".$DB->escapeSimple($nom_valeur[1]).
}
else {
if(trim($nom_valeur[0]) != '')
{
$query .= $nom_valeur[0]." = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
}
}
}
 
$query = rtrim($query,' AND ') ;
$query .= ' ORDER BY ordre LIMIT '.$limite*$numero_page.','.$limite ;
 
 
$res =& $DB->query($query);
/* $fp = fopen('dump.txt','w+') ;
fwrite($fp,print_r($query,true)) ;
fclose($fp) ;*/
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de récupération d'une liste d'observation :".$res->getMessage()." ".$query);
die($res->getMessage());
}
 
$result = array() ;
 
while($observation = $res->fetchrow(DB_FETCHMODE_ORDERED)) {
 
$result[] = $observation;
}
 
$res = json_encode($result) ;
 
print($res);
exit() ;
 
 
 
}
 
// met à jour les métadonnées d'une Observation
function updateElement($uid,$pairs) {
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
if ($pairs['num_nom_sel']!='') {
// Utilisation d'un nom faisant parti du referentiel : recherche du nom valide correspondant
$complement=$this->rechercherInformationsComplementaires($pairs['num_nom_sel']);
$pairs['nom_ret']=$complement['Nom_Retenu'];
$pairs['num_nom_ret']=$complement['Num_Nom_Retenu'];
$pairs['num_taxon']=$complement['Num_Taxon'];
$pairs['famille']=$complement['Famille'];
}
 
$DB=$this->connectDB($this->config,'database_cel');
 
// Nullifiage ...
 
foreach($pairs as $k=>$v) {
if (trim($v)=="") {
$pairs[$k]="null";
}
 
}
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['location']=="null") $pairs['location']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['lieudit']=="null") $pairs['lieudit']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['id_location']=="null") $pairs['id_location']="000null";
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['station']=="null") $pairs['station']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['milieu']=="null") $pairs['milieu']="000null";
 
// Vérification sur les ordre donnés en paramètres
if(strrpos($uid[1],",") == strlen($uid[1]) -1) {
$uid[1] = rtrim($uid[1],",");
}
 
// TODO : decouper avec les /
 
if (isset($pairs['date_observation']) && $pairs['date_observation']!="null") {
list($jour,$mois,$annee)=split("/",$pairs['date_observation']);
$pairs['date_observation']=$annee."-".$mois."-".$jour." 0:0:0";
}
 
if ($pairs['coord_x']=="null") {
$pairs['coord_x'] = "000null";
}
 
if ($pairs['coord_y']=="null") {
$pairs['coord_y'] = "000null";
}
 
$query="UPDATE cel_inventory SET " ;
 
foreach($pairs as $critere => $valeur) {
 
$query .= $critere." = '".$DB->escapeSimple($valeur)."',";
}
 
$query .= "date_modification = now() WHERE ordre IN (".$DB->escapeSimple($uid[1]).") AND identifiant = '".$DB->escapeSimple($uid[0])."'";
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de mise à jour d'une liste d'observations :".$res->getMessage()." ".$query);
die($res->getMessage());
}
 
return true;
 
}
 
function deleteElement($uid)
{
 
// uid[0] : utilisateur obligatoire
// uid[1] : identifiant(s) Observation(s) obligatoire(s)
 
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'database_cel');
 
$id = rtrim($uid[1],",") ;
 
if (isset($id)) {
$query_supp='DELETE FROM cel_inventory WHERE identifiant = "'.$DB->escapeSimple($uid[0]).'" AND ordre in ('.$DB->escapeSimple($id) .')';
}
 
$res =& $DB->query($query_supp);
 
 
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de suppression d'une liste d'observations :".$res->getMessage()." ".$query_supp);
die($res->getMessage());
}
else
{
 
$query_supp_lien = 'DELETE FROM cel_obs_images WHERE coi_ce_utilisateur = "'.$DB->escapeSimple($uid[0]).'" AND coi_ce_observation in ('.$DB->escapeSimple($id).')';
 
 
/* $fp = fopen('dump.txt','w+') ;
fwrite($fp,print_r($query_supp_lien,true)) ;
fclose($fp) ;
*/
$res =& $DB->query($query_supp_lien);
 
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de suppression d'une liste de liaison entre observations et images :".$res->getMessage()." ".$query_supp_lien);
die($res->getMessage());
}
else
{
echo "OK" ;
exit() ;
}
}
}
 
function rechercherInformationsComplementaires($numNom) {
 
$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 Nomen nom retenu, Num Taxon,
// Famille
 
$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);
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 ;
}
 
 
 
 
}
?>
/trunk/jrest/services/CodeAsync.php
New file
0,0 → 1,32
<?php
// CRUD ligne d'inventaire :
// In get : utf8
// In post : utf8
// out : utf8
 
Class CodeAsync extends DBAccessor {
 
function Inventory($config) {
 
$this->config=$config;
}
 
 
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;
}
}
?>
/trunk/jrest/services/squelettes/doublon_defaut.tpl.html
New file
0,0 → 1,33
<!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"/>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
html, body {
margin:0;
padding:0;
height: 100%;
font-family: Arial;
font-size: 12px;}
#carte {
width:100%;
height:100%;
</style>
</head>
 
<body>
<h1>Images en doublon - <?=$utilisateur?></h1>
<ul>
<?php foreach ($doublons as $doublon) : ?>
<li>
<?php foreach ($doublon as $img) : ?>
<?=$img['num']?><img src="<?=$img['url']?>" />
<?php endforeach; ?>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
/trunk/jrest/services/squelettes/atom.tpl.xml
New file
0,0 → 1,33
<?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_coel?>" version="<?=$generateur_version?>"><?=$generateur?></generator>
 
<?php if (isset($items)) : ?>
<?php foreach ($items as $item) : ?>
<entry>
<id><?=$item['guid']?></id>
<title><?=$item['titre']?></title>
<link href="<?=$item['lien']?>"/>
<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>
/trunk/jrest/services/squelettes/markerclusterer_compiled.js
New file
0,0 → 1,0
function d(a){return function(b){this[a]=b}}function f(a){return function(){return this[a]}}var g; function i(a,b,c){this.extend(i,google.maps.OverlayView);this.b=a;this.a=[];this.l=[];this.V=[53,56,66,78,90];this.j=[];this.v=false;c=c||{};this.f=c.gridSize||60;this.R=c.maxZoom||null;this.j=c.styles||[];this.Q=c.imagePath||this.J;this.P=c.imageExtension||this.I;this.W=c.zoomOnClick||true;k(this);this.setMap(a);this.D=this.b.getZoom();var e=this;google.maps.event.addListener(this.b,"zoom_changed",function(){if(this.D!=e.b.getZoom()){this.D=e.b.getZoom();e.m()}});google.maps.event.addListener(this.b, "bounds_changed",function(){e.i()});b&&b.length&&this.z(b,false)}g=i.prototype;g.J="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m";g.I="png";g.extend=function(a,b){return function(c){for(property in c.prototype)this.prototype[property]=c.prototype[property];return this}.apply(a,[b])};g.onAdd=function(){if(!this.v){this.v=true;l(this)}};g.O=function(){};g.draw=function(){}; function k(a){for(var b=0,c;c=a.V[b];b++)a.j.push({url:a.Q+(b+1)+"."+a.P,height:c,width:c})}g=i.prototype;g.u=f("j");g.L=f("a");g.N=f("a");g.C=function(){return this.R||this.b.mapTypes[this.b.getMapTypeId()].maxZoom};g.A=function(a,b){for(var c=0,e=a.length,h=e;h!==0;){h=parseInt(h/10,10);c++}c=Math.min(c,b);return{text:e,index:c}};g.T=d("A");g.B=f("A");g.z=function(a,b){for(var c=0,e;e=a[c];c++)m(this,e);b||this.i()}; function m(a,b){b.setVisible(false);b.setMap(null);b.q=false;b.draggable&&google.maps.event.addListener(b,"dragend",function(){b.q=false;a.m();a.i()});a.a.push(b)}g=i.prototype;g.o=function(a,b){m(this,a);b||this.i()};g.S=function(a){var b=-1;if(this.a.indexOf)b=this.a.indexOf(a);else for(var c=0,e;e=this.a[c];c++)if(e==a)b=c;if(b==-1)return false;this.a.splice(b,1);a.setVisible(false);a.setMap(null);this.m();this.i();return true};g.M=function(){return this.l.length};g.getMap=f("b");g.setMap=d("b"); g.t=f("f");g.U=d("f");function n(a,b){var c=a.getProjection(),e=new google.maps.LatLng(b.getNorthEast().lat(),b.getNorthEast().lng()),h=new google.maps.LatLng(b.getSouthWest().lat(),b.getSouthWest().lng());e=c.fromLatLngToDivPixel(e);e.x+=a.f;e.y-=a.f;h=c.fromLatLngToDivPixel(h);h.x-=a.f;h.y+=a.f;e=c.fromDivPixelToLatLng(e);c=c.fromDivPixelToLatLng(h);b.extend(e);b.extend(c);return b}i.prototype.K=function(){this.m();this.a=[]}; i.prototype.m=function(){for(var a=0,b;b=this.l[a];a++)b.remove();for(a=0;b=this.a[a];a++){b.q=false;b.setMap(null);b.setVisible(false)}this.l=[]};i.prototype.i=function(){l(this)}; function l(a){if(a.v)for(var b=n(a,new google.maps.LatLngBounds(a.b.getBounds().getSouthWest(),a.b.getBounds().getNorthEast())),c=0,e;e=a.a[c];c++){var h=false;if(!e.q&&b.contains(e.getPosition())){for(var q=0,j;j=a.l[q];q++)if(!h&&j.getCenter()&&j.s.contains(e.getPosition())){h=true;j.o(e);break}if(!h){j=new o(a);j.o(e);a.l.push(j)}}}}function o(a){this.h=a;this.b=a.getMap();this.f=a.t();this.d=null;this.a=[];this.s=null;this.k=new p(this,a.u(),a.t())} o.prototype.o=function(a){var b;a:if(this.a.indexOf)b=this.a.indexOf(a)!=-1;else{b=0;for(var c;c=this.a[b];b++)if(c==a){b=true;break a}b=false}if(b)return false;if(!this.d){this.d=a.getPosition();r(this)}if(this.a.length==0){a.setMap(this.b);a.setVisible(true)}else if(this.a.length==1){this.a[0].setMap(null);this.a[0].setVisible(false)}a.q=true;this.a.push(a);if(this.b.getZoom()>this.h.C())for(a=0;b=this.a[a];a++){b.setMap(this.b);b.setVisible(true)}else if(this.a.length<2)s(this.k);else{a=this.h.u().length; b=this.h.B()(this.a,a);this.k.setCenter(this.d);a=this.k;a.w=b;a.ba=b.text;a.X=b.index;if(a.c)a.c.innerHTML=b.text;b=Math.max(0,a.w.index-1);b=Math.min(a.j.length-1,b);b=a.j[b];a.H=b.url;a.g=b.height;a.n=b.width;a.F=b.Z;a.anchor=b.Y;a.G=b.$;this.k.show()}return true};o.prototype.getBounds=function(){r(this);return this.s};o.prototype.remove=function(){this.k.remove();delete this.a};o.prototype.getCenter=f("d");function r(a){a.s=n(a.h,new google.maps.LatLngBounds(a.d,a.d))}o.prototype.getMap=f("b"); function p(a,b,c){a.h.extend(p,google.maps.OverlayView);this.j=b;this.aa=c||0;this.p=a;this.d=null;this.b=a.getMap();this.w=this.c=null;this.r=false;this.setMap(this.b)} p.prototype.onAdd=function(){this.c=document.createElement("DIV");if(this.r){this.c.style.cssText=t(this,u(this,this.d));this.c.innerHTML=this.w.text}this.getPanes().overlayImage.appendChild(this.c);var a=this;google.maps.event.addDomListener(this.c,"click",function(){var b=a.p.h;google.maps.event.trigger(b,"clusterclick",[a.p]);if(b.W){a.b.panTo(a.p.getCenter());a.b.fitBounds(a.p.getBounds())}})}; function u(a,b){var c=a.getProjection().fromLatLngToDivPixel(b);c.x-=parseInt(a.n/2,10);c.y-=parseInt(a.g/2,10);return c}p.prototype.draw=function(){if(this.r){var a=u(this,this.d);this.c.style.top=a.y+"px";this.c.style.left=a.x+"px"}};function s(a){if(a.c)a.c.style.display="none";a.r=false}p.prototype.show=function(){if(this.c){this.c.style.cssText=t(this,u(this,this.d));this.c.style.display=""}this.r=true};p.prototype.remove=function(){this.setMap(null)}; p.prototype.onRemove=function(){if(this.c&&this.c.parentNode){s(this);this.c.parentNode.removeChild(this.c);this.c=null}};p.prototype.setCenter=d("d"); function t(a,b){var c=[];document.all?c.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="'+a.H+'");'):c.push("background:url("+a.H+");");if(typeof a.e==="object"){typeof a.e[0]==="number"&&a.e[0]>0&&a.e[0]<a.g?c.push("height:"+(a.g-a.e[0])+"px; padding-top:"+a.e[0]+"px;"):c.push("height:"+a.g+"px; line-height:"+a.g+"px;");typeof a.e[1]==="number"&&a.e[1]>0&&a.e[1]<a.n?c.push("width:"+(a.n-a.e[1])+"px; padding-left:"+a.e[1]+"px;"):c.push("width:"+a.n+"px; text-align:center;")}else c.push("height:"+ a.g+"px; line-height:"+a.g+"px; width:"+a.n+"px; text-align:center;");c.push("cursor:pointer; top:"+b.y+"px; left:"+b.x+"px; color:"+(a.F?a.F:"black")+"; position:absolute; font-size:"+(a.G?a.G:11)+"px; font-family:Arial,sans-serif; font-weight:bold");return c.join("")}window.MarkerClusterer=i;i.prototype.addMarker=i.prototype.o;i.prototype.addMarkers=i.prototype.z;i.prototype.clearMarkers=i.prototype.K;i.prototype.getCalculator=i.prototype.B;i.prototype.getGridSize=i.prototype.t; i.prototype.getMap=i.prototype.getMap;i.prototype.getMarkers=i.prototype.L;i.prototype.getMaxZoom=i.prototype.C;i.prototype.getStyles=i.prototype.u;i.prototype.getTotalClusters=i.prototype.M;i.prototype.getTotalMarkers=i.prototype.N;i.prototype.redraw=i.prototype.i;i.prototype.removeMarker=i.prototype.S;i.prototype.resetViewport=i.prototype.m;i.prototype.setCalculator=i.prototype.T;i.prototype.setGridSize=i.prototype.U;i.prototype.onAdd=i.prototype.onAdd;i.prototype.draw=i.prototype.draw; i.prototype.idle=i.prototype.O;p.prototype.onAdd=p.prototype.onAdd;p.prototype.draw=p.prototype.draw;p.prototype.onRemove=p.prototype.onRemove;
/trunk/jrest/services/squelettes/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,10,19,15,0,41
 
[Settings]
ShowDotFiles=true
/trunk/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>
/trunk/jrest/services/squelettes/rss1.tpl.xml
New file
0,0 → 1,46
<?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?></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><?=$item['lien']?></link>
<description><?=$item['description_encodee']?></description>
<category><?= $item['categorie'] ?></category>
<dc:date><?=$item['date_maj_W3C']?></dc:date>
</item>
<?php endforeach; ?>
<?php endif; ?>
</rdf:RDF>
/trunk/jrest/services/squelettes/rss2.tpl.xml
New file
0,0 → 1,23
<?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?></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>
<link><?=$item['lien']?></link>
<description><?=$item['description_encodee']?></description>
<category><?= $item['categorie'] ?></category>
<pubDate><?=$item['date_maj_RSS']?></pubDate>
</item>
<?php endforeach; ?>
<?php endif; ?>
</channel>
</rss>
/trunk/jrest/services/squelettes/carte_defaut.tpl.html
New file
0,0 → 1,68
<!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>Google Maps API Example - Observations</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="<?=$url_base?>services/squelettes/markerclusterer_compiled.js"></script>
<script src="<?=$url_json?>" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var markerClusterer = null;
var map = null;
var imageUrl = 'http://chart.apis.google.com/chart?cht=mm&chs=24x32&chco=FFFFFF,008CFF,000000&ext=.png';
var carteCentre = new google.maps.LatLng(46.4, 3.10);
var carteOptions = {
zoom: 6,
center: carteCentre,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
function refreshMap() {
if (markerClusterer) {
markerClusterer.clearMarkers();
}
 
var markers = [];
var markerImage = new google.maps.MarkerImage(imageUrl, new google.maps.Size(24, 32));
for (var i = 0; i < obs.nombre; ++i) {
var latLng = new google.maps.LatLng(obs.points[i].coord_x, obs.points[i].coord_y);
var marker = new google.maps.Marker({
position: latLng,
draggable: true,
icon: markerImage
});
markers.push(marker);
}
 
markerClusterer = new MarkerClusterer(map, markers);
}
 
function initialize() {
map = new google.maps.Map(document.getElementById('carte'), carteOptions);
refreshMap();
}
//]]>
</script>
<style type="text/css">
html, body {
margin:0;
padding:0;
height: 100%;
font-family: Arial;
font-size: 12px;}
#carte {
width:100%;
height:100%;
</style>
</head>
 
<body onload="initialize()">
<div id="carte"></div>
</body>
</html>
/trunk/jrest/services/InventoryImageCount.php
New file
0,0 → 1,144
<?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
/*
* InventoryImageCount.php
*
* 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 InventoryImageCount extends DBAccessor {
 
var $config;
function InventoryImageCount($config) {
 
$this->config=$config;
}
// renvoie lee nombre d'images correspondant aux criteres
function getElement($uid)
{
// uid[0] : utilisateur obligatoire
// uid[1] : crit�res de filtrage de la forme crit�re1:valeur1;crit�re2:valeur2
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
$DB=$this->connectDB($this->config,'cel_db');
$criteres = array() ;
if(isset($uid[1]))
{
$criteres = explode("&", $uid[1]) ;
}
 
$query='SELECT COUNT(*) FROM cel_images WHERE ci_ce_utilisateur = "'.$DB->escapeSimple($uid[0]).'" AND ' ;
foreach($criteres as $pair)
{
$nom_valeur = explode("=",$pair) ;
if($nom_valeur[0] == "ci_meta_mots_cles")
{
$mots_cles = rtrim($nom_valeur[1], ',') ;
$mots_cles_liste = explode("," , $mots_cles) ;
foreach($mots_cles_liste as $mot_cle)
{
$query .= $nom_valeur[0].' LIKE "%'.$DB->escapeSimple($mot_cle).'%"' ;
$query .= ' AND ' ;
}
}
elseif($nom_valeur[0] == "ci_meta_comment")
{
$mots_comment_liste = explode(" " , $nom_valeur[1]) ;
foreach($mots_comment_liste as $mot_comment)
{
$mot_comment = trim($mot_comment) ;
$query .= $nom_valeur[0].' LIKE "%'.$DB->escapeSimple($mot_comment).'%"' ;
$query .= ' AND ' ;
}
}
elseif($nom_valeur[0] == "ci_meta_date")
{
$query .= 'DATE_FORMAT( '.$nom_valeur[0].', \'%Y-%m-%d\' ) = "'.$DB->escapeSimple($nom_valeur[1]).'"' ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == "ci_id_tampon")
{
$ids_tampon = rtrim($nom_valeur[1], ',') ;
$query .= 'ci_id_image IN ( '.$DB->escapeSimple($ids_tampon).')' ;
}
else
{
$nom_valeur = explode("=",$pair) ;
$query .= $nom_valeur[0].' = "'.$DB->escapeSimple($nom_valeur[1]).'"' ;
$query .= ' AND ' ;
}
}
$query = rtrim($query,' AND ') ;
$res =& $DB->query($query);
if (PEAR::isError($res)) {
die($res->getMessage());
}
$results = array() ;
while($image = $res->fetchrow(DB_FETCHMODE_ORDERED))
{
$result[] = $image[0] ;
}
$res = json_encode($result) ;
header("content-type: text/json") ;
print $res ;
exit() ;
}
}
?>
/trunk/jrest/services/CelSyndicationImage.php
New file
0,0 → 1,365
<?php
/**
* Service fournissant des informations concernant le 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
*/
class CelSyndicationImage extends Cel {
private $format = null;
private $service = null;
private $squelette = null;
private $squelette_dossier = null;
private $flux = array();
private $format_image = 'L';
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
$contenu = '';
// Pré traitement des paramêtres
$pour_bdd = false;
$p = $this->traiterParametres(array('service', 'format'), $param, $pour_bdd);
unset($param[0]);
unset($param[1]);
sort($param);
extract($p);
// Récupération de la liste des flux
$this->chargerListeDesFlux();
// Chargement du bon type de service demandé
if (isset($service)) {
$this->service = $service;
$methode = $this->getNomMethodeService();
if (method_exists($this, $methode)) {
if ($this->service != 'liste_des_flux') {
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
// Multiplication par deux de la limite car nous récupérons deux lignes par item
$this->limit = $this->limit*2;
// Mise en minuscule de l'indication du format
$this->format = strtolower($format);
// Définition du fichier squelette demandé
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
} else {
$this->format = '';
$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
}
}
// Récupération du contenu à renvoyer
$contenu = $this->$methode($param);
} 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 getUrlServiceBase() {
$url_service = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/'.$this->service.'/'.$this->format;
return $url_service;
}
private function getUrlImageBase($id, $format = 'L') {
$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.'/'.$format.'/'.$id.'_'.$format.'.jpg';
 
return $chemin_fichier;
}
private function getNomMethodeService() {
$methode = '';
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('_', $this->service))));
$methode = 'getService'.$service_formate;
return $methode;
}
private function getTypeMime() {
$mime = '';
switch ($this->format) {
case 'atom' :
$mime = 'application/atom+xml';
break;
case 'rss1' :
case 'rss2' :
$mime = 'application/rss+xml';
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->config['settings']['baseURLAbsoluDyn'].'CoelSyndicationImage/';
$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('RssParDefaut', 'Flux de syndication par défaut',
'Ce flux fournit des informations sur les images du CEL.');
$this->setFlux('RssParMotsCles', 'Flux des images filtré par mots clés',
'Ce flux fournit des informations sur les images du CEL filtrées par mots-clés.');
$this->setFlux('RssParLocalisation','Flux des images filtré par localisation',
'Ce flux fournit des informations sur les images du CEL filtrées par localisation.');
}
private function getServiceListeDesFlux() {
return $this->flux;
}
private function getServiceParDefaut() {
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'ORDER BY '.((!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 getServiceSimple($params) {
if(isset($params[0])) {
$this->format_image = $params[0];
}
$this->start = 0;
$this->limit = 10;
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM cel_obs_images a '.
'INNER JOIN cel_inventory b '.
'ON a.coi_ce_observation = b.ordre AND a.coi_ce_utilisateur = b.identifiant '.
'INNER JOIN cel_images c '.
'ON a.coi_ce_image = c.ci_id_image AND a.coi_ce_utilisateur = c.ci_ce_utilisateur '.
'WHERE b.transmission = 1 AND b.identifiant = c.ci_ce_utilisateur '.
'ORDER BY '.((!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;
}
protected function executerRequete($requete) {
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) {
$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'] = sprintf($this->config['settings']['efloreUrlTpl'], $infos['num_nom_sel']);
$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';
preg_match('/([0-9]+)/', '$Revision$', $match);
$donnees['generateur_version'] = $match[1];
return $donnees;
}
private function construireDonneesCommunesAuxItems($info) {
$item = array();
$date_modification_timestamp = strtotime($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['description'] = $this->creerDescription($info);
$item['description_encodee'] = htmlspecialchars($item['description']);
return $item;
}
private function creerTitre($element) {
$titre = '';
$titre = $element['nom_sel'].' [nn'.$element['num_nom_sel'].'] par '.$this->creerAuteur($element['identifiant']);
return $titre;
}
private function nettoyerTexte($txt) {
$txt = preg_replace('/&(?!(a-z+|#0-9+|#x0-9a-f+);)/i', '&amp;', $txt, -1);
return $txt;
}
private function creerGuidItem($element) {
$guid = sprintf($this->config['settings']['guidImgTpl'], $element['ci_id_image']);
return $guid;
}
private function creerLienItem($element) {
$lien = $this->getUrlImageBase($element['ci_id_image'],$this->format_image);
return $lien;
}
private function creerDescription($element) {
$description = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($element['num_nom_sel']));
$description = $this->nettoyerTexte($description);
return $description;
}
private function creerAuteur($courriel) {
$auteur = ($this->etreFluxAdmin()) ? $courriel : $this->traiterCourriel($courriel);
return $auteur;
}
private function traiterCourriel($courriel) {
$courriel = preg_replace('/[^@]+$/i', '...', $courriel);
return $courriel;
}
private function etreFluxAdmin() {
return ($this->service == 'pour-admin') ? true : false;
}
private function etreNull($valeur) {
$etre_null = false;
if ($valeur == '' || $valeur == null || $valeur == '000null' || $valeur == 'null') {
$etre_null = true;
}
return $etre_null;
}
private function creerUrlService() {
$url_service = $this->getUrlServiceBase();
if (isset($this->start) || isset($this->limit)) {
$arguments = array();
if (isset($this->start) && isset($_GET['start'])) {
$arguments[] = 'start='.$this->start;
}
if (isset($this->limit) && isset($_GET['limit'])) {
$arguments[] = 'limit='.($this->limit/2);
}
if (count($arguments) > 0) {
$url_service .= '?'.implode('&', $arguments);
}
}
return $url_service;
}
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] = $tailleOr ;
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ;
}else {
$rapport = $tailleXY[0]/$tailleXY[1] ;
$tailleXY[0] = $tailleOr ;
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ;
}
return $tailleXY ;
}
}
/trunk/jrest/services/UserOpenId.php
New file
0,0 → 1,248
<?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) ;
 
$json = new Services_JSON();
$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) ;
 
$json = new Services_JSON();
$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
*
*
*/
 
?>
/trunk/jrest/services/InventoryTransmit.php
New file
0,0 → 1,62
<?php
 
// In : utf8
// out : utf8
// Transmission observation vers Tela
 
 
Class InventoryTransmit extends DBAccessor {
 
 
var $config;
function InventoryTransmit($config) {
 
$this->config=$config;
}
 
 
function updateElement($uid,$pairs) {
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'database_cel');
if (isset($uid[1])) {
$query="UPDATE cel_inventory " .
"SET transmission = '".$DB->escapeSimple($pairs['transmission'])."',".
"date_modification = now(), date_transmission = now() ".
"WHERE identifiant='".$DB->escapeSimple($uid[0])."' AND ordre in (".$DB->escapeSimple($uid[1]) .")";
}
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
die($res->getMessage());
}
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
/trunk/jrest/services/InventoryObservationCount.php
New file
0,0 → 1,140
<?php
/**
 
David Delon 2008
 
Cecill / GPL V3
 
*/
 
 
// in : utf8
// out : utf8
/*
* InventoryObservationCount.php
*
* 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 DBAccessor {
 
var $config;
 
function InventoryObservationCount($config) {
 
$this->config=$config;
}
 
 
// renvoie le nombre d' observation correspondant aux criteres
 
function getElement($uid)
{
// uid[0] : utilisateur obligatoire
// uid[1] : criteres de filtrage de la forme critere1:valeur1;critere2:valeur2
 
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'database_cel');
 
 
$criteres = array() ;
 
if(isset($uid[1]))
{
$criteres = explode("&", $uid[1]) ;
}
 
$query="SELECT count(*) as count FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' AND " ;
 
foreach($criteres as $pair)
{
$nom_valeur = explode("=",$pair) ;
if(sizeof($nom_valeur) != 0)
{
if($nom_valeur[0] == 'annee') {
$query .= "year(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'mois') {
$query .= "month(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'jour') {
$query .= "day(date_observation) = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == 'mots_cles') {
$liste_mc = explode(";",$nom_valeur[1]);
$query .= '(' ;
foreach($liste_mc as $mot) {
 
if(trim($mot) != '')
{
$query .= "mots_cles LIKE '%".$DB->escapeSimple($mot)."%' OR " ;
}
}
$query = rtrim($query,' OR ');
$query .= ') AND ' ;
}
elseif ($nom_valeur[0] == 'nom_taxon') {
$nom_valeur[1] = str_replace("*","%",$nom_valeur[1]);
$query .= "(nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR identifiant LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR ordre LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_nom_sel LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR nom_ret LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_nom_ret LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR num_taxon LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR location LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR id_location LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR date_observation LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR lieudit LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR station LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR milieu LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR commentaire LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR transmission LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR coord_x LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%' OR coord_y LIKE '%".$DB->escapeSimple($nom_valeur[1]).
"%')";
 
//"%' OR famille LIKE '%".$DB->escapeSimple($nom_valeur[1]).
}
else {
if(trim($nom_valeur[0]) != '')
{
$query .= $nom_valeur[0]." = '".$DB->escapeSimple($nom_valeur[1])."'" ;
$query .= ' AND ' ;
}
}
}
}
 
$query = rtrim($query,' AND ') ;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
$erreur = 'ERROR : probleme de liste des observations' ;
$this->logger('CEL_bugs',$erreur.' '.$query);
}
 
$results = array() ;
 
while($observation = $res->fetchrow(DB_FETCHMODE_ORDERED))
{
$result[] = $observation[0] ;
}
 
$res = json_encode($result) ;
 
print($res);
exit() ;
}
}
?>
/trunk/jrest/services/InventoryLocationList.php
New file
0,0 → 1,101
<?php
 
// In : utf8
// Out : utf8
 
// Liste des communes par utilisateur
 
Class InventoryLocationList extends DBAccessor {
 
 
var $config;
 
function InventoryLocationList($config) {
 
$this->config=$config;
}
 
 
function getElement($uid){
 
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'database_cel');
 
$value=array();
 
// cmc_mot_cle, cmc_id_mot_cle_utilisateur, cmc_id_parent
 
 
/*$query0="SELECT \"racine_entite\" , MD5(\"racine_entite\"), MD5(\"000null\") ".
" FROM cel_inventory WHERE 1 " ;
 
$query1="SELECT DISTINCT id_location , MD5(CONCAT(id_location,\"racine_entite\")), MD5(\"racine_entite\") ".
" FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
" ORDER BY id_location";
 
$query2="SELECT DISTINCT location , MD5(CONCAT(location,id_location)), MD5(CONCAT(id_location,\"racine_entite\")) ".
" FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
" ORDER BY location";
 
$query3="SELECT DISTINCT lieudit, MD5(CONCAT(lieudit,location)), MD5(CONCAT(location,id_location)) ".
" FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
" ORDER BY lieudit";
*/
/*
$query4="SELECT DISTINCT station, MD5(station), MD5(lieudit) ".
" FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
" ORDER BY station";
*/
 
//$query="(".$query0.") UNION (". $query1.") UNION (".$query2.") UNION (".$query3 .") UNION (".$query4 .")" ;
 
//$query="(".$query0.") UNION (". $query1.") UNION (".$query2.") UNION (".$query3 .") " ;
 
$query = 'SELECT DISTINCT id_location, location, lieudit, station FROM cel_inventory
WHERE identifiant="'.$DB->escapeSimple($uid[0]).'" ORDER BY id_location ASC, location ASC, lieudit ASC, station ASC' ;
 
//print $query
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ORDERED)) {
$value[] = $row;
}
 
$json = new Services_JSON();
$output = $json->encode($value);
 
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
*
*
*
*/
 
?>
/trunk/jrest/services/ImageContribution.php
New file
0,0 → 1,132
<?php
/**
* 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/
*/
 
Class ImageContribution extends DBAccessor {
 
var $config;
 
function ImageContribution($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
$DB=$this->connectDB($this->config,'cel_db');
 
/* $query='SELECT * FROM cel_images';
$query .= ' WHERE ci_ce_utilisateur ="'.$uid[0].'"' ;
$query .= ' ORDER BY ci_meta_date_ajout DESC LIMIT 0,5' ;*/
 
$query = 'SELECT * FROM cel_inventory'.
' WHERE identifiant = "'.$uid[1].'"'.
' AND ordre IN (SELECT coi_ce_observation
FROM cel_obs_images
WHERE coi_ce_utilisateur ="'.$uid[1].'" )'.
' AND transmission = 1'.
' ORDER BY date_modification DESC LIMIT 0,5';
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$html = '<div id="resume_cel">';
 
while ($obs =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
$chemin_sur_serveur = $this->config['cel_db']['url_images'];
 
$req_liaison = 'SELECT * FROM cel_images WHERE ci_id_image IN (SELECT coi_ce_image FROM cel_obs_images WHERE coi_ce_observation = "'.$obs['ordre'].'") AND ci_ce_utilisateur = "'.$obs['identifiant'].'"' ;
$res_liaison =& $DB->query($req_liaison);
 
if (DB::isError($res_liaison)) {
die($res_liaison->getMessage());
}
 
while ($img =& $res_liaison->fetchrow(DB_FETCHMODE_ASSOC)) {
$row = $img;
}
 
$row['ci_nom_original'] = htmlspecialchars($row['ci_nom_original']);
$row['ci_id_image'] = htmlspecialchars($row['ci_id_image']);
$id = $row['ci_id_image'];
 
$tailleXY = $this->calculerDimensions(array($row['ci_meta_width'], $row['ci_meta_height']));
 
$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="'.$row['ci_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['location'],'000null').' ('.trim($obs['id_location'],'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;
}
 
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 ;
}
 
}
?>
/trunk/jrest/services/NameImage.php
New file
0,0 → 1,218
<?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.
*/
 
 
// in : utf8
// out : 8859
/*
* NameImage.php
*
* 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�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://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 DBAccessor {
 
 
var $config;
function NameImage($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
 
// Num nomenclatural
$DB=$this->connectDB($this->config);
$query = "SELECT DISTINCT b.esn_id_taxon FROM eflore_nom, eflore_nom_rang," .
" eflore_selection_nom a, eflore_selection_nom b".
" WHERE a.esn_id_nom= ".$uid[0].
" 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 a.esn_id_version_projet_taxon=en_id_version_projet_nom ";
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$nt=$row['esn_id_taxon'];
}
 
$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;
}
}
}
$json = new Services_JSON();
$output = $json->encode($value);
print($output);
}
}
 
function chercherIllustrationsServiceXml($url)
{
return analyserFichierRdf($url);
}
function analyserFichierRdf($chemin)
{
//print $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;
}
//echo '<pre>'.$chemin.print_r($tab_infos, true).'</pre>';
 
//print_r($tab_infos);
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
*
*
*
*
*/
 
?>
/trunk/jrest/services/InventoryDateList.php
New file
0,0 → 1,113
<?php
 
// in : utf8
// out : utf8
 
// Liste les date de releves par utilisateur
 
 
Class InventoryDateList extends DBAccessor {
 
 
var $config;
function InventoryDateList($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
// 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)
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
$DB=$this->connectDB($this->config,'database_cel');
$select = "date_observation" ;
if (!isset($uid[1]) || $uid[1]=="" || $uid[1]=="all" ) {
$uid[1]="all";
if ($select=="") $select="year(date_observation) ";
}
else {
$query_year=" AND year(date_observation)='".$DB->escapeSimple($uid[1])."' ";
}
if (!isset($uid[2]) || $uid[2]=="" || $uid[2]=="all" ) {
$uid[2]="all";
if ($select=="") $select="month(date_observation) ";
}
else {
$query_month=" AND month(date_observation)='".$DB->escapeSimple($uid[2])."' ";
}
 
if (!isset($uid[3]) || $uid[3]=="" || $uid[3]=="all" ) {
$uid[3]="all";
if ($select=="") $select="day(date_observation) ";
}
else {
$query_day=" AND day(date_observation)='".$DB->escapeSimple($uid[3])."' ";
}
$value=array();
$query="SELECT DISTINCT ".
$select. " AS id" .
" FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
$query_year.
$query_month.
$query_day.
" ORDER BY ".$select;
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$value[]=array($row['id']);
}
$json = new Services_JSON();
$output = $json->encode($value);
print($output);
return true;
 
 
}
 
 
}
 
 
/* +--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
/trunk/jrest/services/InventoryPDF.php
New file
0,0 → 1,252
<?php
 
// In : utf8
// Out : iso8859
 
// Formatage pdf d'un releve (a revoir)
 
/** 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');
 
 
Class InventoryPDF extends DBAccessor {
 
 
var $config;
var $extendPDFProductor;
function InventoryPDF($config) {
 
$this->config=$config;
// Pas d'heritage multiple en php :(
$this->extendPDFProductor = new PDFProductor();
$this->extendPDFProductor->initPDF();
}
 
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] : si absent : valeur 'all' (date)
// uid[3] : si absent : valeur 'all' (recherche libre)
// uid[4] : si absent : valeur 'all' (station)
$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])."' ";
}
if (!isset($uid[2]) || $uid[2]=="" || $uid[2]=="all") {
$uid[2]="all";
$query_date="";
}
else {
$query_date=" AND date_observation='".$DB->escapeSimple($uid[2])."' ";
}
if (!isset($uid[3]) || $uid[3]=="" || $uid[3]=="all") {
$uid[3]="all";
$query_libre="";
}
else {
$query_libre=" AND (nom_sel like '%".$DB->escapeSimple($uid[3])."%' OR nom_ret like '%".$DB->escapeSimple($uid[3])."%' OR station like '%".$DB->escapeSimple($uid[3])."%' OR commentaire like '%".$DB->escapeSimple($uid[3])."%') ";
}
 
if (!isset($uid[4]) || $uid[4]=="" || $uid[4]=="all") {
$uid[4]="all";
$query_station="";
}
else {
$query_station=" AND station='".$DB->escapeSimple($uid[4])."' ";
}
 
$value=array();
$query="SELECT identifiant, ordre, nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, date_observation," .
" station, commentaire, transmission FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " .
$query_location.
$query_date.
$query_libre.
$query_station.
" ORDER BY ordre ";
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
// 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("","");
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
// Denullifiage
foreach($row as $k=>$v) {
if (($v=="null") || ($v=="000null")) {
$row[$k]="";
}
else {
$row[$k]=utf8_decode($v);
}
}
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;
}
else {
$row['date_observation']="00/00/0000";
}
$text= $row['nom_sel']." ".$row['num_nom_sel']." ".$row['nom_ret']." ".$row['num_nom_ret']." ".$row['num_taxon']." ".
$row['famille']." ".$row['location']." ".$row['id_location']." ".$row['date_observation']." ".$row['station'];
$row['commentaire'];
$pdf->write(10, $text."\n");
$projet_photo = 'photoflora';
$tab_retour[$projet_photo]=chercherIllustrationsServiceXml(sprintf(EF_URL_PHOTOFLORA_SERVICE, $row['num_taxon']));
$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++;
}
// Print the generated file.
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;
}
//echo '<pre>'.$chemin.print_r($tab_infos, true).'</pre>';
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
/trunk/jrest/services/InventoryContributionList.php
New file
0,0 → 1,81
<?php
 
 
Class InventoryContributionList extends DBAccessor {
 
 
protected $config;
 
function InventoryContributionList($config) {
 
$this->config=$config;
}
 
function getRessource() {
echo '';
}
 
 
function getElement($uid){
 
if(!isset($uid[0])) {
echo '';
}
 
$DB=$this->connectDB($this->config,'database_cel');
 
$query="SELECT * FROM cel_inventory ".
"WHERE identifiant = '".$DB->escapeSimple($uid[0])."' ".
"ORDER BY date_modification DESC LIMIT 0,5";
 
$res =& $DB->query($query);
 
if (DB::isError($res)) {
die($res->getMessage());
}
 
$resume = "";
 
 
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$row['nom_sel'] = htmlspecialchars($row['nom_sel']);
$row['identifiant'] = htmlspecialchars($row['identifiant']);
$row['location'] = htmlspecialchars($row['location']);
$row['id_location'] = htmlspecialchars($row['id_location']);
$row['station'] = htmlspecialchars($row['station']);
$row['milieu'] = htmlspecialchars($row['milieu']);
$row['commentaire'] = htmlspecialchars($row['commentaire']);
$row['transmission'] = htmlspecialchars($row['transmission']);
 
 
$resume.= '<p>'.$row['nom_sel'] ." (".$row['num_nom_sel'].") ".
'Location : '. $row['location'].",". $row['station'] . "," . $row['milieu'] . "," . $row['commentaire'] . "," . $row['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
*
*
*
*/
 
?>
/trunk/jrest/services/export/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,10,19,15,0,36
 
[Settings]
ShowDotFiles=true
/trunk/jrest/services/InventoryImageList.php
New file
0,0 → 1,257
<?php
 
require_once('include/extract_metadonnee.php') ;
require_once('include/stockage_fichier.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
/*
* InventoryImageList.php
*
* Cas d'utilisation :
* Service recherche d'images a partir de divers crit�res
*
* 2: Le service recherche l'image correspondant au crit�res demand�
* 3: Le service renvoie l'adresse de base de l'image qui permet de la localiser sous ses diff�rents formats (X, M ou L)
*/
 
Class InventoryImageList extends DBAccessor {
 
var $config;
 
function InventoryImageList($config) {
 
$this->config=$config;
}
 
 
// renvoie l'enregistrement correspond � une image
function getElement($uid)
{
// uid[0] : utilisateur obligatoire
// uid[1] : crit�res de filtrage de la forme crit�re1:valeur1;crit�re2:valeur2
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'cel_db');
 
$criteres = array() ;
 
if(isset($uid[1]))
{
$criteres = explode("&", $uid[1]) ;
}
 
$query='SELECT * FROM cel_images WHERE ci_ce_utilisateur = "'.$uid[0].'" AND ' ;
 
$numero_page = 0 ;
$limite = 50 ;
 
foreach($criteres as $pair)
{
$nom_valeur = explode("=",$pair) ;
 
if(sizeof($nom_valeur) != 0)
{
if($nom_valeur[0] == "ci_limite")
{
$limite = $DB->escapeSimple($nom_valeur[1]) ;
}
elseif($nom_valeur[0] == "ci_numero_page")
{
$numero_page = $DB->escapeSimple($nom_valeur[1]) ;
}
elseif($nom_valeur[0] == "ci_meta_mots_cles")
{
$mots_cles = rtrim($nom_valeur[1], ',') ;
$mots_cles_liste = explode("," , $mots_cles) ;
 
foreach($mots_cles_liste as $mot_cle)
{
$query .= $nom_valeur[0].' LIKE "%'.$DB->escapeSimple($mot_cle).'%"' ;
$query .= ' AND ' ;
}
}
elseif($nom_valeur[0] == "ci_meta_comment")
{
$mots_comment_liste = explode(" " , $nom_valeur[1]) ;
 
foreach($mots_comment_liste as $mot_comment)
{
$mot_comment = trim($mot_comment) ;
$query .= $nom_valeur[0].' LIKE "%'.$DB->escapeSimple($mot_comment).'%"' ;
$query .= ' AND ' ;
}
}
elseif($nom_valeur[0] == "ci_meta_date")
{
$query .= 'DATE_FORMAT( '.$nom_valeur[0].', \'%Y-%m-%d\' ) = "'.$DB->escapeSimple($nom_valeur[1]).'"' ;
$query .= ' AND ' ;
}
elseif($nom_valeur[0] == "ci_id_tampon")
{
$ids_tampon = rtrim($nom_valeur[1], ',') ;
$query .= 'ci_id_image IN ( '.$DB->escapeSimple($ids_tampon).')' ;
}
else
{
$query .= $nom_valeur[0].' = "'.$DB->escapeSimple($nom_valeur[1]) ;
$query .= '" AND ' ;
}
}
}
 
$debut = $limite*$numero_page ;
 
$query = rtrim($query,' AND ') ;
$query .= ' ORDER BY ci_ordre LIMIT '.$debut.','.$limite ;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
}
 
$result = array() ;
 
while($image = $res->fetchrow(DB_FETCHMODE_ASSOC))
{
$date = split("-",$image['ci_meta_date']) ;
if(count($date) > 2)
{
$image['ci_meta_date'] = $date[2].'/'.$date[1].'/'.$date[0] ;
}
 
$image['ci_ce_observation'] = '';
 
$requete_table_liaison = 'SELECT coi_ce_observation FROM cel_obs_images WHERE coi_ce_image = '.$image['ci_id_image'].' AND coi_ce_utilisateur ="'.$uid[0].'"';
$res_table_liaison =& $DB->query($requete_table_liaison);
if (PEAR::isError($res_table_liaison)) {
 
die($res_table_liaison->getMessage());
}
 
$ids_obs = '';
while($liaison = $res_table_liaison->fetchrow(DB_FETCHMODE_ASSOC))
{
$ids_obs .= $liaison['coi_ce_observation'].",";
}
 
$ids_obs = rtrim($ids_obs,',');
 
if(trim($ids_obs) != '') {
$requete_obs_liees = 'SELECT * FROM cel_inventory WHERE ordre IN ('.$ids_obs.') AND identifiant ="'.$uid[0].'"';
$res_obs_liees =& $DB->query($requete_obs_liees);
if (PEAR::isError($res_obs_liees)) {
 
die($res_obs_liees->getMessage());
}
 
while($obs_liee = $res_obs_liees->fetchrow(DB_FETCHMODE_ASSOC))
{
$image['ci_ce_observation'] .= $obs_liee['ordre'].'#'.$obs_liee['nom_sel'].'#'.$obs_liee['transmission'].';;' ;
}
}
 
$result[] = $image ;
}
 
$res = json_encode($result) ;
 
header("content-type: text/json") ;
print $res ;
exit() ;
}
 
// met � jour les m�tadonn�es d'une image
function updateElement($uid,$pairs)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'cel_db');
$query .= ' WHERE '.$ci_id_image.' = "'.$DB->escapeSimple($pairs['ci_id_image']).'"' ;
}
 
function deleteElement($uid)
{
 
// uid[0] : utilisateur obligatoire
// uid[1] : identifiant(s) image(s) obligatoire(s)
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'cel_db');
 
$id = rtrim($uid[1],",") ;
 
if (isset($id)) {
$query="DELETE FROM cel_images WHERE ci_id_image in (".$DB->escapeSimple($id) .")";
$query_sup_lien = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$DB->escapeSimple($id) .")";
}
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
die($res->getMessage());
}
else
{
$res =& $DB->query($query_sup_lien);
if(PEAR::isError($res))
{
die($res->getMessage());
}
 
$id_fichiers = explode(",",$id) ;
foreach($id_fichiers as $en_cours)
{
supprimer_fichier($en_cours,$this->config['cel_db']['chemin_images']) ;
}
 
echo "OK" ;
exit() ;
}
}
 
}
?>
/trunk/jrest/services/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,10,19,15,0,30
 
[Settings]
ShowDotFiles=true
/trunk/jrest/services/Inventory.php
New file
0,0 → 1,497
<?php
 
 
// CRUD ligne d'inventaire :
// In get : utf8
// In post : utf8
// out : utf8
 
Class Inventory extends DBAccessor {
 
 
var $config;
 
function Inventory($config) {
 
$this->config=$config;
}
 
 
function getElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$value=array();
$DB=$this->connectDB($this->config,'database_cel');
 
if (isset($uid[1])) {
$query="SELECT identifiant, ordre, nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, id_location, date_observation, lieudit, station, milieu, commentaire, coord_x, coord_y FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' AND ordre =".$uid[1]." ORDER BY ordre";
}
else {
if (isset($uid[0])) {
$query="SELECT identifiant, ordre, nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, id_location, date_observation, lieudit, station, milieu, commentaire, coord_x, coord_y FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' ORDER BY ordre";
}
}
 
$res =& $DB->query($query);
 
 
if (DB::isError($res)) {
$this->logger("CEL_bugs","Erreur de listage des observations :".$res->getMessage()." ".$query);
}
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['id_location'], $row['ordre'], $row['date_observation'],$row['lieudit'], $row['station'], $row['milieu'], $row['commentaire'], $row['coord_x'],$row['coord_y']);
}
 
$json = new Services_JSON();
$output = $json->encode($value);
print($output);
 
return true;
 
 
}
 
function getRessource(){
 
 
}
 
 
function updateElement($uid,$pairs) {
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
if ($pairs['num_nom_sel']!='') {
 
 
 
// Utilisation d'un nom faisant parti du referentiel : recherche du nom valide correspondant
$complement=$this->rechercherInformationsComplementaires($pairs['num_nom_sel']);
 
 
$pairs['nom_ret']=$complement['Nom_Retenu'];
$pairs['num_nom_ret']=$complement['Num_Nom_Retenu'];
$pairs['num_taxon']=$complement['Num_Taxon'];
$pairs['famille']=$complement['Famille'];
 
}
 
 
 
 
$DB=$this->connectDB($this->config,'database_cel');
 
// Nullifiage ...
 
foreach($pairs as $k=>$v) {
if (trim($v)=="") {
$pairs[$k]="null";
}
 
}
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['location']=="null") $pairs['location']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['lieudit']=="null") $pairs['lieudit']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['id_location']=="null") $pairs['id_location']="000null";
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['station']=="null") $pairs['station']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['milieu']=="null") $pairs['milieu']="000null";
 
// Pour supprimer les séparateurs de mots clés en trop
if (isset($pairs['mot_cles'])) {
$pairs['mot_cles'] = str_replace(';;',';',$pairs['mot_cles']);
}
 
// TODO : decouper avec les /
 
if ($pairs['date_observation']!="null") {
list($jour,$mois,$annee)=split("/",$pairs['date_observation']);
$pairs['date_observation']=$annee."-".$mois."-".$jour." 0:0:0";
}
 
if ($pairs['coord_x']=="null") {
$pairs['coord_x'] = "000null";
}
 
if ($pairs['coord_y']=="null") {
$pairs['coord_y'] = "000null";
}
 
$query="UPDATE cel_inventory SET nom_sel = '".$DB->escapeSimple($pairs['nom_sel'])."',".
"num_nom_sel = '".$DB->escapeSimple($pairs['num_nom_sel'])."',".
"nom_ret = '".$DB->escapeSimple($pairs['nom_ret'])."',".
"num_nom_ret = '".$DB->escapeSimple($pairs['num_nom_ret'])."',".
"num_taxon = '".$DB->escapeSimple($pairs['num_taxon'])."',".
"famille = '".$DB->escapeSimple($pairs['famille'])."',".
"location = '".$DB->escapeSimple($pairs['location'])."',".
"id_location = '".$DB->escapeSimple($pairs['id_location'])."',".
"date_observation = '".$DB->escapeSimple($pairs['date_observation'])."',".
"lieudit = '".$DB->escapeSimple($pairs['lieudit'])."',".
"station = '".$DB->escapeSimple($pairs['station'])."',".
"milieu = '".$DB->escapeSimple($pairs['milieu'])."',".
"commentaire = '".$DB->escapeSimple($pairs['commentaire'])."',".
"date_modification = now() ,".
"mots_cles = '".$DB->escapeSimple($pairs['mots_cles'])."',".
"coord_x='".$DB->escapeSimple($pairs['coord_x'])."',".
"coord_y='".$DB->escapeSimple($pairs['coord_y'])."' ".
"WHERE ordre = '".$DB->escapeSimple($uid[1])."' AND identifiant='".$DB->escapeSimple($uid[0])."'";
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de modification d'une observation :".$res->getMessage()." ".$query);
}
return true;
 
}
 
 
function createElement($pairs){
 
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['identifiant']);
 
if ($pairs['num_nom_sel']!='') {
 
 
 
// Utilisation d'un nom faisant parti du referentiel : recherche du nom valide correspondant
 
 
$complement=$this->rechercherInformationsComplementaires($pairs['num_nom_sel']);
 
 
$pairs['nom_ret']=$complement['Nom_Retenu'];
$pairs['num_nom_ret']=$complement['Num_Nom_Retenu'];
$pairs['num_taxon']=$complement['Num_Taxon'];
$pairs['famille']=$complement['Famille'];
 
}
 
 
 
// Dernier numero d'ordre utilise :
 
$DB=$this->connectDB($this->config,'database_cel');
$query="SELECT max(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($pairs['identifiant'])."' ";
 
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
$row['ordre']=0;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$pairs['ordre']=$row['ordre']+1;
}
 
// Nullifiage ...
 
foreach($pairs as $k=>$v) {
if (trim($v)=="") {
$pairs[$k]="null";
}
 
}
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['location']=="null") $pairs['location']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['lieudit']=="null") $pairs['lieudit']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['id_location']=="null") $pairs['id_location']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['station']=="null") $pairs['station']="000null";
 
 
// Pour apparaitre le premier dans les tris ...
if ($pairs['milieu']=="null") $pairs['milieu']="000null";
 
 
// TODO : decouper avec les /
 
if ($pairs['date_observation']!="null") {
 
list($jour,$mois,$annee)=split("/",$pairs['date_observation']);
$pairs['date_observation']=$annee."-".$mois."-".$jour." 0:0:0";
 
}
 
if ($pairs['coord_x']=="null") {
$pairs['coord_x'] = "000null";
}
 
if ($pairs['coord_y']=="null") {
$pairs['coord_y'] = "000null";
}
 
$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, date_creation,date_modification,coord_x,coord_y) " .
" VALUES('".$DB->escapeSimple($pairs['identifiant'])."','".
$DB->escapeSimple($pairs['ordre'])."','".
$DB->escapeSimple($pairs['nom_sel'])."','".
$DB->escapeSimple($pairs['num_nom_sel'])."','".
$DB->escapeSimple($pairs['nom_ret'])."','".
$DB->escapeSimple($pairs['num_nom_ret'])."','".
$DB->escapeSimple($pairs['num_taxon'])."','".
$DB->escapeSimple($pairs['famille'])."','".
$DB->escapeSimple($pairs['location'])."','".
$DB->escapeSimple($pairs['id_location'])."','".
$DB->escapeSimple($pairs['date_observation'])."','".
$DB->escapeSimple($pairs['lieudit'])."','".
$DB->escapeSimple($pairs['station'])."','".
$DB->escapeSimple($pairs['milieu'])."','".
$DB->escapeSimple($pairs['commentaire'])."',".
"now() , now(),'".
$DB->escapeSimple($pairs['coord_x'])."','".
$DB->escapeSimple($pairs['coord_y'])."')";
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de creation d'une observation :".$res->getMessage()." ".$query);
return false;
//die($res->getMessage());
}
 
return true;
 
}
 
 
function deleteElement($uid){
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$value=array();
$DB=$this->connectDB($this->config,'database_cel');
 
if (isset($uid[1])) {
$query="DELETE FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' AND ordre in (".$DB->escapeSimple($uid[1]) .")";
}
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
$this->logger("CEL_bugs","Erreur de suppression d'une observation :".$res->getMessage()." ".$query);
return false;
}
else {
echo "OK" ;
exit() ;
}
 
return true;
 
 
}
 
 
function rechercherInformationsComplementaires($numNom) {
 
$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 Nomen nom retenu, Num Taxon,
// Famille
 
$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);
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 ;
}
 
 
 
}
 
/* +--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
*
*
*
*/
 
?>
/trunk/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 ;
}
?>
/trunk/jrest/services/include/stockage_fichier.php
New file
0,0 → 1,222
<?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
/*
* stockage_fichier.php
*
* Cas d'utilisation :
* le service reçoit les informations d'upload d'une image et une id (nom de fichier)
* et crée les miniatures associées à l'image et stocke le tout
*/
 
// traite l'upload d'une fichier et le deplace en le renommant selon un identtifiant donne
function stocker_fichier($fichier,$id,$chemin_base,$taillemax)
{
$droits = 0755;
 
$chemin_sur_serveur = $chemin_base ;
 
$id = sprintf('%09s', $id) ;
$id = wordwrap($id, 3 , '_', true) ;
 
$id_fichier = $id.".jpg" ;
 
$niveauDossier = split("_", $id) ;
 
$dossierNiveau1 = $niveauDossier[0] ;
$dossierNiveau2 = $niveauDossier[1] ;
 
if(!file_exists($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S'))
{
if(mkdir($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S',$droits, true)) {
chmod($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S',$droits);
}
else
{
$erreur = 'ERROR : probleme durant l\'écriture du dossier s \n' ;
$this->logger('CEL_bugs',$erreur);
return false;
}
}
 
if(!file_exists($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M'))
{
if(mkdir($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M',$droits, true)) {
chmod($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M',$droits);
}
else
{
$erreur = 'ERROR : probleme durant l\'écriture du dossier m \n' ;
$this->logger('CEL_bugs',$erreur);
return false;
}
}
 
if(!file_exists($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L'))
{
if(mkdir($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L',$droits, true)) {
chmod($chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L',$droits);
}
else
{
$erreur = 'ERROR : probleme durant l\'écriture du dossier l \n' ;
$this->logger('CEL_bugs',$erreur);
return false;
}
}
 
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ;
 
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id.".jpg" ;
 
if(move_uploaded_file($fichier['tmp_name'],$chemin_fichier))
{
// on redimensionne
list($width, $height) = getimagesize($chemin_fichier);
 
$small_width = 100;
$small_height = 100;
 
$medium_width = 300;
$medium_height = 300;
 
// on reechantillonne
$image_p = imagecreatetruecolor($small_width, $small_height);
$image_m = imagecreatetruecolor($medium_width, $medium_height);
$image_l = imagecreatetruecolor($width, $height);
 
$image = imagecreatefromjpeg($chemin_fichier);
 
$ratio_compression = 100 ;
 
if(filesize($chemin_fichier) >= $taillemax) {
$ratio_compression = 85 ;
}
 
if($image == null)
{
$erreur = 'ERROR : probleme durant la création des images resamplées l \n' ;
$this->logger('CEL_bugs',$erreur);
return false ;
}
 
// et on copie les nouvelles images (pour la galerie et la liste)
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $small_width, $small_height, $width, $height);
imagecopyresampled($image_m, $image, 0, 0, 0, 0, $medium_width, $medium_height, $width, $height);
imagecopyresampled($image_l, $image, 0, 0, 0, 0, $width, $height, $width, $height);
 
imagejpeg($image_p, $chemin_sur_serveur_final.'/S/'.$id.'_S.jpg', 85);
chmod($chemin_sur_serveur_final.'/S/'.$id.'_S.jpg',$droits);
 
imagejpeg($image_m,$chemin_sur_serveur_final.'/M/'.$id.'_M.jpg', 85);
chmod($chemin_sur_serveur_final.'/M/'.$id.'_M.jpg',$droits);
 
imagejpeg($image_l,$chemin_sur_serveur_final.'/L/'.$id.'_L.jpg', $ratio_compression);
chmod($chemin_sur_serveur_final.'/L/'.$id.'_L.jpg',$droits);
 
unlink($chemin_fichier) ;
 
return true ;
}
else
{
$erreur = 'ERROR : probleme durant le déplacement du fichier temporaire \n' ;
$this->logger('CEL_bugs',$erreur);
return false ;
}
}
 
function supprimer_fichier($id,$chemin_base)
{
$chemin_sur_serveur = $chemin_base ;
 
$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' ;
 
if(file_exists($fichier_s))
{
$suppression_s = unlink($fichier_s) ;
 
if(!$suppression_s) {
$erreur = 'ERROR : probleme durant la suppression de l\'image '.$fichier_s.' \n' ;
$this->logger('CEL_images_bugs',$erreur);
}
} else {
$erreur = 'ERROR : probleme : l\'image '.$fichier_s.' n\'existe pas \n' ;
$this->logger('CEL_images_bugs',$erreur);
} // Si le fichier existe
 
if(file_exists($fichier_m))
{
$suppression_m = unlink($fichier_m) ;
if(!$suppression_m) {
$erreur = 'ERROR : probleme durant la suppression de l\'image '.$fichier_m.' \n' ;
$this->logger('CEL_images_bugs',$erreur);
}
} else {
$erreur = 'ERROR : probleme : l\'image '.$fichier_m.' n\'existe pas \n' ;
$this->logger('CEL_images_bugs',$erreur);
} // Si le fichier existe
 
if(file_exists($fichier_l))
{
$suppression_l = unlink($fichier_l) ;
if(!$suppression_l) {
$erreur = 'ERROR : probleme durant la suppression de l\'image '.$fichier_l.' \n' ;
$this->logger('CEL_images_bugs',$erreur);
}
} else {
$erreur = 'ERROR : probleme : l\'image '.$fichier_l.' n\'existe pas \n' ;
$this->logger('CEL_images_bugs',$erreur);
} // Si le fichier existe
 
return true;
 
}
 
?>
/trunk/jrest/services/include/.directory
New file
0,0 → 1,5
[Dolphin]
Timestamp=2010,10,19,15,0,48
 
[Settings]
ShowDotFiles=true
/trunk/jrest/services/InventoryMaintenance.php
New file
0,0 → 1,59
<?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 InventoryMaintenance extends DBAccessor {
 
function InventoryMaintenance($config) {
$this->config=$config;
}
 
 
// renvoie l'enregistrement correspond � une image
function getElement($uid)
{
if($this->isAdmin($uid[0])) {
// uid[0] : utilisateur obligatoire
// uid[1] : identifiant fonction
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
if($uid[1] == "dates_images") {
$this->reparerDatesImages();
}
 
}
 
}
 
private function reparerDatesImages() {
 
$query= 'UPDATE cel_images SET ci_meta_date = 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") ;
print "Reparation des dates effectuées" ;
exit() ;
}
 
}
?>
/trunk/jrest/services/InventoryImage.php
New file
0,0 → 1,288
<?php
 
require_once('include/extract_metadonnee.php') ;
require_once('include/stockage_fichier.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
/*
* InventoryImage.php
*
* Cas d'utilisation :
* Service recherche et ajout d'image a partir de divers crit�res
*
* 1: Le service recoit une image � ajouter � la base de donn�e
* 2: Le service recherche l'image correspondant au crit�res demand�
* 3: Le service renvoie l'adresse de base de l'image qui permet de la localiser sous ses diff�rents formats (X, M ou L)
*/
 
Class InventoryImage extends DBAccessor {
 
var $config;
 
function InventoryImage($config) {
 
$this->config=$config;
}
 
 
// renvoie l'enregistrement correspond � une image
function getElement($uid)
{
// uid[0] : utilisateur obligatoire
// uid[1] : identifiant image obligatoire
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'cel_db');
 
if (isset($uid[0]))
{
$query="SELECT * FROM cel_images WHERE ci_id_image ='".$DB->escapeSimple($uid[1])."'";
}
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
}
 
$image = $res->fetchrow(DB_FETCHMODE_ASSOC) ;
 
$res = json_encode($image) ;
 
header("content-type: text/json") ;
print $res ;
exit() ;
}
 
// met � jour les m�tadonn�es d'une image
function updateElement($uid,$pairs)
{
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
 
/*$fp = fopen('dump.txt','w+') ;
fwrite($fp,print_r($pairs,true)) ;
fclose($fp) ;*/
 
$DB=$this->connectDB($this->config,'cel_db');
 
$query = 'UPDATE cel_images SET ' ;
 
foreach($pairs as $champ => $valeur)
{
if($champ == 'ci_meta_date') {
 
$date_tab = split('/',$valeur) ;
$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
 
$query .= $champ.' = "'.$date.'" , ' ;
 
}
else {
$query .= $champ.' = "'.$DB->escapeSimple($valeur).'" , ' ;
}
}
 
$query = rtrim($query," , ") ;
 
$query .= ' WHERE ci_id_image = "'.$DB->escapeSimple($pairs['ci_id_image']).'"' ;
 
$res =& $DB->query($query);
 
if (PEAR::isError($res))
{
return false ;
}
else
{
echo "OK" ;
exit() ;
}
}
 
 
// ajoute une image ainsi que ses metadonn�es � la base du carnet
function createElement($pairs)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['identifiant']);
 
foreach($_FILES as $file) {
 
$infos_fichier = $file ;
}
 
$DB=$this->connectDB($this->config,'cel_db');
 
$nouvel_ordre = 0 ;
$query_ordre ='SELECT MAX(ci_ordre) FROM cel_images WHERE ci_ce_utilisateur = "'.$DB->escapeSimple($pairs['identifiant']).'"' ;
$res =& $DB->query($query_ordre);
if (PEAR::isError($res))
{
$erreur = 'ERROR : probleme durant le calcul de l\'ordre de l\'image \n' ;
die($res->getMessage());
}
else
{
$row = $res->fetchrow() ;
$nouvel_ordre = $row[0] + 1;
}
 
 
if($nouvel_ordre)
{
$fichier_meta = extraire_metadonnees($infos_fichier['tmp_name']) ;
}
else
{
$erreur = 'ERROR : probleme durant l\'upload de l\'image \n' ;
}
 
$fichier_meta['ci_ordre'] = $nouvel_ordre ;
$fichier_meta['ci_publiable_eflore'] = 'false' ;
$fichier_meta['ci_nom_original'] = $infos_fichier['name'] ;
$fichier_meta['ci_md5'] = md5_file($infos_fichier['tmp_name']) ;
$fichier_meta['ci_ce_utilisateur'] = $pairs['identifiant'] ;
 
 
$query_champs = '' ;
$query_valeurs = '' ;
 
foreach($fichier_meta as $field => $value)
{
$query_champs .= $field.',' ;
 
if(is_null($value))
{
$query_valeurs .= 'NULL,' ;
}
else
{
$query_valeurs .= '"'.$DB->escapeSimple($value).'",' ;
}
}
 
$query_champs .= 'ci_meta_date_ajout' ;
$query_valeurs .= 'CURRENT_TIMESTAMP()' ;
 
//$query_champs = rtrim($query_champs,',') ;
//$query_valeurs = rtrim($query_valeurs,',') ;
 
$query ="INSERT INTO cel_images (".$query_champs.") VALUES (".$query_valeurs.")" ;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
//die($res->getMessage());
$erreur = "ERROR : echec de l'insertion dans la base de donnees : ".$query ;
}
 
$query_id ='SELECT ci_id_image FROM cel_images WHERE ci_ce_utilisateur = "'.$DB->escapeSimple($pairs['identifiant']).'" AND ci_ordre = "'.$nouvel_ordre.'"' ;
$res =& $DB->query($query_id);
 
if (PEAR::isError($res))
{
$erreur = 'ERROR : probleme durant le calcul de l\'id de l\'image \n' ;
//die($res->getMessage());
}
else
{
$row = $res->fetchrow() ;
$id = $row[0] ;
}
 
if(isset($id))
{
$fichier = array('name' => $infos_fichier['name'] , 'type' => $infos_fichier['type'] , 'size' => $infos_fichier['size'] , 'tmp_name' => $infos_fichier['tmp_name'] ) ;
$fichier_stocke = stocker_fichier($fichier,$id,$this->config['cel_db']['chemin_images'],$this->config['cel_db']['taille_max']) ;
// l'upload demande de court-circuiter le fonctionnement normal de JREST
header('HTTP/1.0 200 Created');
echo "OK" ;
exit() ;
}
else
{
$erreur = 'ERROR : probleme durant l\'ajout des metadonnees \n' ;
exit ;
}
 
}
 
// supprime une image et ses metadonn�es associ�es de la base du carnet
function deleteElement($uid){
 
// uid[0] : utilisateur obligatoire
// uid[1] : identifiant(s) image(s) obligatoire(s)
 
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[0]);
 
$DB=$this->connectDB($this->config,'cel_db');
 
$id = $uid[1] ;
 
if (isset($uid[1])) {
$query="DELETE FROM cel_images WHERE ci_id_image in (".$DB->escapeSimple($uid[1]) .")";
$query_sup_lien = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$DB->escapeSimple($id) .")";
}
 
$res =& $DB->query($query);
 
if (PEAR::isError($res)) {
die($res->getMessage());
}
else
{
$res =& $DB->query($query_sup_lien);
if(PEAR::isError($res))
{
die($res->getMessage());
}
 
supprimer_fichier($id,$this->config['cel_db']['chemin_images']);
 
echo "OK" ;
exit() ;
}
}
 
}
?>
/trunk/jrest/services/Cel.php
New file
0,0 → 1,328
<?php
/**
* 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>
* @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 {
 
public $config;
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->recupererParametresUrl();
$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];
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
try {
$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
} catch (PDOException $e) {
echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
}
// Passe en UTF-8 la connexion à la BDD
$PDO->exec("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);
return $PDO;
}
protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) {
try {
switch ($retour) {
case 'All' :
$resultat = $this->bdd->query($requete)->fetchAll($mode);
break;
case 'Column' :
$resultat = $this->bdd->query($requete)->fetchColumn();
break;
default:
$resultat = false;
$this->messages[] = "Le type de retour '$retour' est inconnu.";
}
if ($resultat === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = 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 recupererParametresUrl() {
if (isset($_GET)) {
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
foreach ($get_params as $get) {
if (isset($_GET[$get])) {
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
$_GET[$get] = strip_tags(str_replace($verifier, '', $_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;
}
}
}
}
}
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($variable, $donnees = null, $encodage = 'utf-8') {
$contenu = "var $variable = ".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');
$mime = 'text/html';
$encodage = 'utf-8';
$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 DU DAO
protected function getDao() {
if (isset($this->dao)) {
return $this->dao;
} else {
$e = "Le DAO n'a pas été initialisé. Utiliser la méthode initialiserDao().";
trigger_error($e, E_USER_WARNING);
}
}
protected function initialiserDao($url_services_distant) {
if (is_null($this->dao)) {
$this->dao = new CelDao($url_services_distant);
} else {
$this->dao->url_jrest = $url_services_distant;
}
}
//+----------------------------------------------------------------------------------------------------------------+
// GESTION DE L'IDENTIFICATION
public function authentifier() {
$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ée.\n".
"Actualiser la page pour essayer à nouveau.";
if (!isset($_SERVER['PHP_AUTH_USER'])) {
$this->envoyerAuth($message_accueil, $message_echec);
} else {
if ($this->etreAutorise($_SERVER['PHP_AUTH_USER']) == false) {
$this->envoyerAuth($message_accueil, $message_echec);
}
}
return true;
}
public function etreAutorise($identifiant) {
$this->initialiserDao('http://www.tela-botanica.org/client/annuaire_nouveau/actuelle/jrest/');
$mdp = md5($_SERVER['PHP_AUTH_PW']);
$url = $this->getDao()->url_jrest."TestLoginMdp/$identifiant/$mdp";
$json = $this->getDao()->envoyerRequeteConsultation($url);
$existe = json_decode($json);
$autorisation = false;
if ($existe == true && $this->etreAdminCel($identifiant)) {
$autorisation = true;
}
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;
}
 
//+----------------------------------------------------------------------------------------------------------------+
// GESTION DE MÉTHODES COMMUNES ENTRE LES SERVICES
protected function encoderMotCle($mot_cle) {
return md5(mb_strtolower($mot_cle));
}
//+----------------------------------------------------------------------------------------------------------------+
// 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;
}
}
/trunk/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
*
*
*
*/
 
?>
/trunk/jrest/services/InventoryByDept.php
New file
0,0 → 1,153
<?php
 
// In utf8
// Out iso3859
 
// Liste des Nouvelles observations par departement
 
 
Class InventoryByDept extends DBAccessor {
 
 
var $config;
var $extendSpreadsheetProductor;
function InventoryByDept($config) {
 
$this->config=$config;
// Pas d'heritage multiple en php :(
$this->extendSpreadsheetProductor = new SpreadsheetProductor();
$this->extendSpreadsheetProductor->initSpreadsheet();
}
 
function getRessource(){
$DB=$this->connectDB($this->config,'database_cel');
$query="SELECT id_location, 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 id_location!='000null' and transmission=1 and num_taxon!=0 order by round(id_location), nom_ret";
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
// 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');
$DB2=$this->connectDB($this->config);
$i=1;
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
 
$query2="SELECT ecd_ce_taxon FROM eflore_zg, eflore_chorologie_donnee WHERE ecd_ce_taxon =".$row['num_taxon']." and ezg_code=".$row['id_location']." and ecd_ce_zone_geo=ezg_id_zone_geo and ezg_id_projet_zg =ecd_ce_version_projet_zg and ecd_ce_version_projet_taxon=25";
 
$res2 =& $DB2->query($query2);
if (DB::isError($res2)) {
die($res2->getMessage());
}
if ($res2->numRows() == 0) {
// Denullifiage
foreach($row as $k=>$v) {
if (($v=="null") || ($v=="000null")) {
$row[$k]="";
}
else {
$row[$k]=utf8_decode($v);
}
}
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;
}
else {
$row['date_observation']="00/00/0000";
}
$worksheet->write($i,0,$row['id_location']);
$worksheet->write($i,1,$row['nom_sel']);
$worksheet->write($i,2,$row['num_nom_sel']);
$worksheet->write($i,3,$row['nom_ret']);
$worksheet->write($i,4,$row['num_nom_ret']);
$worksheet->write($i,5,$row['num_taxon']);
$worksheet->write($i,6,$row['famille']);
$worksheet->write($i,7,$row['location']);
$worksheet->write($i,8,$row['date_observation']);
$worksheet->write($i,9,$row['lieudit']);
$worksheet->write($i,10,$row['station']);
$worksheet->write($i,11,$row['milieu']);
$worksheet->write($i,12,$row['commentaire']);
$worksheet->write($i,13,$row['identifiant']);
$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
*
*
*
*/
 
?>
/trunk/jrest/services/CelWidgetMap.php
New file
0,0 → 1,137
<?php
/**
* 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.
*
* 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
*/
class CelWidgetMap extends Cel {
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params) {
$retour = null;
$parametres = $this->traiterParametres(array('carte', 'utilisateur', 'projet'), $params, false);
extract($parametres);
 
if (isset($carte)) {
$methode = $this->traiterNomMethodeGet($carte);
if (method_exists($this, $methode)) {
$retour = $this->$methode($parametres);
} else {
$this->messages[] = "Ce type de carte '$methode' n'est pas disponible.";
}
} else {
$this->messages[] = "Vous devez indiquer le type de carte.";
}
 
if (is_null($retour)) {
$info = 'Un problème est survenu : '.print_r($this->messages, true);
$this->envoyer($info);
} else if ($retour['type'] == 'widget') {
$squelette = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR.$retour['squelette'].'.tpl.html';
$html = $this->traiterSquelettePhp($squelette, $retour['donnees']);
$this->envoyer($html);
} else if ($retour['type'] == 'json') {
$this->envoyerJson($retour['variable_js'], $retour['donnees']);
}
}
 
/**
* Carte par défaut
*/
public function getCarteDefaut($parametres) {
$widget = null;
extract($parametres);
 
// Création url données json
$url_json = sprintf($this->config['settings']['baseURLAbsoluDyn'], 'CelWidgetMap');
$url_json .= '/carte-defaut-json/';
$url_json .= (isset($utilisateur) ? $utilisateur : '*');
 
$url_base = sprintf($this->config['settings']['baseURLAbsoluDyn'], '');
 
// Création des infos du widget
$widget['type'] = 'widget';
$widget['donnees']['url_json'] = $url_json;
$widget['donnees']['url_base'] = $url_base;
$widget['squelette'] = 'carte_defaut';
 
return $widget;
}
 
/**
* Données de la carte par défaut
*/
public function getCarteDefautJson($parametres) {
$json = null;
extract($parametres);
 
$requete = 'SELECT sector, x_utm, y_utm, coord_x, coord_y, ref_geo '.
'FROM cel_inventory AS i '.
' LEFT JOIN locations AS l '.
' ON (l.name = i.location AND l.code = i.id_location) '.
"WHERE transmission = '1' ".
(isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '');
$resultats = $this->executerRequete($requete);
 
// Traitement des résultats
$mm = array('min_x' => 0,'max_x' => 0,'min_y' => 0,'max_y' => 0);
$points = array();
foreach ($resultats as $enrg) {
if ($enrg['coord_x'] == '' && $enrg['coord_y'] == '' && $enrg['x_utm'] != '' && $enrg['y_utm'] != '') {
$convertisseur = new gPoint();
$convertisseur->setUTM($enrg['x_utm'], $enrg['y_utm'], $enrg['sector']);
$convertisseur->convertTMtoLL();
$enrg['coord_x'] = $convertisseur->Lat();
$enrg['coord_y'] = $convertisseur->Long();
}
 
 
$id = $enrg['coord_x'].'-'.$enrg['coord_y'];
if (!isset($points[$id])) {
$points[$id] = $enrg;
$points[$id]['nbre'] = 1;
} else {
$points[$id]['nbre']++;
}
 
// Détermination x et y min et max
$mm['min_x'] = ($mm['min_x'] > $enrg['coord_x']) ? $enrg['coord_x'] : $mm['min_x'];
$mm['min_y'] = ($mm['min_y'] > $enrg['coord_y']) ? $enrg['coord_y'] : $mm['min_y'];
$mm['max_x'] = ($mm['max_x'] < $enrg['coord_x']) ? $enrg['coord_x'] : $mm['max_x'];
$mm['max_y'] = ($mm['max_y'] < $enrg['coord_y']) ? $enrg['coord_y'] : $mm['max_y'];
}
 
// Post-traitement des résultats
$x_moyen = str_replace(',', '.', ($mm['max_x'] - $mm['min_x']));
$y_moyen = str_replace(',', '.', ($mm['max_y'] - $mm['min_y']));
$points = array_values($points);
 
// Création des infos du widget
$json['type'] = 'json';
$json['variable_js'] = 'obs';
$json['donnees']['points'] = $points;
$json['donnees']['nombre'] = count($points);
$json['donnees']['centre_x'] = $x_moyen;
$json['donnees']['centre_y'] = $y_moyen;
 
 
//echo '<pre>'.print_r($json, true).'</pre>';
return $json;
}
}
/trunk/jrest/services/NameSearch.php
New file
0,0 → 1,224
<?php
// in : utf8
// out : utf8
 
/**
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.
*/
/*
* Informations recues en iso8859-1
* 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 DBAccessor {
 
 
var $config;
function NameSearch($config) {
 
$this->config=$config;
}
 
function getElement($uid){
 
$value=array();
// Genre et Espece
if (isset($uid[1]) && isset($uid[0])) {
$genre=$uid[0];
$espece=$uid[1];
if (strlen($espece) > 0 ) {
$espece=ereg_replace('\*+','%',$espece);
$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, esn_ce_statut" .
" 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 en_id_version_projet_nom = '25' AND en_nom_genre LIKE '".$DB->escapeSimple($genre)."%' " .
" AND en_ce_rang > 160 " .
" AND en_epithete_espece like '".$DB->escapeSimple($espece)."%' 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 " .
" AND esn_id_nom= en_id_nom ".
" ORDER BY esn_ce_statut, en_ce_rang, en_epithete_espece, en_nom_genre LIMIT 50";
 
}
else {
print "[]";
return;
}
}
else {
if (isset($uid[0])) {
$genre=$uid[0];
$genre=ereg_replace('\*+','%',$genre);
if ((strlen($genre) > 1) && ($genre != '%')) {
$DB=$this->connectDB($this->config);
$query="SELECT DISTINCT en_nom_genre, en_id_nom, 0 as esn_ce_statut FROM eflore_nom WHERE en_id_version_projet_nom = '25'" .
"AND en_ce_rang = 160 " .
"AND en_nom_genre LIKE '".$DB->escapeSimple($genre)."%' ORDER BY esn_ce_statut, en_nom_genre LIMIT 50";
}
else {
print "[]";
return ;
}
}
else {
print "[]";
return ;
}
}
$res =& $DB->query($query);
if (DB::isError($res)) {
die($res->getMessage());
}
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) {
$value[]=array($this->formaterNom($row),$row['en_id_nom'], $row['esn_ce_statut']);
}
$json = new Services_JSON();
$output = $json->encode($value);
print($output);
 
}
function getRessource(){
print "[]";
return;
}
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 .retournerAuteur($rawnom) ;
}
}
 
 
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 ;
}
 
/* +--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
*
*
*/
 
?>
/trunk/jrest/services/InventoryItemList.php
New file
0,0 → 1,201
<?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'];
}
$json = new Services_JSON();
$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']);
}
$json = new Services_JSON();
$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
*
*
*
*/
 
?>