/tags/celw-v1.1/jrest/services/CelImage.php |
---|
New file |
0,0 → 1,86 |
<?php |
// declare(encoding='UTF-8'); |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Service fournissant la liste des ids des images liées à une observation. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* /CelImage/liste-ids?obsId=[0-9]+ : ids des images liées à l'observation possédant l'identifiant 'obsId'. |
* |
* Sortie : |
* Type de sortie : json (par défaut), HTML en cas d'erreur. |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class CelImage extends Cel { |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params) { |
$parametres = $this->traiterParametres(array('mode'), $params, false); |
extract($parametres); |
$contenu = ''; |
$retour = null; |
if (isset($mode)) { |
$methode = $this->traiterNomMethodeGet($mode); |
if (method_exists($this, $methode)) { |
$this->parametres = array_shift($params); |
$retour = $this->$methode(); |
} else { |
$service = get_class($this); |
$this->messages[] = "Ce type de mode '$mode' pour le service '$service' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Vous devez indiquer un type de mode d'interrogation."; |
} |
if (is_null($retour)) { |
$this->messages[] = "Un problème est survenu lors de l'appel au service CelImage"; |
} |
$this->envoyerJson($retour); |
} |
/** |
* Carte par défaut |
*/ |
private function getListeIds() { |
$ids = array(); |
if (isset($_GET['obsId'])) { |
$observations = $this->traiterValeursMultiples($_GET['obsId']); |
if (! is_null($observations)) { |
$requete = 'SELECT co.id_observation, cim.id_image '. |
'FROM cel_obs AS co '. |
' LEFT JOIN cel_obs_images AS coi '. |
' ON (coi.id_observation = co.id_observation AND coi.id_utilisateur = co.ce_utilisateur) '. |
' LEFT JOIN cel_images AS cim '. |
' ON (coi.id_image = cim.id_image) '. |
"WHERE co.id_observation IN ($observations) "; |
$resultat_requete_images = $this->requeter($requete); |
$infos = array(); |
if(is_array($resultat_requete_images)) { |
$infos = $resultat_requete_images; |
} |
foreach ($infos as $info) { |
if ($info['id_image'] != 0) { |
$ids[$info['id_observation']][] = (int) $info['id_image']; |
} |
} |
} |
} |
return $ids; |
} |
} |
/tags/celw-v1.1/jrest/services/NameSearch.php |
---|
New file |
0,0 → 1,73 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* |
* in : utf8 |
* out : utf8 |
* |
* NameSearch.php |
* |
* Cas d'utilisation : |
* Service completion nom scientifique |
* |
* 1 : L'application recoit un debut de nom scientifique |
* 2 : Si le genre recu est >1, l'application retourne les 50 premieres genre commencant par ce prefixe |
* 3 : Si l'espece est presente l'application retourne les 50 premieres genre+espece commencant par ce prefixe |
*/ |
class NameSearch extends Cel { |
public function getRessource(){ |
//TODO: description du service à renvoyer |
print "[]"; |
return; |
} |
public function getElement($uid){ |
$liste_genre_espece = array(); |
$genre = null; |
$espece = null; |
if(isset($uid[0])) { |
$genre = $uid[0]; |
} |
if(isset($uid[1])) { |
$espece = $uid[1]; |
} |
$chercheur_infos_taxon = new RechercheInfosTaxon($this->config); |
$liste_genre_espece = $chercheur_infos_taxon->rechercherGenreEspeceSurPrefixe($genre,$espece); |
$output = json_encode($liste_genre_espece); |
header("content-type: application/json"); |
print($output); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.6 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.5 2007-05-21 18:13:30 ddelon |
* Refactoring et documentation |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/InventoryItemList.php |
---|
New file |
0,0 → 1,199 |
<?php |
// In : utf8 |
// Out : utf8 |
Class InventoryItemList extends DBAccessor { |
var $config; |
function InventoryItemList($config) { |
$this->config=$config; |
} |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
// uid[0] : utilisateur obligatoire |
// uid[1] : si absent : valeur 'all' (departement) |
// uid[2] : si absent : valeur 'all' (commune) |
// uid[3] : si absent : valeur 'all' (annee) |
// uid[4] : si absent : valeur 'all' (mois) |
// uid[5] : si absent : valeur 'all' (jour) |
// uid[6] : si absent : valeur 'all' (recherche libre) |
// uid[7] : si absent : valeur 'all' (lieudit) |
// uid[8] et uid[9] : selection intervalle |
$DB=$this->connectDB($this->config,'database_cel'); |
if (!isset($uid[1]) || $uid[1]=="" || $uid[1]=="all" ) { |
$uid[1]="all"; |
$query_id_location=""; |
} |
else { |
$query_id_location=" AND id_location='".$DB->escapeSimple($uid[1])."' "; |
} |
if (!isset($uid[2]) || $uid[2]=="" || $uid[2]=="all" ) { |
$uid[2]="all"; |
$query_location=""; |
} |
else { |
$query_location=" AND location='".$DB->escapeSimple($uid[2])."' "; |
} |
if (!isset($uid[3]) || $uid[3]=="" || $uid[3]=="all") { |
$uid[3]="all"; |
$query_year=""; |
} |
else { |
$query_year=" AND year(date_observation)='".$DB->escapeSimple($uid[3])."' "; |
} |
if (!isset($uid[4]) || $uid[4]=="" || $uid[4]=="all") { |
$uid[4]="all"; |
$query_month=""; |
} |
else { |
$query_month=" AND month(date_observation)='".$DB->escapeSimple($uid[4])."' "; |
} |
if (!isset($uid[5]) || $uid[5]=="" || $uid[5]=="all") { |
$uid[5]="all"; |
$query_day=""; |
} |
else { |
$query_day=" AND day(date_observation)='".$DB->escapeSimple($uid[5])."' "; |
} |
if (!isset($uid[6]) || $uid[6]=="" || $uid[6]=="all") { |
$uid[6]="all"; |
$query_libre=""; |
} |
else { |
$query_libre=" AND (nom_sel like '%".$DB->escapeSimple($uid[6])."%' OR nom_ret like '%".$DB->escapeSimple($uid[6])."%' OR station like '%".$DB->escapeSimple($uid[6])."%' OR milieu like '%".$DB->escapeSimple($uid[6])."%' OR commentaire like '%".$DB->escapeSimple($uid[6])."%') "; |
} |
if (!isset($uid[7]) || $uid[7]=="" || $uid[7]=="all") { |
$uid[7]="all"; |
$query_lieudit=""; |
} |
else { |
$query_lieudit=" AND lieudit='".$DB->escapeSimple($uid[7])."' "; |
} |
$value=array(); |
if (isset($uid[8]) && isset($uid[9])) { |
$query="SELECT identifiant, ordre, nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, date_observation," . |
" lieudit, station, milieu, commentaire, transmission FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " . |
$query_id_location. |
$query_location. |
$query_year. |
$query_month. |
$query_day. |
$query_libre. |
$query_lieudit. |
" ORDER BY ordre LIMIT ".$uid[8].",".$uid[9]; |
} |
else { |
if (isset($uid[8])) { |
// les n derniers |
$query="SELECT identifiant, ordre, nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille, location, date_observation," . |
" lieudit, station, milieu, commentaire, transmission FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " . |
$query_id_location. |
$query_location. |
$query_year. |
$query_month. |
$query_day. |
$query_libre. |
$query_lieudit. |
" ORDER BY ordre LIMIT ".$uid[8].",18446744073709551615"; |
} |
else { |
$query="SELECT count(*) as count FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."'" . |
$query_id_location. |
$query_location. |
$query_year. |
$query_month. |
$query_day. |
$query_libre. |
$query_lieudit; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$value=$row['count']; |
} |
$output = json_encode((integer)$value); |
print($output); |
return true; |
} |
} |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
if ($row['date_observation']!="0000-00-00 00:00:00") { |
list($year,$month,$day)= split ('-',$row['date_observation']); |
list($day)= split (' ',$day); |
$row['date_observation']=$day."/".$month."/".$year; |
} |
$value[]=array($row['nom_sel'], $row['num_nom_sel'],$row['nom_ret'],$row['num_nom_ret'],$row['num_taxon'],$row['famille'], $row['location'], $row['ordre'], $row['date_observation'], $row['lieudit'], $row['station'], $row['milieu'], $row['commentaire'], $row['transmission']); |
} |
$output = json_encode($value); |
print($output); |
return true; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.7 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.6 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.5 2007-05-22 12:54:08 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/PlantNetRss.php |
---|
New file |
0,0 → 1,225 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2009 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
class PlantNetRss extends DBAccessor { |
var $config; |
function PlantNetRss($config) { |
$this->config=$config; |
} |
function getElement($uid){ |
$rss = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n"; |
$rss .= "<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n"; |
$rss .=' |
<channel> |
<title>Carnet en ligne</title> |
<link>http://www.tela-botanica.org/cel/jrest/ImageRss</link> |
<description>Carnet en ligne</description> |
<language>fr</language>'; |
$DB=$this->connectDB($this->config,'cel_db'); |
$motcle = 'plantnet'; |
$query_id_id_img = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE cmc_id_mot_cle_general = md5("'.$motcle.'")' ; |
$res =& $DB->query($query_id_id_img); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
$query='SELECT * FROM cel_images'; |
$premier_item = true ; |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
if($premier_item) { |
$query .= ' WHERE '; |
$premier_item = false ; |
} |
else{ |
$query .= ' OR '; |
} |
$query .= '(ci_meta_mots_cles LIKE "%'.$row['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur ="'.$row['cmc_id_proprietaire'].'")' ; |
} |
$query .= ' ORDER BY ci_meta_date_ajout DESC LIMIT 0,100' ; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$row['ci_nom_original'] = htmlspecialchars($row['ci_nom_original']); |
$row['ci_id_image'] = htmlspecialchars($row['ci_id_image']); |
$row['ci_meta_date_ajout'] = htmlspecialchars($row['ci_meta_date_ajout']); |
$row['ci_ce_utilisateur'] = htmlspecialchars($row['ci_ce_utilisateur']); |
$row['ci_meta_user_comment'] = htmlspecialchars($row['ci_meta_user_comment']); |
$row['ci_note_image'] = htmlspecialchars($row['ci_note_image']); |
$tailleXY = $this->calculerDimensions(array($row['ci_meta_width'], $row['ci_meta_height'])); |
$id = $row['ci_id_image']; |
$chemin_sur_serveur = $this->config['cel_db']['url_images']; |
$req_liaison = 'SELECT * FROM cel_inventory WHERE ordre IN (SELECT coi_ce_observation FROM cel_obs_images WHERE coi_ce_image = "'.$row['ci_id_image'].'") AND identifiant = "'.$row['ci_ce_utilisateur'].'"' ; |
$res_liaison =& $DB->query($req_liaison); |
if (DB::isError($res_liaison)) { |
die($res_liaison->getMessage()); |
} |
if (DB::isError($res_liaison)) { |
die($res_liaison->getMessage()); |
} |
$id = sprintf('%09s', $id) ; |
$id = wordwrap($id, 3 , '_', true) ; |
$id_fichier = $id.".jpg" ; |
$niveauDossier = split("_", $id) ; |
$dossierNiveau1 = $niveauDossier[0] ; |
$dossierNiveau2 = $niveauDossier[1] ; |
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ; |
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ; |
$chemin_fichier_m = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ; |
$rss.= ' <item> |
<title>'.$row['ci_nom_original']." (".$row['ci_id_image'].") ". ' par ' . $row['ci_ce_utilisateur'].'</title> |
<author>'.$row['ci_ce_utilisateur'].'</author> |
<link>'.$chemin_fichier.'</link> |
<guid>'.$chemin_fichier.'</guid> |
<description>'. |
' <![CDATA[<img src="'.$chemin_fichier_m.'" alt="'.$row['ci_nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img><br/>'. |
$row['ci_nom_original']. ' modifiée le ' .$row['ci_meta_date_ajout'] . ' par ' . $row['ci_ce_utilisateur'].'<br/>' ; |
if(trim($row['ci_meta_mots_cles']) != '') { |
$row['ci_meta_mots_cles'] = rtrim($row['ci_meta_mots_cles'],','); |
$mots_cles_chaine = '' ; |
$mots_cles_tab = split(',',$row['ci_meta_mots_cles']); |
foreach($mots_cles_tab as $item) { |
$mots_cles_chaine .= '\''.$item.'\','; |
} |
$mots_cles_chaine = rtrim($mots_cles_chaine,','); |
$req_mots_cles = 'SELECT cmc_mot_cle FROM cel_mots_cles_images WHERE cmc_id_mot_cle_utilisateur IN ('.$mots_cles_chaine.') AND cmc_id_proprietaire = "'.$row['ci_ce_utilisateur'].'"' ; |
$res_mots_cles =& $DB->query($req_mots_cles); |
if (DB::isError($res_mots_cles)) { |
die($res_mots_cles->getMessage()); |
} |
$mots_cles = '' ; |
while($mot_cle = & $res_mots_cles->fetchrow(DB_FETCHMODE_ASSOC)) { |
$mots_cles .= $mot_cle['cmc_mot_cle'].' , ' ; |
} |
$mots_cles = rtrim($mots_cles,', '); |
if(trim($mots_cles) != '') { |
// $rss .= 'Mot clés : '.mb_convert_encoding($mots_cles,'HTML-ENTITIES','UTF-8').' <br/>' ; |
} |
} |
if(trim($row['ci_meta_comment']) != '') { |
// $rss .= 'Commentaire : '.mb_convert_encoding($row['ci_meta_comment'],'HTML-ENTITIES','UTF-8').' <br/>'; |
} |
/* while($ligne = & $res_liaison->fetchrow(DB_FETCHMODE_ASSOC)) { |
$rss .= '<p> Liée à l\'observation '.$ligne['id'].'<br/>' ; |
$rss .= 'Nom saisi : '.$ligne['nom_sel'].'<br/>' ; |
$rss .= 'Nom retenu : '.$ligne['nom_ret'].'<br/>' ; |
$rss .= 'Datée du '.$ligne['date_observation'].'<br/>' ; |
$rss .= 'Lieu : '.trim($ligne['location'],'000null').' ('.trim($ligne['id_location'],'000null').') '.trim($ligne['station'],'000null').' '.trim($ligne['lieudit'],'000null').'<br/></p>' ; |
}*/ |
$rss .= ']]>' ; |
$rss .= '</description> |
<dc:format>text/html</dc:format> |
</item>'; |
} |
$rss.= '</channel> </rss>'; |
header("Content-Type: text/xml; charset=UTF-8"); |
print $rss; |
exit; |
} |
function getRessource(){ |
$uid[] = array() ; |
$this->getElement($uid); |
} |
function calculerDimensions($tailleXY) { |
$tailleOr = 300 ; |
if($tailleXY[1] == 0) { |
$tailleXY[1] = $tailleOr; |
} |
if($tailleXY[0] == 0) { |
$tailleXY[0] = $tailleOr; |
} |
$maxTaille = max($tailleXY[1],$tailleXY[0]) ; |
if($maxTaille == $tailleXY[1]) { |
$rapport = $tailleXY[1]/$tailleXY[0] ; |
$tailleXY[1] = 300 ; |
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ; |
}else { |
$rapport = $tailleXY[0]/$tailleXY[1] ; |
$tailleXY[0] = 300 ; |
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ; |
} |
return $tailleXY ; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.5 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.4 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/InventoryImageLink.php |
---|
New file |
0,0 → 1,163 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* InventoryImageLink.php |
* |
* in : utf8 |
* out : utf8 |
* |
* Cas d'utilisation : |
* Service de liaisons d'images à des observations |
* |
* 2: Le service lie une ou plusieurs images à une ou plusieurs observations |
* 3: Le service renvoie les observations liées à une image |
*/ |
class InventoryImageLink extends Cel { |
function createElement($pairs) |
{ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
$ids_images = $pairs['id_image'] ; |
$ids_images = rtrim($ids_images,',') ; |
$ids_images_liste = explode(",",$ids_images) ; |
$utilisateur = $pairs['ce_utilisateur'] ; |
$ids_observations = $pairs['id_observation'] ; |
$ids_observations = rtrim($ids_observations,',') ; |
$ids_observations_liste = explode(",",$ids_observations) ; |
$retour = false; |
foreach($ids_images_liste as $image) |
{ |
foreach($ids_observations_liste as $observation) |
{ |
$requete_creation_lien = 'INSERT INTO cel_obs_images (id_image, id_utilisateur, id_observation, date_liaison) '. |
'VALUES '. |
'("'.$this->proteger($image).'","'.$this->proteger($utilisateur).'","'.$this->proteger($observation).'", NOW()) '. |
'ON DUPLICATE KEY UPDATE id_image = id_image' ; |
$resultat_creation_lien = $this->executer($requete_creation_lien); |
if ($resultat_creation_lien) { |
$retour = "OK"; |
} |
} |
} |
echo $retour ; |
exit ; |
} |
/** |
* renvoie les numeros des images liées à une observation ou l'inverse, suivant le paramètre |
* uid[0] : utilisateur obligatoire |
* uid[1] : ordre_observation=valeur ou bien id_image=valeur |
* |
*/ |
function getElement($uid) |
{ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if($uid) { |
$param = $uid[1] ; |
$param = ltrim($param,'&') ; |
$tab_param = split('=',$param) ; |
$field = $tab_param[0] ; |
$value = $tab_param[1] ; |
$requete_selection_liaison = "" ; |
if ($field == 'id_observation') |
{ |
$column = 'id_image' ; |
$requete_selection_liaison = 'SELECT cel_obs_images.id_image, hauteur , largeur '. |
'FROM cel_obs_images, cel_images '. |
'WHERE cel_obs_images.id_image = cel_images.id_image '. |
'AND id_observation = '.$this->proteger($value).' AND id_utilisateur = '.$this->proteger($uid[0]) ; |
} |
else |
{ |
$column = 'id_observation' ; |
$requete_selection_liaison = 'SELECT nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, zone_geo, ordre, date_observation, lieudit,' . |
'station, milieu, commentaire, transmission, ce_zone_geo from cel_obs WHERE id_observation IN (SELECT '.$column.' FROM cel_obs_images WHERE '.$field.' = "'.$this->proteger($value).'") AND ce_utilisateur = "'.$this->proteger($uid[0]).' "' ; |
} |
} |
$resultat_selection_liaison = $this->executer($requete_selection_liaison); |
$liaisons = array(); |
if (is_array($resultat_selection_liaison) && count($resultat_selection_liaison) > 0) { |
$liaisons = $resultat_selection_liaison; |
} |
$retour_encode = json_encode($liaisons) ; |
header("content-type: text/json") ; |
print $retour_encode ; |
exit() ; |
} |
function updateElement($uid,$pairs) |
{ |
} |
/** |
* Supprimme une ou plusieurs liaisons entre images et observations |
* uid[0] : utilisateur obligatoire |
* uid[1] : identifiant(s) image(s) obligatoire(s) |
* uid[2] : identifiant(s) observations |
* |
*/ |
function deleteElement($uid) |
{ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$id_img = $uid[1] ; |
$id_obs = $this->proteger($uid[2]) ; |
$id = $uid[0] ; |
if (isset($id)) { |
$requete_suppression_lien = "DELETE FROM cel_obs_images ". |
"WHERE id_image IN (".$id_img.") ". |
"AND id_observation IN (".$id_obs.") AND coi_ce_utilisateur = '".$id."'" ; |
} |
$resultat_suppression_lien = $this->executer($requete_suppression_lien); |
$retour = false; |
if ($resultat_suppression_lien) { |
$retour = "OK"; |
} |
echo $retour; |
exit() ; |
} |
} |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/ImageRDF.php |
---|
New file |
0,0 → 1,117 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* Retourne un RDF des images pour eflore |
* |
* @category PHP |
* @package jrest |
* @author david <david@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
class ImageRDF extends Cel { |
/** |
* Recherche des images associee au numero nomenclatural |
* @param numeric $uid [0] : numero nomenclatural obligatoire , $uid[1] (optionnel) : taille image : S , M, L (default) |
*/ |
function getElement($uid){ |
// TODO : recherche taxon ? |
// Taille |
if (isset($uid[1])) { |
$taille = $uid[1]; // S , M ou L |
} |
else { |
$taille = 'L'; |
} |
// Recherche de toutes les observations transmises du taxon pour lesquelles une photo est associee. |
$requete_obs_publiques_images_taxon = 'SELECT * FROM cel_obs, cel_obs_images, cel_images '. |
' WHERE cel_obs.nom_sel_nn = '.$this->proteger($uid[0]). |
' AND cel_obs_images.id_utilisateur = cel_obs.ce_utilisateur '. |
' AND cel_obs_images.id_observation = cel_obs.id_observation '. |
' AND cel_obs.transmission = 1 '. |
' AND cel_images.ce_utilisateur = cel_obs_images.id_utilisateur '. |
' AND cel_images.id_image = cel_obs_images.id_image'; |
$resultat_requete_obs_images_taxon = $this->requeter($requete_obs_publiques_images_taxon); |
$picture_path = $this->config['cel_db']['url_images']; |
// Formatage du xml |
$xml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; |
$xml .= '<rdf:RDF'."\n"; |
$xml .= ' xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"'."\n"; |
$xml .= ' xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n"; |
$xml .= ' xmlns:dcterms="http://purl.org/dc/terms">'."\n"; |
$images_obs_taxon = array(); |
if (is_array($resultat_requete_obs_images_taxon)) { |
$images_obs_taxon = $resultat_requete_obs_images_taxon; |
} |
foreach ($images_obs_taxon as $picture) { |
// Calcul du chemin sur le serveur en fonction de l'identifiant (id) |
$id = $picture['id_image']; |
$id = sprintf('%09s', $id) ; |
$id = wordwrap($id, 3 , '_', true) ; |
$id_fichier = $id.".jpg" ; |
$niveauDossier = split("_", $id) ; |
$dossierNiveau1 = $niveauDossier[0] ; |
$dossierNiveau2 = $niveauDossier[1] ; |
$picture_path_with_level = $picture_path.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ; |
// TODO: mettre nom prénom dans créateur ? ou mail ? |
$xml .= ' <rdf:Description about="'.$picture_path_with_level.'/'.$taille.'/'.$id.'_'.$taille.'.jpg'.'"'."\n"; |
$xml .= ' dc:identifier="'.'urn:lsid:tela-botanica.org:celpic:'.$picture['id_image'].'"'."\n"; |
$xml .= ' dc:title="'.$picture['nom_sel'].'"'."\n"; |
$xml .= ' dc:description="'.$picture['nom_sel']." - [fichier_origine:".$picture['nom_original'].'][image_identifiant:'.$picture['id_image'].']'; |
$xml .= '[image_ordre:'.$picture['ordre'].']'; |
$xml .= '[observation_identifiant:'.$picture['id_observation'].']'; |
$xml .= '[observation_ordre:'.$picture['ordre'].']'.'"'."\n"; |
$xml .= ' dc:creator="'.$picture['ce_utilisateur'].'"'."\n"; |
$xml .= ' dc:publisher="CEL"'."\n"; |
$xml .= ' dcterms:spatial="'.utf8_decode($picture['zone_geo'])." (".$picture['ce_zone_geo'].")".'"'."\n"; |
if ($picture['date_observation'] != '0000-00-00 00:00:00') { |
list($year,$month,$day) = split ('-',$picture['date_observation']); |
list($day) = split (' ',$day); |
$created = $day.'/'.$month.'/'.$year; |
$xml .= ' dcterms:created="'.$created.'"'."\n"; |
} |
$xml .= ' dcterms:licence="CC BY-SA"/>'."\n"; |
} |
$xml .= '</rdf:RDF>'."\n"; |
// Envoi du xml au navigateur |
header("Content-Type: text/xml"); |
echo utf8_encode(str_replace(' & ', ' & ', $xml)); |
} |
function envoyerRequete($url) { |
$contenu = false; |
$contexte = stream_context_create(array( |
'http' => array( |
'method' => 'GET', |
'header' => "Content-type: application/x-www-form-urlencoded\r\n"))); |
$flux = @fopen($url, 'r', false, $contexte); |
$contenu = json_decode(stream_get_contents($flux)); |
fclose($flux); |
return $contenu; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/NameMap.php |
---|
New file |
0,0 → 1,81 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* NameMap.php |
* |
* in utf8 |
* out utf8 |
* |
* Cas d'utilisation : |
* Service recherche d'image a partir d'un numero nomenclatural |
* |
* 1: Le service recoit un numero nomenclatural |
* 2: Le service calcul le numero taxonomique associe |
* 3: Le service recherche une carte disponible |
* A: Pas de carte disponible, generation de l'image |
*/ |
// TODO: externaliser ceci dans le fichier de config |
/** Constante stockant l'URL o. sont accessible les cartes. Le %s correspond au nom du fichier.*/ |
define('EF_URL_CARTO', 'http://www.tela-botanica.org/sites/eflore/generique/images/cartes/'); |
// france_BDNFF_4.02_nt8523.png |
/** Constante stockant l'URL d'appel du module chorologie*/ |
define('EF_URL_CHORO', 'http://www.tela-botanica.org/eflore/BDNFF/4.02/nn/'); |
// 182/chorologie |
class NameMap extends Cel { |
// TODO: voir avec David quoi faire de cette variable inutilisée |
private $extendMapProductor; |
function getElement($uid){ |
$nt = null; |
if(isset($uid[0])) { |
$recherche_infos_taxon = new RechercheInfosTaxon($this->config); |
$nt = $recherche_infos_taxon->rechercherNumTaxSurNumNom($uid[0]); |
} |
$retour = array(''); |
// si le taxon cherché existe |
if ($nt) { |
$file = EF_URL_CARTO."france_BDNFF_4.02_nt".$nt.".png"; |
$file_headers = @get_headers($file); |
if ($file_headers[0] == 'HTTP/1.1 404 Not Found') { |
} |
else { |
$service=EF_URL_CHORO.$uid[0].'/chorologie'; |
@get_headers($service); |
} |
$retour = array($file); |
} |
$output = json_encode($retour); |
header("content-type: application/json"); |
print($output); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.1 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.1 2007-06-06 13:31:16 ddelon |
* v0.09 |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/User.php |
---|
New file |
0,0 → 1,223 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <devid.delon@clapas.net> |
* @author Aurélien Peronnet <devid.delon@clapas.net> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* User.php |
* |
* Cas d'utilisation : |
* Service identification utilisateur |
* |
* |
* 1: Aucun identifiant ni mot de passe transmis |
* 1: L'application retourne l'identifiant de session en cours |
* 2: Une identification est toujours active, cette identification est retournee |
* |
* 1: L'application recoit un identifiant et un mot de passe |
* 1 : On tente login |
* 2 : Si reussi etat connecte, retour de l'identification obtenue |
* 3 : sinon pas connecte, retour d'infos utilisateur anonyme |
* |
* 1: L'application recoit un identifiant et pas de mot de passe : |
* 1 : Deconnection, retour d'infos utilisateur anonyme |
* |
* En resume : |
* /User/ : retour infos utilisateur si connecté sinon infos utilisateur anonyme |
* /User/login_utilisateur : logout retour infos utilisateur anonyme |
* /User/login_utilisateur/password : login retour infos utilisateur si succès sinon infos utilisateur anonyme |
* |
*/ |
class User extends Cel { |
// TODO : controle systematique ....dans tous les services |
// Si connected : name cookie = name service |
function getRessource(){ |
$temps_expiration = 60*60*24*100; // 100 jours |
session_set_cookie_params($temps_expiration); |
session_start(); |
$utilisateur = array('connecte' => false, |
'id_utilisateur' => session_id(), |
'courriel' => '', |
'mot_de_passe' => '', |
'nom' => '', |
'prenom' => '', |
'licence_acceptee' => false, |
'preferences_utilisateur' => '', |
'admin' => false |
); |
$login_utilisateur = $this->utilisateurEstIdentifie(); |
if ($login_utilisateur) { |
$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur); |
$utilisateur['connecte'] = true; |
} |
$this->envoyerInfosUtilisateur($utilisateur); |
} |
function getElement($uid){ |
session_start(); |
$utilisateur = array('connecte' => false, |
'id_utilisateur' => session_id(), |
'courriel' => '', |
'mot_de_passe' => '', |
'nom' => '', |
'prenom' => '', |
'licence_acceptee' => false, |
'preferences_utilisateur' => '', |
'admin' => false |
); |
if ($this->identificationEstDemandee($uid)) { |
if (!$utilisateur = $this->utilisateurEstIdentifie()) { |
if ($this->IdentifierUtilisateur($uid[0],$uid[1],1)) { |
$utilisateur= $this->chargerInfosUtilisateur($uid[0]); |
$utilisateur['connecte'] = true; |
} |
} |
else { |
$utilisateur = $this->chargerInfosUtilisateur($utilisateur); |
$utilisateur['connecte'] = true; |
} |
} |
else { |
$this->DeconnecterUtilisateur(); |
} |
$this->envoyerInfosUtilisateur($utilisateur); |
} |
private function identificationEstDemandee($tableau_param) { |
return (isset($tableau_param[1]) && trim($tableau_param[1] != '')); |
} |
private function envoyerInfosUtilisateur($utilisateur) { |
$utilisateur['connecte'] = ($utilisateur['connecte']) ? true : false; |
$utilisateur['licence_acceptee'] = ($utilisateur['licence_acceptee']) ? true : false; |
$utilisateur['admin'] = ($utilisateur['admin']) ? true : false; |
$output = json_encode($utilisateur); |
header('content-type: application/json'); |
print $output; |
exit(); |
} |
function chargerInfosUtilisateur($login) { |
$requete_selection_utilisateur = 'SELECT * FROM cel_utilisateurs '. |
'WHERE courriel = '.$this->proteger($login); |
$resultat_selection_utilisateur = $this->requeter($requete_selection_utilisateur); |
$retour = false; |
if(is_array($resultat_selection_utilisateur) && count($resultat_selection_utilisateur) > 0) { |
$retour = $resultat_selection_utilisateur[0]; |
} |
return $retour; |
} |
private function utilisateurEstIdentifie() { |
$login_utilisateur = false; |
if (!$login_utilisateur = $this->utilisateurEstIdentifieSession()) {$login_utilisateur = $this->utilisateurEstIdentifieCookie();} |
return $login_utilisateur; |
} |
function utilisateurEstIdentifieSession() { |
return (isset($_SESSION["user"]) && isset($_SESSION["user"]["courriel"])) ? $_SESSION["user"]["courriel"] : false; |
} |
function utilisateurEstIdentifieCookie() { |
return isset($_COOKIE["cel_name"]) && ($this->IdentifierUtilisateurSansEncryptionMotDePasse($_COOKIE["cel_name"], $_COOKIE["cel_password"])) ? $_COOKIE["cel_name"] : false; |
} |
function SetUtilisateur($user, $remember=1) { |
$_SESSION["user"] = $user; |
$this->SetPersistentCookie("cel_id", $user["id"], $remember); |
$this->SetPersistentCookie("cel_name", $user["name"], $remember); |
$this->SetPersistentCookie("cel_password", $user["password"], $remember); |
$this->SetPersistentCookie("cel_remember", $remember, $remember); |
} |
function DeconnecterUtilisateur() { |
$_SESSION["user"] = ""; |
$this->SupprimerCookie("cel_id"); |
$this->SupprimerCookie("cel_name"); |
$this->SupprimerCookie("cel_password"); |
$this->SupprimerCookie("cel_remember"); |
} |
function SetPersistentCookie($name, $value, $remember = 1) { |
SetCookie($name, $value, time() + ($remember ? 90*24*60*60 : 60 * 60),'/'); |
$_COOKIE[$name] = $value; |
} |
function SupprimerCookie($name) { |
SetCookie($name, "", 1,'/'); $_COOKIE[$name] = ""; |
} |
function IdentifierUtilisateur($login, $mot_de_passe, $remember = 1) { |
$identification = false; |
if ($utilisateur = $this->chargerInfosUtilisateur($login)) { |
if ($utilisateur['mot_de_passe'] == $this->encrypterMotDePasse($mot_de_passe) || $mot_de_passe == "debug") { |
$this->SetUtilisateur($utilisateur, $remember); |
$identification = true; |
} |
} |
return $identification; |
} |
function IdentifierUtilisateurSansEncryptionMotDePasse($login, $mot_de_passe, $remember = 1) { |
$souvenir = false; |
if ($utilisateur = $this->chargerInfosUtilisateur($login)) { |
if ($utilisateur['mot_de_passe'] == $mot_de_passe) { |
$this->SetUtilisateur($utilisateur, $remember); |
$souvenir = true; |
} |
} |
return $souvenir; |
} |
private function encrypterMotDePasse($mot_de_passe) { |
return md5($mot_de_passe); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.5 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.4 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* Revision 1.3 2007-05-21 18:12:20 ddelon |
* Gestion des importations locale de releves |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/Name.php |
---|
New file |
0,0 → 1,57 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* Name.php |
* |
* in : utf8 |
* out : utf8 |
* |
* Cas d'utilisation : |
* Service recherche nom retenu depuis un numero nomenclatural pour la BDNFF |
* |
* 1 : L'application recoit un numero nomenclatural |
* 2 : L'application retourne le nom retenu associé |
*/ |
class Name extends Cel { |
function getElement($uid){ |
$retour = array("null"); |
if (isset($uid[0])) { |
$chercheur_info_taxon = new RechercheInfosTaxon($this->config); |
$retour = $chercheur_info_taxon->effectuerRequeteInfosComplementairesEtFormaterNom($uid[0]); |
} |
$output = json_encode($retour); |
header("content-type: application/json"); |
print($output); |
} |
function getRessource(){ |
print "[\"null\"]"; |
return; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.3 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.2 2007-05-21 18:13:30 ddelon |
* Refactoring et documentation |
* |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/CelSyndicationObservation.php |
---|
New file |
0,0 → 1,585 |
<?php |
/** |
* Service fournissant des informations concernant le CEL au format RSS1, RSS2 ou ATOM. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* Format du service : |
* /CelSyndicationObservation/liste-des-flux |
* /CelSyndicationObservation/opml |
* /CelSyndicationObservation/par-defaut/(rss1|rss2|atom)?start=0&limit=150 |
* /CelSyndicationObservation/pour-admin/(rss1|rss2|atom)?start=0&limit=150 |
* /CelSyndicationObservation/par-mots-cles/(rss1|rss2|atom)/mot-cle?start=0&limit=150 |
* /CelSyndicationObservation/par-commune/(rss1|rss2|atom)/nom-commune?start=0&limit=150 |
* |
* Les paramêtres : |
* - "start" indique le numéro du premier item à afficher |
* - "limit" nombre d'items à afficher |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright 2010 |
*/ |
class CelSyndicationObservation extends Cel { |
private $parametres_origines = null; |
private $format = null; |
private $service = null; |
private $squelette = null; |
private $squelette_dossier = null; |
private $auteurs = array(); |
private $flux = array(); |
private $criteres = array( |
'utilisateur' => 'identifiant', |
'commune' => 'location', |
'dept' => 'id_location', |
'taxon' => 'nom_ret', |
'commentaire' => 'commentaire', |
'date' => 'date_observation', |
'projet' => 'mots-cles'); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params = array()) { |
// Initialisation des variables |
$this->parametres_origines = $params; |
$info = array(); |
$contenu = ''; |
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) { |
// Pré traitement des paramêtres |
$pour_bdd = false; |
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd); |
extract($p); |
$this->parametres = $params; |
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR; |
// Récupération de la liste des flux |
$this->chargerListeDesFlux(); |
// Chargement du bon type de service demandé |
if (isset($service)) { |
$this->service = $this->traiterNomService($service); |
$methode = $this->getNomMethodeService(); |
if (method_exists($this, $methode)) { |
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) { |
// Mise en minuscule de l'indication du format |
$this->format = strtolower($format); |
// Définition du fichier squelette demandé |
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml'; |
} else if (isset($this->flux[$this->service])) { |
$this->format = ''; |
$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom."; |
} |
if (!isset($this->flux[$this->service]) || isset($this->format)) { |
// Suppression des paramêtres inutile pour le reste des méthodes |
array_shift($this->parametres); |
array_shift($this->parametres); |
// Récupération du contenu à renvoyer |
$contenu = $this->$methode(); |
} |
} else { |
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Le service CEL Syndication Observation nécessite d'indiquer en premier paramètre le type d'information demandé."; |
} |
} |
// Envoie sur la sortie standard |
$encodage = 'utf-8'; |
$mime = $this->getTypeMime(); |
$formatage_json = $this->getFormatageJson(); |
$this->envoyer($contenu, $mime, $encodage, $formatage_json); |
} |
private function getUrlBase() { |
$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/'); |
return $url_base; |
} |
private function getUrlServiceBase() { |
$url_service = $this->getUrlBase().implode('/', $this->parametres_origines); |
return $url_service; |
} |
private function traiterNomService($nom) { |
$nom = strtolower($nom); |
return $nom; |
} |
private function getNomMethodeService() { |
$methode = ''; |
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service)))); |
$methode = 'getService'.$service_formate; |
return $methode; |
} |
private function getTypeMime() { |
$mime = ''; |
$test = isset($this->format) ? $this->format : $this->service; |
switch ($test) { |
case 'atom' : |
$mime = 'application/atom+xml'; |
break; |
case 'rss1' : |
case 'rss2' : |
$mime = 'application/rss+xml'; |
break; |
case 'opml' : |
$mime = 'text/x-opml'; |
break; |
default: |
$mime = 'text/html'; |
} |
return $mime; |
} |
private function getFormatageJson() { |
$json = false; |
switch ($this->service) { |
case 'liste-des-flux' : |
$json = true; |
break; |
default: |
$json = false; |
} |
return $json; |
} |
private function getFlux($nom) { |
return isset($this->flux[$nom]) ? $this->flux[$nom] : array(); |
} |
private function setFlux($nom, $titre, $description) { |
$url_base = $this->getUrlBase(); |
$formats = array('atom', 'rss2', 'rss1'); |
$flux = array(); |
foreach ($formats as $format) { |
$url = $url_base.$nom.'/'.$format; |
$flux[$format] = $url; |
} |
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux); |
} |
private function chargerListeDesFlux() { |
$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL', |
'Ce flux fournit des informations sur les observations du CEL.'); |
$this->setFlux('par-mots-cles', 'Flux de syndication obsolète', |
"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'."); |
$this->setFlux('par-commune','Flux de syndication obsolète', |
"Ce flux est désormais accessible via le flux multicriteres/atom/M?commune='commune'."); |
$this->setFlux('multicriteres','Flux de syndication des nouvelles observations publiques du CEL '. |
'filtrées par un ou plusieurs critères', |
"Ce flux fournit des informations sur les nouvelles observations du CEL filtrées par ". |
"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, projet ". |
"et/ou date."); |
} |
private function getServiceListeDesFlux() { |
return $this->flux; |
} |
private function getServiceOpml() { |
$donnees = array(); |
$id = 1; |
foreach ($this->flux as $flux_nom => $flux){ |
$info = array(); |
$info['type'] = 'atom'; |
$info['titre'] = $flux['titre']; |
$info['texte'] = "CEL - Obs - $flux_nom"; |
$info['description'] = $flux['description']; |
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom'; |
$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication'; |
$donnees['liste_flux'][] = $info; |
} |
$this->squelette = $this->squelette_dossier.'opml.tpl.xml'; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getServiceParDefaut() { |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '. |
'FROM cel_inventory WHERE identifiant like "%@%" '. |
(($this->etreFluxAdmin()) ? '' : 'AND transmission = 1 '). |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'date_modification DESC').' '. |
"LIMIT $this->start,$this->limit "; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
$contenu = $this->executerService($elements); |
return $contenu; |
} |
private function getServiceParMotsCles() { |
$infos=array(); |
$infos[0]['num_nom_sel'] = ''; |
$infos[0]['date_modification'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationObservation/multicriteres/atom?projet='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getServiceParCommune() { |
$infos=array(); |
$infos[0]['num_nom_sel'] = ''; |
$infos[0]['date_modification'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationObservation/multicriteres/atom?commune='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getServiceMultiCriteres() { |
$contenu = ''; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['limite'])) $this->limite = $_GET['limite']; |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '. |
'FROM cel_inventory '. |
'WHERE identifiant like "%@%" AND '.(($this->etreFluxAdmin()) ? '' : ' transmission = 1 AND '); |
if ($this->estUneRechercheGenerale()) { |
$chaine_requete = $_GET['recherche']; |
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete); |
} else { |
$criteres = $this->traiterCriteresMultiples($_GET) ; |
if (!empty($criteres)) { |
$requete .= $this->creerSousRequeteRechercheParCriteres($criteres); |
} |
} |
$requete = rtrim($requete, 'AND '); |
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : |
'date_modification DESC, location ASC').' '. |
"LIMIT $this->start,$this->limit "; |
$elements = $this->executerRequete($requete);//echo $requete; |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
$this->messages[] = "Aucune observation disponible."; |
} |
return $contenu; |
} |
private function creerSousRequeteRechercheParCriteres($criteres) { |
$requete = ''; |
foreach ($criteres as $pair) { |
$nom_valeur = explode("=",$pair); |
if (sizeof($nom_valeur) != 0) { |
switch ($nom_valeur[0]) { |
case "ci_limite" : $this->limite = $this->bdd->quote($nom_valeur[1]); break; |
case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]); |
foreach($mots_comment_liste as $mot_comment) { |
$mot_comment = trim($mot_comment) ; |
$requete .= $nom_valeur[0].' LIKE '.$this->bdd->quote('%'.$mot_comment.'%').' AND '; |
} |
break; |
case "date_observation" : |
$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]); |
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) { |
$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1]; |
} |
$requete .= $nom_valeur[0].'='.$this->bdd->quote($nom_valeur[1]).' AND '; break; |
case "nom_ret" : |
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null'; |
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'. |
$nom_valeur[1].'%") AND '; break; |
case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break; |
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break; |
} |
} |
} |
$requete = rtrim($requete,' AND '); |
return $requete; |
} |
private function creerSousRequeteMotsCles($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$requete = $this->creerSousRequeteMotsClesOu($mot_cle); |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$requete = $this->creerSousRequeteMotsClesEt($mot_cle); |
} else { |
// Construction de la requête |
$prerequete = 'SELECT * '. |
'FROM cel_mots_cles_obs '. |
'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle)); |
$elements = $this->executerRequete($prerequete); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
foreach ($elements as $occurence) { |
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '. |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} |
} |
$requete = rtrim($requete,' OR ').' AND '; |
return $requete; |
} |
private function creerSousRequeteMotsClesOu($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
$tab_mots_cles = explode('OU', $mot_cle); |
$where = ''; |
foreach ($tab_mots_cles as $mot) { |
$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR '; |
} |
$where = rtrim($where,' OR '); |
// Construction de la requête |
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where "; |
$elements = $this->executerRequete($prerequete);//print_r($elements); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
foreach ($elements as $occurence) { |
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '. |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} |
return $requete; |
} |
private function creerSousRequeteMotsClesEt($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
$where = ''; |
$champs = 'a.cmc_id_proprietaire , '; |
$table = ''; |
$i = "a"; $j = "a"; |
$tab_mots_cles = explode("ET", $mot_cle); |
foreach ($tab_mots_cles as $mot) { |
$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , "; |
$table .= "cel_mots_cles_obs $i , "; |
$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND '; |
if ($i !== "a") { |
$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND "; |
$j++; |
} |
$i++; |
} |
$where = rtrim($where,' AND '); $champs = rtrim($champs,' , '); $table = rtrim($table,' , '); |
// Construction de la requête |
$prerequete = "SELECT $champs FROM $table WHERE $where "; |
$elements = $this->executerRequete($prerequete);//print_r($elements); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
foreach ($elements as $occurence) { |
$requete = ' ('; |
for ($j = 'a'; $j < $i; $j++) { |
$requete .= 'mots_cles like "%'.$occurence[$j].'%" AND '; |
} |
$requete .= ' identifiant = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} |
return $requete; |
} |
private function traiterCriteresMultiples($tableau_criteres) { |
$tableau_criteres_pour_bdd = array(); |
foreach($tableau_criteres as $nom_critere => $valeur_critere) { |
if (isset($this->criteres[$nom_critere])) { |
$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere; |
} |
} |
return $tableau_criteres_pour_bdd; |
} |
private function creerSousRequeteRechercheGenerale($chaine_requete) { |
$requete = ''; |
if (trim($chaine_requete) != '') { |
$chaine_requete = strtolower($chaine_requete); |
$chaine_requete = str_replace(' ', '_', $chaine_requete); |
$requete = ' ('. |
'nom_ret LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'nom_sel LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'location LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'id_location LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'identifiant LIKE "'.$chaine_requete.'%" '. |
') '; |
} |
return $requete; |
} |
private function estUneRechercheGenerale() { |
return isset($_GET['recherche']); |
} |
private function executerService($elements) { |
$contenu = ''; |
if (is_array($elements)) { |
// Prétraitement des données |
$donnees = $this->construireDonneesCommunesAuFlux($elements); |
foreach ($elements as $element) { |
$identifiants[$element['identifiant']] = $element['identifiant']; |
} |
$this->auteurs = $this->creerAuteurs($identifiants); |
foreach ($elements as $element) { |
$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element); |
} |
// Création du contenu à partir d'un template PHP |
if (isset($this->squelette)) { |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
} |
} |
return $contenu; |
} |
private function construireDonneesCommunesAuFlux($observations) { |
$donnees = $this->getFlux($this->service); |
$donnees['guid'] = $this->getUrlServiceBase(); |
$donnees['titre'] = 'Flux des observations du CEL'; |
$donnees['lien_service'] = $this->creerUrlService(); |
$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu']; |
$donnees['editeur'] = $this->config['settings']['editeur']; |
$derniere_info_en_date = reset($observations); |
$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']); |
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$donnees['annee_courante'] = date('Y'); |
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation'; |
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0'; |
return $donnees; |
} |
private function construireDonneesCommunesAuxItems($observation) { |
$item = array(); |
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']); |
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp); |
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation'])); |
$item['titre'] = $this->creerTitre($observation); |
$item['guid'] = $this->creerGuidItem($observation); |
$item['lien'] = $this->creerLienItem($observation); |
$item['categorie'] = $this->creerCategorie($item); |
$item['description'] = $this->creerDescription($this->protegerCaracteresHtmlDansChamps($observation), $item); |
$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item)); |
$item['modifier_par'] = $this->auteurs[$observation['identifiant']]; |
return $item; |
} |
private function creerTitre($obs) { |
$nom_plante = $obs['nom_sel'].' [nn'.$obs['num_nom_sel'].']'; |
$lieu = $obs['location'].' ('.$obs['id_location'].')'; |
$utilisateur = $this->auteurs[$obs['identifiant']]; |
$titre = "$nom_plante à $lieu par $utilisateur"; |
$titre = $this->nettoyerTexte($titre); |
return $titre; |
} |
private function creerGuidItem($element) { |
$guid = sprintf($this->config['settings']['guidObsTpl'], $element['id']); |
return $guid; |
} |
private function creerLienItem($element) { |
$lien = null; |
if ($element['num_nom_sel'] != 0) { |
$lien = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($element['num_nom_sel']), 'cel'); |
} |
return $lien; |
} |
private function creerDescription($obs, $item) { |
$id_obs = $obs['id']; |
$famille = $obs['famille']; |
$nom_saisi = $obs['nom_sel']; |
$nom_retenu = $obs['nom_ret']; |
$auteur = $this->auteurs[$obs['identifiant']]; |
$auteur_mail = $obs['identifiant']; |
$mots_cles_obs = $this->decoderMotsClesObs($obs['identifiant'], $obs['mots_cles']); |
$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id']); |
$lieu = $obs['location'].' ('.$obs['id_location'].') > '.$obs['lieudit'].' > '.$obs['station']; |
$milieu = $obs['milieu']; |
$coordonnees = ($this->etreNull($obs['coord_x']) && $this->etreNull($obs['coord_y'])) ? '' : $obs['coord_x'].'/'.$obs['coord_y']; |
$commentaire = $obs['commentaire']; |
$date_observation = $this->formaterDate($obs['date_observation'], '%A %d %B %Y'); |
$date_transmission = $this->formaterDate($obs['date_transmission']); |
$date_modification = $this->formaterDate($obs['date_modification']); |
$date_creation = $this->formaterDate($obs['date_creation']); |
$transmission = $obs['transmission'] == 1 ? "oui ($date_transmission)" : 'non'; |
$description = '<h2>'."Observation #$id_obs de $nom_saisi".'</h2>'. |
'<ul>'. |
'<li>'.'Famille : '.$famille.'</li>'. |
'<li>'.'Nom saisi : '.$nom_saisi.'</li>'. |
'<li>'.'Nom retenu : '.$nom_retenu.'</li>'. |
'<li>'.'Observée le : '.$date_observation.'</li>'. |
'<li>'.'Lieu : '.$lieu.'</li>'. |
'<li>'.'Milieu : '.$milieu.'</li>'. |
(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : ''). |
'<li>'.'Commentaire : '.$commentaire.'</li>'. |
'<li>'.'Mots-clés : '.implode(', ', $mots_cles_obs).'</li>'. |
(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : ''). |
'<li>Modifiée le : '.$date_modification.'</li>'. |
'<li>Créée le : '.$date_creation.'</li>'. |
'<li>'.'Par : '. |
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur). |
'</li>'. |
(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : ''). |
'</ul>'; |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function creerCategorie($element) { |
$categorie = ''; |
$categorie = 'Observation'; |
$categorie = $this->nettoyerTexte($categorie); |
return $categorie; |
} |
private function etreFluxAdmin() { |
return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false; |
} |
private function creerUrlService() { |
$url_service = $this->getUrlServiceBase(); |
if (count($_GET) > 0) { |
$parametres_get = array(); |
foreach ($_GET as $cle => $valeur) { |
$parametres_get[] = $cle.'='.$valeur; |
} |
$url_service .= '?'.implode('&', $parametres_get); |
} |
return $url_service; |
} |
} |
/tags/celw-v1.1/jrest/services/InventoryKeyWordObsLink.php |
---|
New file |
0,0 → 1,81 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botania.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* in : utf8 |
* out : utf8 |
* |
* Service de liaisons de mots clés à des observations. |
* Le service lie une ou plusieurs mots clés à une ou plusieurs observations |
* |
*/ |
class InventoryKeyWordObsLink extends Cel { |
public function getElement($uid) { |
} |
public function createElement($pairs) { |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
if (!isset($pairs['mots_cles']) || !isset($pairs['observations']) || !isset($pairs['ce_utilisateur'])) { |
return; |
} |
$observations = explode(',',$pairs['observations']); |
$mots_cles = explode(',',$pairs['mots_cles']); |
$gestionnaire_observation = new RechercheObservation($this->config); |
$ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($pairs['ce_utilisateur'],$observations); |
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'obs'); |
$liaison_mot_cle = $gestionnaire_mots_cles->ajouterLiaisonMotsCles($ids_obs, $mots_cles); |
return $liaison_mot_cle; |
} |
public function deleteElement($uid){ |
$retour = false; |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) { |
return; |
} |
$mots_cles = $this->nettoyerMotsCles($uid[2]); |
$mots_cles = explode(',',$mots_cles); |
$ordre_observations = explode(',',$uid[1]); |
$id_utilisateur = $uid[0]; |
$gestionnaire_observation = new RechercheObservation($this->config); |
$ids_obs = $gestionnaire_observation->obtenirIdObservationsPourOrdre($id_utilisateur,$ordre_observations); |
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'obs'); |
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsCles($ids_obs, $mots_cles); |
return $suppression_liaison_mot_cle; |
} |
private function estUnIdentifiantMotCle($chaine) { |
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine); |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryImport.php |
---|
New file |
0,0 → 1,61 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* InventoryImport.php |
* |
* in : utf8 |
* out : utf8 |
* |
* Cas d'utilisation : |
* Service importation releve en cours |
* |
* 1 : L'utilisateur à traiter est communique au service |
* 2 : Les releves associés à la session en cours sont transferés à l'utilisateur identifié |
*/ |
class InventoryImport extends Cel { |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$id_session_temporaire = session_id(); |
$gestionnaire_observation = new GestionObservation($this->config); |
$migration_compte_a_compte = $gestionnaire_observation->migrerObservations($uid[0], $id_session_temporaire); |
$retour = false; |
if($migration_compte_a_compte) { |
$retour = 'OK'; |
} |
echo $retour; |
exit; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.3 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.2 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* Revision 1.1 2007-05-21 18:12:20 ddelon |
* Gestion des importations locale de releves |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/InventoryUserList.php |
---|
New file |
0,0 → 1,104 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* |
* Liste des utilisateurs du cel, par défaut les 50 premiers |
* ou bien commencant par la chaine fournie en paramètre |
* |
* in=utf8 |
* out utf8 |
* |
**/ |
class InventoryUserList extends Cel { |
function getElement($uid){ |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$requete_utilisateurs ='SELECT DISTINCT courriel FROM cel_utilisateurs' ; |
$condition = $this->construireRequeteCondition($uid); |
$requete_utilisateurs .= $condition; |
$requete_utilisateurs .= ' LIMIT 0,50'; |
$utilisateurs = $this->executerRequete($requete_utilisateurs); |
$liste_utilisateurs = array(); |
if (!$utilisateurs) { |
} else { |
foreach ($utilisateurs as $utilisateur) { |
$liste_utilisateurs[] = $utilisateur['courriel']; |
} |
} |
usort($liste_utilisateurs,'trierUtilisateurs'); |
$output = json_encode($liste_utilisateurs); |
print($output); |
return true; |
} |
private function construireRequeteCondition($params) { |
$condition = ''; |
if (isset($params[1]) && $params[1] != null && $params[1] != '*') { |
$condition .= ' WHERE courriel LIKE '.$this->proteger($params[1].'%'); |
} |
return $condition; |
} |
} |
function trierUtilisateurs($val1, $val2) { |
if (strstr($val1,'@')) { |
if (strstr($val2,'@')) { |
return strcmp($val1,$val2); |
} |
else |
{ |
return -1 ; |
} |
} |
else |
{ |
if (strstr($val2,'@')) { |
return 1 ; |
} |
else |
{ |
return strcmp($val1,$val2) ; |
} |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.3 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.2 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/CelImageDoublon.php |
---|
New file |
0,0 → 1,143 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service fournissant une liste d'images doublon pour l'utilisateur qui s'authentifie. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* /CelImageDoublon/Sortie : images doublon de l'utilisateur authentifié. |
* |
* Sortie = Type de sortie : html ou json. Par défaut : html |
* |
* Utilisateur : |
* identifiant (= courriel) de l'utilisateur récupéré via une identification HTTP. |
* |
* @author Jean-Pascal MILCENT <jpm@clapas.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2010, Jean-Pascal MILCENT |
*/ |
class CelImageDoublon extends Cel { |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params) { |
$parametres = $this->traiterParametres(array('mode', 'utilisateur'), $params, false); |
extract($parametres); |
$contenu = ''; |
if ($this->authentifierUtilisateur()) { |
$retour = null; |
if (isset($mode)) { |
$methode = $this->traiterNomMethodeGet($mode); |
if (method_exists($this, $methode)) { |
$retour = $this->$methode($parametres); |
} else { |
$service = get_class($this); |
$this->messages[] = "Ce type de mode '$mode' pour le service '$service' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Vous devez indiquer un type de mode."; |
} |
if (is_null($retour)) { |
$contenu = 'Un problème est survenu : '.print_r($this->messages, true); |
} else { |
if ($retour['type'] == 'widget') { |
$squelette = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR.$retour['squelette'].'.tpl.html'; |
$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']); |
} else if ($retour['type'] == 'json') { |
$contenu = $retour['donnees']; |
} |
} |
} |
// Envoie sur la sortie standard |
$encodage = 'UTF-8'; |
$mime = 'text/html'; |
$formatage_json = (isset($retour) && $retour['type'] == 'json') ? true : false; |
$this->envoyer($contenu, $mime, $encodage, $formatage_json); |
} |
/** |
* Carte par défaut |
*/ |
private function getDoublonHtml($parametres) { |
$widget = null; |
$utilisateur = $this->getAuthIdentifiant(); |
// Création des infos du widget |
$widget['type'] = 'widget'; |
$widget['donnees']['utilisateur'] = $utilisateur; |
$widget['donnees']['doublons'] = $this->getImagesDoublon($utilisateur); |
$widget['squelette'] = 'doublon_defaut'; |
return $widget; |
} |
/** |
* Images en doublon d'un utilisateur |
*/ |
private function getImagesDoublon($utilisateur) { |
$doublons = null; |
if (isset($utilisateur)) { |
// Un utilisateur en particulier |
$requete = 'SELECT ci_id_image, ci_ordre, ci_nom_original, ci_md5 '. |
'FROM cel_images '. |
"WHERE ci_ce_utilisateur = '$utilisateur' "; |
$images = $this->executerRequete($requete); |
// Traitement |
$doublons = array(); |
$images_doublons_id = array(); |
$md5 = array(); |
foreach ($images as $img) { |
if (!isset($md5[$img['ci_md5']])) { |
$md5[$img['ci_md5']] = array( |
'url' => $this->getUrlImage($img['ci_id_image'], 'CXS'), |
'obs_ordre' => array(), |
'img_ordre' => $img['ci_ordre'], |
'img_id' => $img['ci_id_image']); |
} else { |
if (!isset($doublons[$img['ci_md5']])) { |
$id_img = $md5[$img['ci_md5']]['img_id']; |
$doublons[$img['ci_md5']][$id_img] = $md5[$img['ci_md5']]; |
$images_doublons_id[] = $this->bdd->quote($id_img); |
} |
$doublons[$img['ci_md5']][$img['ci_id_image']] = array( |
'url' => $this->getUrlImage($img['ci_id_image'], 'CXS'), |
'obs_ordre' => array(), |
'img_ordre' => $img['ci_ordre'], |
'img_id' => $img['ci_id_image']); |
$images_doublons_id[] = $this->bdd->quote($img['ci_id_image']); |
} |
} |
if (count($images_doublons_id) > 0) { |
$requete = 'SELECT ci_id_image, ci_nom_original, ci_md5, ordre '. |
'FROM cel_images AS cim '. |
' LEFT JOIN cel_obs_images AS coi '. |
' ON (coi.coi_ce_image = cim.ci_id_image) '. |
' LEFT JOIN cel_inventory AS ci '. |
' ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '. |
"WHERE cim.ci_ce_utilisateur = '$utilisateur' ". |
' AND cim.ci_id_image IN ('.implode(',', $images_doublons_id).')'; |
$infos = $this->executerRequete($requete); |
foreach ($infos as $info) { |
if (isset($doublons[$info['ci_md5']][$info['ci_id_image']]) && ! $this->etreNull($info['ordre'])) { |
$doublons[$info['ci_md5']][$info['ci_id_image']]['obs_ordre'][] = $info['ordre']; |
} |
} |
} |
} |
//echo '<pre>'.print_r($doublons, true).'</pre>'; |
return $doublons; |
} |
} |
/tags/celw-v1.1/jrest/services/InventoryImportMail.php |
---|
New file |
0,0 → 1,209 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Service d'import d'image à partir de mails |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
*/ |
Class InventoryImportMail extends Cel { |
/** |
* Appelée en mode client, lit le mail envoyé sur l'entrée stdin |
* et le stocke dans le dossier temporaire en attendant |
* qu'une tache périodique associée traite les mails en attente |
* |
* @param array $params les paramètres du script client, l'utilisateur est indiqué avec le paramètre -s |
*/ |
public function stockerMailCli($params) |
{ |
$contenu_mail = file_get_contents('php://stdin'); |
$parametres_ajout = array(); |
$parametres_ajout['mail_utilisateur'] = $params['-s']; |
$stockage = $this->stockerMailTemporaire($parametres_ajout, $contenu_mail); |
if($stockage) { |
$message_attente = 'Votre messsage a été reçu, et est en attente de traitement, '. |
'vous recevrez un message lorsque celui-ci aura été effectué'; |
mail($parametres_ajout['mail_utilisateur'],'Votre message est en attente de traitement',$message_attente); |
} else { |
$message_echec = 'Votre messsage a été reçu, mais il n\'a pas pu être stocké'; |
mail($parametres_ajout['mail_utilisateur'],'Problème lors de reception du message',$message_echec); |
} |
exit; |
} |
private function stockerMailTemporaire($parametres_ajout, $contenu_mail) { |
$expediteur = $parametres_ajout['mail_utilisateur']; |
$nom_fichier_temp = $this->fabriquerNomTemporaireStockageMail($expediteur); |
$dossier_stockage_temp = $this->config['chemin_stockage_temp']; |
$chemin_stockage_image_temp = $dossier_stockage_temp.'/mails/'; |
return file_put_contents($chemin_stockage_image_temp.$nom_fichier_temp); |
} |
/** |
* Appelée en mode client, lit le mail envoyé sur l'entrée stdin |
* extrait les images en pièces jointes, et les ajoute au cel de l'utilisateur |
* expediteur |
* |
* @param array $params les paramètres du script client, l'utilisateur est indiqué avec le paramètre -s |
*/ |
public function traiterMailCli($params) |
{ |
$contenu_mail = file_get_contents('php://stdin'); |
$parametres_ajout = array(); |
$parametres_ajout['mail_utilisateur'] = $params['-s']; |
$ids_stockage = $this->traiterMail($parametres_ajout, $contenu_mail); |
foreach($ids_stockage as $nom_image => $id_stockage) { |
if($id_stockage) { |
mail($parametres_ajout['mail_utilisateur'],'Votre image a été ajoutée au Carnet en ligne','Votre image '.$nom_image.' a été ajoutée avec succès'); |
} else { |
mail($parametres_ajout['mail_utilisateur'],'Problème lors de l\'ajout au Carnet en ligne','Votre image '.$nom_image.' n\'a pas pu être ajoutée'); |
} |
} |
exit(); |
} |
/** |
* Traite le mail fourni en paramètre extrait les images en pièces jointes, |
* et les ajoute au cel de l'utilisateur expediteur |
* |
* @param array $params les paramètres du script client, l'utilisateur est indiqué dans la case 'identifiant' |
*/ |
public function traiterMail($params, $contenu_mail) |
{ |
$pieces_jointes = $this->extrairePiecesJointes($contenu_mail); |
$stockeur_image = new InventoryImage($this->config); |
$ids = array(); |
$infos_utilisateur = $this->getInfosComplementairesUtilisateurPourMail($params['mail_utilisateur']); |
$params['ce_utilisateur'] = $infos_utilisateur['id_utilisateur']; |
foreach($pieces_jointes as $piece_jointe) { |
$nouvel_id_image = $stockeur_image->ajouterImageSurDdEtBdd($params, $piece_jointe); |
if($nouvel_id_image) |
{ |
$ids[$piece_jointe['name']] = $nouvel_id_image; |
} |
else |
{ |
$ids[$piece_jointe['name']] = false; |
} |
} |
// TODO: permettre la création d'observations liées aux images à partir du mail |
// et d'une syntaxe simple à définir |
return $ids; |
} |
/** |
* Appelée en mode client, parse le dossier ou sont stockés les mails |
* extrait les images en pièces jointes, et les ajoute au cel de l'utilisateur |
* |
*/ |
public function parserDossierMail() |
{ |
$dossier_stockage_temp = $this->config['chemin_stockage_temp']; |
$chemin_stockage_image_temp = $dossier_stockage_temp.'/mails/'; |
foreach (new DirectoryIterator($chemin_stockage_image_temp) as $fichier_a_stocker) { |
if($fichier_ou_dossier->isDot()) { |
continue; |
} |
$chemin_fichier = $fichier_a_stocker->getPathname(); |
$nom_fichier = $fichier_ou_dossier->getFilename(); |
$expediteur_mail = $this->obtenirExpediteurPourNomTemporaireMail($nom_fichier); |
$contenu_mail = file_get_contents($chemin_fichier); |
$parametres = array('courriel_utilisateur' => $expediteur_mail); |
$this->traiterMail($parametres, $contenu_mail); |
unlink($chemin_fichier); |
} |
} |
private function extrairePiecesJointes($mail) { |
$pieces_jointes = array(); |
$args['include_bodies'] = true; |
$args['decode_bodies'] = true; |
$args['decode_headers'] = true; |
$args['input'] = $mail; |
$dossier_stockage_temp = $this->config['chemin_stockage_temp']; |
$tableau_mail_decode = Mail_mimeDecode::decode($args); |
foreach ($tableau_mail_decode->parts as $partie) { |
if ($partie->ctype_primary == 'image' && $partie->ctype_secondary == 'jpeg') { |
$informations = array(); |
$nom_original = $partie->ctype_parameters['name']; |
$fichier = $partie->body; |
$hash = md5(time()); |
$chemin_temp = $dossier_stockage_temp.'/images/'.$hash.'.jpg'; |
$temp = fopen($chemin_temp,'w+'); |
fwrite($temp,$fichier); |
fclose($temp); |
chmod($chemin_temp, 0777); |
$informations = array('tmp_name' => $chemin_temp,'name' => $nom_original,'type' => 'image/jpeg','size' => filesize($chemin_temp)); |
$pieces_jointes[] = $informations; |
} |
} |
return $pieces_jointes; |
} |
private function fabriquerNomTemporaireStockageMail($expediteur) { |
return time().'_'.$expediteur; |
} |
private function obtenirExpediteurPourNomTemporaireMail($nom_temp) { |
$chaine_separee = explode('_', $nom_temp,1); |
$nom_expediteur = false; |
if($chaine_separee && count($chaine_separee) > 1) { |
$nom_expediteur = $chaine_separee[1]; |
} |
return $nom_expediteur; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryCheck.php |
---|
New file |
0,0 → 1,82 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package papyrus_bp |
* @author David Delon <delon@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/ |
*/ |
/** |
* |
* Utilitaire mise a jour enregistrement inventaire |
* A voir avec David mais ne devrait plus être utilisé |
* |
*/ |
class InventoryCheck extends Cel { |
function getRessource(){ |
return; |
$requete_obs ="SELECT id_observation, zone_geo, ce_zone_geo, date_observation, ce_utilisateur, courriel_utilisateur FROM cel_obs"; |
$resultat_obs = $this->requeter($requete_obs); |
$observations = array(); |
if (is_array($resultat_obs)) { |
$observations = $resultat_obs; |
} |
foreach ($observations as $obs) { |
if ($obs['ce_zone_geo']!="000null") { |
$requete_lieu = "select * from cel_zones_geo where nom = '".mysql_escape_string($obs['zone_geo'])."' and id_zone_geo='".mysql_escape_string($obs['ce_zone_geo'])."' limit 1"; |
} |
else { |
$requete_lieu = "select * from cel_zones_geo where name = '".mysql_escape_string($obs['zone_geo'])."' limit 1"; |
} |
$res_loc = $this->requeter($requete_lieu); |
if (is_array($res_loc) && count($res_loc) > 0) { |
print $obs['id_observation']; |
print " "; |
print $obs['mail_utilisateur']; |
print " : "; |
print $obs['zone_geo']; |
print " - "; |
print $obs['ce_zone_geo']; |
print " - "; |
$lk="http://www.tela-botanica.org/cel/jrest/util/cel_inventory.php?PME_sys_fl=0&PME_sys_fm=0&PME_sys_sfn[0]=0&PME_sys_operation=PME_op_Change&PME_sys_rec=".$obs['id_observation']; |
$link_desc=' <a href="'.$lk.'">Correction</a>'; |
print $link_desc; |
print "<br>"; |
} |
} |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.2 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.1 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/InventoryStationList.php |
---|
New file |
0,0 → 1,113 |
<?php |
// in utf8 |
// out utf8 |
// List des stations par utilisateur et par commune |
Class InventoryStationList extends DBAccessor { |
var $config; |
function InventoryStationList($config) { |
$this->config=$config; |
} |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
// uid[0] : utilisateur obligatoire |
// uid[1] : si absent : valeur 'all' (commune) |
// uid[2] et uid[3] : selection intervalle |
$DB=$this->connectDB($this->config,'database_cel'); |
if (!isset($uid[1]) || $uid[1]=="" || $uid[1]=="all" ) { |
$uid[1]="all"; |
$query_location=""; |
} |
else { |
$query_location=" AND location='".$DB->escapeSimple($uid[1])."' "; |
} |
$value=array(); |
if (isset($uid[3]) && isset($uid[2])) { |
// les n � partir de x |
$query="SELECT DISTINCT station FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."'" . |
$query_location. |
" ORDER BY station LIMIT ".$uid[2].",".$uid[3]; |
} |
else { |
if (isset($uid[2])) { |
$query="SELECT DISTINCT station FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " . |
$query_location. |
"ORDER BY station LIMIT ".$uid[2].",18446744073709551615"; |
} |
else { |
// le nombre total |
$query="SELECT count(DISTINCT station) as count FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($uid[0])."' " . |
$query_location; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$value=$row['count']; |
} |
$output = json_encode((integer)$value); |
print($output); |
return true; |
} |
} |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$value[]=array($row['station']); |
} |
$output = json_encode($value); |
print($output); |
return true; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.3 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.2 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/CoordSearch.php |
---|
New file |
0,0 → 1,193 |
<?php |
/** |
* Service recherche de commune par coordonnées et vice versa |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
*/ |
class CoordSearch extends Cel { |
private $adresse_service_geonames = null; |
private $adresse_service_local = null; |
private $nom_service_geocoding = null; |
private $nom_service_reverse_geocoding = null; |
function CoordSearch($config) { |
parent::__construct($config); |
$this->adresse_service_geonames = $this->config['cel_db']['url_service_geo_geonames']; |
$this->adresse_service_local = $this->config['cel_db']['url_service_geo_local']; |
$this->nom_service_geocoding = $this->config['cel_db']['nom_service_geocoding_geonames']; |
$this->nom_service_reverse_geocoding = $this->config['cel_db']['nom_service_reverse_geocoding_geonames']; |
} |
/** |
* Recherche de coordonnées suivant ce qui est fourni |
* |
* $uid[0] = latitude (ou * si recherche coordonnées d'une commune) |
* $uid[1] = longitude (ou * si recherche coordonnées d'une commune) |
* $uid[2] = commune (ou * si recherche d'une commune correspondant à des coordonnées) |
* $uid[3] = code_postal (ou * si recherche d'une commune correspondant à des coordonnées) |
* $uid[4] = code_pays (ou * si recherche d'une commune correspondant à des coordonnées, par défaut vaut FR) |
*/ |
function getElement($uid){ |
$header = ''; |
$retour = array(); |
$params = $this->traiterParametres($uid); |
if ($this->estUneRequeteReverseGeocoding($params)) { |
$informations_communes = $this->effectuerRequeteReverseGeocodingCartoOsm($params['lat'], $params['lon']); |
if (!$informations_communes) { |
$informations_communes = $this->effectuerRequeteReverseGeocodingGeonames($params['lat'], $params['lon']); |
} |
$header = 'Content-Type: application/json; charset=UTF-8'; |
$retour = json_encode($informations_communes) ; |
} elseif ($this->estUneRequeteGeocoding($params)) { |
$informations_coord = $this->effectuerRequeteGeocodingGeonames($params['commune'],$params['code_postal'],$params['code_pays']); |
$header = 'Content-Type: application/json; charset=UTF-8'; |
$retour = json_encode($informations_coord); |
} else { |
$header = 'HTTP/1.0 400 Bad Request'; |
$retour = 'Commune ou Coordonnées non spécifiées' ; |
} |
header($header); |
echo $retour; |
} |
protected function traiterParametres($params) { |
$lat = $this->affecterValeurParametreOuDefaut($params, 0, '*'); |
$lng = $this->affecterValeurParametreOuDefaut($params, 1, '*'); |
$commune = $this->affecterValeurParametreOuDefaut($params, 2, '*'); |
$code_postal = $this->affecterValeurParametreOuDefaut($params, 3, '*'); |
$code_pays = $this->affecterValeurParametreOuDefaut($params, 4, 'FR'); |
return array('lat' => $lat, 'lon' => $lng, 'commune' => $commune, |
'code_postal' => $code_postal, 'code_pays' => $code_pays); |
} |
private function affecterValeurParametreOuDefaut($params, $indice, $valeur_si_non_present) { |
return isset($params[$indice]) ? str_replace('"','',urldecode($params[$indice])) : $valeur_si_non_present; |
} |
private function estUneRequeteReverseGeocoding($params) { |
return ($params['lat'] != '*' && $params['lon'] != '*'); |
} |
private function estUneRequeteGeocoding($params) { |
return ($params['commune'] != '*'); |
} |
private function effectuerRequeteReverseGeocodingCartoOsm($lat, $lon) { |
$infos_commune_json = @file_get_contents($this->url_service_geo_local."?lat=".$lat."&lon=".$lon); |
$infos_commune = json_decode($infos_commune_json); |
$retour = false; |
if ($this->estUnRetourOsmValide($infos_commune)) { |
$retour = array('nom' => $infos_commune->nom, 'code_insee' => $infos_commune->codeINSEE); |
} |
return $retour; |
} |
private function estUnretourOsmValide($retour) { |
return (is_a($retour,'stdClass') && property_exists($retour,'nom') && property_exists($retour,'codeINSEE')); |
} |
private function effectuerRequeteReverseGeocodingGeonames($lat, $lon) { |
$infos_commune_json = @file_get_contents($this->adresse_service_geonames. |
$this->nom_service_reverse_geocoding. |
"?featureClass=ADM4&lat=".urlencode($lat)."&lng=".urlencode($lon). |
"&style=full") ; |
$objet_retour = json_decode($infos_commune_json); |
$retour = false; |
if($this->estUnRetourReverseGeocodingGeonamesValide($objet_retour)) { |
$retour = array('nom' => $objet_retour->geonames[0]->name, 'code_insee' => $objet_retour->geonames[0]->adminCode4); |
} |
return $retour; |
} |
private function estUnRetourReverseGeocodingGeonamesValide($retour) { |
$valide = false; |
if (is_a($retour,'stdClass') && property_exists($retour,'geonames') |
&& is_array($retour->geonames) && count($retour->geonames) > 0) { |
$objet_resultats = $retour->geonames[0]; |
if (property_exists($objet_resultats,'adminName4') && property_exists($objet_resultats,'adminCode2')) { |
$valide = true; |
} |
} |
return $valide; |
} |
private function effectuerRequeteGeocodingGeonames($commune, $code_postal, $code_pays) { |
$requete = $this->adresse_service_geonames. |
$this->nom_service_geocoding. |
"?placename_startsWith=".urlencode($commune); |
if($code_postal != '*') { |
$requete .= "&postalcode_startsWith=".urlencode($code_postal); |
} |
$requete .= "&country=".urlencode($code_pays)."&maxRows=10" ; |
$coord_json = @file_get_contents($requete); |
$objet_retour = json_decode($coord_json); |
$retour = false; |
if($this->estUnRetourGeocodingGeonamesValide($objet_retour)) { |
$retour = array('lat' => $objet_retour->postalCodes[0]->lat, |
'lng' => $objet_retour->postalCodes[0]->lng, |
'nom' => $objet_retour->postalCodes[0]->placeName, |
'code_insee' => $objet_retour->postalCodes[0]->postalCode |
); |
} |
return $retour; |
} |
private function estUnRetourGeocodingGeonamesValide($retour) { |
$valide = false; |
if (is_a($retour,'stdClass') && property_exists($retour,'postalCodes') |
&& is_array($retour->postalCodes) && count($retour->postalCodes) > 0) { |
$objet_resultats = $retour->postalCodes[0]; |
if (property_exists($objet_resultats,'lat') && property_exists($objet_resultats,'lng')) { |
$valide = true; |
} |
} |
return $valide; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/ImageProvider.php |
---|
New file |
0,0 → 1,69 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package papyrus_bp |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/papyrus_bp/ |
*/ |
/** |
* Classe fournissant des images au format demandé ou bien aux dimensions demandées |
* |
* in=utf8 |
* out=utf8 |
* |
*/ |
class ImageProvider extends Cel { |
function getElement($uid){ |
if(!isset($uid[0])) { |
return; |
} |
$id_image = $uid[0]; |
$format = 'temp'; |
if(isset($_GET['format'])) { |
$format = $_GET['format']; |
} |
if(isset($_GET['dimensions'])) { |
$dimensions = $_GET['dimensions']; |
} else { |
if(isset($this->config['cel_db']['format_'.$format])) { |
$dimensions = $this->config['cel_db']['format_'.$format]; |
} |
} |
$this->config['cel_db']['format_'.$format] = $dimensions; |
$generateur_image = new ImageRecreation($this->config); |
$infos_image = $generateur_image->obtenirImageEtInfosPourId($id_image); |
if(!$infos_image) { |
header('HTTP/1.0 404 Not Found'); |
exit; |
} |
$image_generee = $generateur_image->creerMiniatureImageSelonFormat($infos_image, $format); |
header('Content-type: image/jpeg'); |
imagejpeg($image_generee); |
exit; |
} |
private function estUneImageALaDemande() { |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/NameParser.php |
---|
New file |
0,0 → 1,375 |
<?php |
/** |
* Taxamatch-Webservice PHP v1.0.0 |
* @author Michael Giddens |
* @link http://www.silverbiology.com |
*/ |
/* Adapation par David Delon Decembre 2010 : gestion sous espece |
*/ |
/** |
* Class NameParser |
* Used to convert a string to a standarized format. |
*/ |
class NameParser { |
/** |
* Whether to debug or nor |
* @var bool|integer |
*/ |
public $debug_flag; |
/** |
* Constructor |
*/ |
public function __construct( ) { |
} |
/** |
* Sets value to the method property |
* @param mixed $name class property name |
* @param mixed $value class property value |
*/ |
public function set($name,$value) { |
$this->$name = $value; |
} |
/** |
* Reduce Spaces |
* This will reduce the string to only allow once space between characters |
* @param string $str : string to reduce space |
* @return string : string with only once space between characters |
*/ |
private function reduce_spaces( $str ) { |
$str = preg_replace("/ {2,}/", ' ', $str ); |
$str = trim( $str ); |
return( $str ); |
} |
/** |
* Function: parse_auth |
* Purpose: Produce a parsed version of authority of a taxon name |
* @author Tony Rees (Tony.Rees@csiro.au) |
* Date created: March 2008 |
* Inputs: authority string as str |
* Remarks: |
* (1) Performs authority expension of known abbreviated authornames using |
* table "auth_abbrev_test1" (must be available and populated with relevant content) |
* (2) Recognises "and", "et", "&" as equivalents (special case for "et al.") - all parsed to ampersand |
* (3) Recognises (e.g.) "Smith 1980" and "Smith, 1980" as equivalents - comma is removed in these cases |
* (4) Recognises (e.g.) "F. J. R. Taylor, 1980" and "F.J.R. Taylor, 1980" as equivalents - |
* extra space after full stops is ignored in these cases |
* (5) Returns uppercase string, diacritical marks intact |
* |
* @param string $str : authority string |
* @param integer $upcase : convert to uppercase if $upcase = 1 |
* @return string : parsed author string |
*/ |
public function parse_auth( $str, $upcase=1 ) { |
$this->debug['parse_auth'][] = "1"; |
$temp = $str = trim($str); |
if ( ($str == NULL) || ($str == '') ) { |
$this->debug['parse_auth'][] = "1a"; |
return ''; |
} |
if ( ( $temp == null ) || ( $temp == '') ) { |
$this->debug['parse_auth'][] = "2a"; |
return(''); |
} else { |
$this->debug['parse_auth'][] = "2b"; |
// add space after full stops, except at end (NB, will also add spece before some close brackets) |
$temp = rtrim( str_replace('.', '. ', $temp) ); |
$this->debug['parse_auth'][] = "4 (temp:$temp)"; |
//normalise "et", "and" to ampersand (et al. is a special case) |
// if ( $temp like '% et al%' ) { |
if ( ereg(' et al', $temp) ) { |
$temp = str_replace(' et al','zzzzz', $temp); |
$this->debug['parse_auth'][] = "4a (temp:$temp)"; |
} |
// $temp = str_replace(temp,' et ',' '||'&'||' '); |
// $temp = replace(temp,' and ',' '||'&'||' '); |
$temp = str_replace(' et ',' & ', $temp ); |
$temp = str_replace(' and ',' & ', $temp ); |
// if ( $temp like '%zzzzz%' ) { |
// if ( ereg('zzzzz', $temp) ) { |
$temp = str_replace('zzzzz',' et al', $temp); |
// } |
$this->debug['parse_auth'][] = "5 (temp:$temp)"; |
//remove commas before dates (only) |
// like '%, 17%' |
if ( ereg(', 17', $temp) ) { |
$temp = str_replace(', 17',' 17', $temp); |
$this->debug['parse_auth'][] = "5a (temp:$temp)"; |
} |
// like '%, 18%' |
if ( ereg(', 18', $temp) ) { |
$temp = str_replace(', 18',' 18', $temp); |
$this->debug['parse_auth'][] = "5b (temp:$temp)"; |
} |
// like '%, 19%' |
if ( ereg(', 19', $temp) ) { |
$temp = str_replace(', 19',' 19', $temp); |
$this->debug['parse_auth'][] = "5c (temp:$temp)"; |
} |
// like '%, 20%' |
if ( ereg(', 20', $temp) ) { |
$temp = str_replace(', 20',' 20', $temp); |
$this->debug['parse_auth'][] = "5d (temp:$temp)"; |
} |
// reduce multiple internal spaces to single space |
$temp = $this->reduce_spaces( $temp ); |
// like '% -%' |
$temp = str_replace(' -', '-', $temp); |
$this->debug['parse_auth'][] = "6 (temp:$temp)"; |
foreach( explode(' ', $temp) as $this_word ) { |
$this->debug['parse_auth'][] = "7 (this_word:$this_word)"; |
// like '(%' |
if ( ereg('^\(', $this_word) ) { |
$elapsed_chars .= '('; |
$this_word = substr( $this_word, 1 ); |
$this->debug['parse_auth'][] = "7a (this_word:$this_word) (elapsed_chars:$elapsed_chars)"; |
} |
// Add back the word to the final translation |
$elapsed_chars .= $this_word . ' '; |
$this->debug['parse_auth'][] = "7c (this_word:$this_word) (elapsed_chars:$elapsed_chars)"; |
} |
$elapsed_chars = $this->reduce_spaces( str_replace(' )', ')', $elapsed_chars) ); |
return trim( $elapsed_chars ) ; |
} |
} |
/** |
* Function: parse |
* Purpose: Produces parsed version of an input string (scientific name components) |
* @author Tony Rees (Tony.Rees@csiro.au) |
* Date created: June 2007-November 2008 |
* Inputs: input string as str (this version presumes genus, genus+species, or |
* genus+species+authority) |
* Outputs: parsed version of input string, for match purposes |
* Remarks: |
* (1) Removes known text elements e.g. |
* 'aff.', 'cf.', 'subsp.', subgenera if enclosed in brackets, etc. as desired |
* (2) Removes accented and non A-Z characters other than full stops |
* (in scientific name portions) |
* (3) Returns uppercase scientific name (genus + species only) |
* plus unaltered (presumed) authority |
* examples; |
* Anabaena cf. flos-aquae Ralfs ex Born. et Flah. => ANABAENA FLOSAQUAE Ralfs |
* ex Born. et Flah. |
* Abisara lemÈe-pauli => ABISARA LEMEEPAULI |
* Fuc/us Vesiculos2us => FUCUS VESICULOSUS |
* Buffo ignicolor LacÈpËde, 1788 => BUFFO IGNICOLOR LacÈpËde, 1788 |
* Barbatia (Mesocibota) bistrigata (Dunker, 1866) => BARBATIA BISTRIGATA (Dunker, 1866) |
* (4) Thus version does not handle genus+author, or genus+species+infraspecies |
* (second" good" term is presumed to be species epithet, anything after is |
* considered to be start of the authority), however could be adapted further as required |
* and actually it was done in this version for Tela Botanica |
* (5) There is a separate function "parse_auth" for normalizing authorities when required |
* (e.g. for authority comparisons) |
* |
* @param string $str : input string ( genus, genus+species, or genus+species+authority ) |
* @return string : parsed string |
*/ |
public function parse( $str = NULL ) { |
unset($this->debug['parse']); |
$temp = ''; |
$first_str_part = NULL; |
$second_str_part = NULL; |
$temp_genus = ''; |
$temp_species = ''; |
$temp_genus_species = ''; |
$temp_authority = ''; |
$temp_infra = ''; |
$this->debug['parse'][] = "1"; |
if ( ($str == NULL) || ( trim($str) == '') ) { |
$this->debug[] = "N1a<br>"; |
return ''; |
} else { |
// trim any leading, trailing spaces or line feeds |
$temp = trim( $str ); |
$this->debug['parse'][] = "1b"; |
} |
if ( $temp == NULL || $temp == '') { |
$this->debug['parse'][] = "2a"; |
return ''; |
} else { |
$this->debug['parse'][] = "2b"; |
// replace any HTML ampersands |
$set = array('%', '&', 'amp;%', 'AMP;%'); |
$temp = str_replace( $set, '&', $temp ); |
$this->debug['parse'][] = "2b1 (temp:$temp)"; |
// remove any content in angle brackets (e.g. html tags - <i>, </i>, etc.) |
$html_pattern = "(\<(/?[^\>]+)\>)"; |
//? This should not just handle html tags but all <*> |
$temp = preg_replace( $html_pattern, '', $temp); |
$this->debug['parse'][] = "2b2 (temp:$temp)"; |
// if second term (only) is in round brackets, presume it is a subgenus or a comment and remove it |
// examples: Barbatia (Mesocibota) bistrigata (Dunker, 1866) => Barbatia bistrigata (Dunker, 1866) |
// Barbatia (?) bistrigata (Dunker, 1866) => Barbatia bistrigata (Dunker, 1866) |
// (obviously this will not suit genus + author alone, where first part of authorname is in brackets, |
// however this is very rare?? and in any case we are not supporting genus+authority in this version) |
//if ( $temp like '% (%)%' |
$temp = preg_replace( "/ \(\w*\W*\)/", '', $temp, 1 ); |
//? Not sure if this will catch if |
$this->debug['parse'][] = "2b3 (temp:$temp)"; |
// if second term (only) is in square brackets, presume it is a comment and remove it |
// example: Aphis [?] ficus Theobald, [1918] => Aphis ficus Theobald, [1918] |
//if ( $temp like '% [%]%' |
$temp = preg_replace( "/ \[\w*\W*\]/", '', $temp, 1 ); |
//? Not sure if this will catch if |
$this->debug['parse'][] = "2b4 (temp:$temp)"; |
// drop indicators of questionable id's - presume all are lowercase for now (could extend as needed) |
$temp = preg_replace( "/ cf /", " ", $temp ); |
$temp = preg_replace( "/ cf\. /", " ", $temp ); |
$temp = preg_replace( "/ near /", " ", $temp ); |
$temp = preg_replace( "/ aff\. /", " ", $temp ); |
$temp = preg_replace( "/ sp\. /", " ", $temp ); |
$temp = preg_replace( "/ spp\. /", " ", $temp ); |
$temp = preg_replace( "/ spp /", " ", $temp ); |
$this->debug['parse'][] = "2b5 (temp:$temp)"; |
// eliminate or close up any stray spaces introduced by the above |
$temp = $this->reduce_spaces( $temp ); |
$this->debug['parse'][] = "2b6 (temp:$temp)"; |
// now presume first element is genus, second (if present) is species, remainder |
// (if present) is authority |
// look for genus name |
$ar = explode( " ", $temp, 2); |
if ( count( $ar ) ) { |
$temp_genus = $ar[0]; |
$temp = @$ar[1]; |
} else { |
$temp_genus = $temp; |
$temp = ''; |
} |
$this->debug['parse'][] = "2b7 (temp_genus:$temp_genus) (temp:$temp)"; |
// look for species epithet and authority |
$ar = explode( " ", $temp, 2); |
if ( count( $ar ) ) { |
$temp_species = $ar[0]; |
$temp_authority = @$ar[1]; |
} else { |
$temp_species = $temp; |
$temp_authority = ''; |
} |
// look for subspecies |
$infras =array('subsp.','var.'); |
$temp_authority = preg_replace( "/ssp./", "subsp.", $temp_authority); |
$temp_authority = preg_replace( "/ssp /", "subsp.", $temp_authority); |
$temp_authority = preg_replace( "/subsp /", "subsp.", $temp_authority); |
$temp_authority = preg_replace( "/var /", "var.", $temp_authority); |
foreach ($infras as $infra) { |
$pos = strpos($temp_authority, $infra); |
if ($pos === false) { |
continue; |
} |
else { |
$temp_infra=substr($temp_authority,$pos+strlen($infra)); |
$temp_authority=substr($temp_authority,0,$pos); |
$temp_infra=trim($temp_infra); |
$temp_infra_type=$infra; |
// look for infra epithet and authority |
$ar = explode(" ", $temp_infra, 2); |
if ( count( $ar ) ) { |
$temp_infra = $ar[0]; |
$temp_infra_authority = @$ar[1]; |
} |
break; // on s'arrete au premier trouve |
} |
} |
$this->debug['parse'][] = "2b8 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)"; |
// replace selected ligatures here (Genus names can contain Æ, OE ligature) |
$temp_genus = str_replace( 'Æ', 'AE', $temp_genus); |
$temp_species = str_replace( 'Æ', 'AE', $temp_species); |
$temp_infra = str_replace( 'Æ', 'AE', $temp_infra ); |
$this->debug['parse'][] = "2b9 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)"; |
$temp_genus= trim($temp_genus); |
$temp_species= trim($temp_species); |
$temp_infra= trim($temp_infra ); |
// reduce any new multiple internal spaces to single space, if present |
$temp_genus= $this->reduce_spaces( $temp_genus ); |
$temp_species= $this->reduce_spaces( $temp_species ); |
$temp_infra= $this->reduce_spaces( $temp_infra ); |
$this->debug['parse'][] = "2b10 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)"; |
if (isset($temp_authority) && ($temp_authority!='') ) { |
$temp_authority=$this->parse_auth($temp_authority); |
} |
if (isset($temp_infra_authority) && ($temp_infra_authority!='') ) { |
$temp_infra_authority=$this->parse_auth($temp_infra_authority); |
} |
$this->debug['parse'][] = "2b11 (temp_genus:$temp_genus) (temp_species:$temp_species) (temp_authority:$temp_authority) (temp_infra:$temp_infra) (temp_infra_authority:$temp_infra_authority) (temp:$temp)"; |
return array("genus"=>$temp_genus, "species"=>$temp_species, "authority"=>$temp_authority, "infra"=>$temp_infra, "infra_authority"=>$temp_infra_authority, "infra_type"=>$temp_infra_type); |
} |
} // End NameParser |
} // End Class |
?> |
/tags/celw-v1.1/jrest/services/TestNameParser.php |
---|
New file |
0,0 → 1,123 |
<?php |
require_once('NameParser.php'); |
$parse = new NameParser(); |
$str=array(); |
$str[]='Paris quadrifolia L.'; |
$str[]='Phyteuma spicatum L.'; |
$str[]='Pinus sylvestris L.'; |
$str[]='Polygonatum multiflorum (L.) All.'; |
$str[]='Polygonatum multiflorum (L.) All.'; |
$str[]='Potentilla sterilis (L.) Garcke'; |
$str[]='Potentilla sterilis (L.) Garcke'; |
$str[]='Primula elatior (L.) Hill'; |
$str[]='Primula elatior (L.) Hill'; |
$str[]='Ranunculus ficaria L.'; |
$str[]='Ranunculus ficaria L.'; |
$str[]='Ranunculus ficaria L.'; |
$str[]='Ranunculus ficaria L.'; |
$str[]='Salvia pratensis L.'; |
$str[]='Sanguisorba officinalis L.'; |
$str[]='Sanicula europaea L.'; |
$str[]='Scrophularia nodosa L.'; |
$str[]='Securigera varia (L.) P. Lassen'; |
$str[]='Silene latifolia Poiret'; |
$str[]='Sonchus asper (L.) Hill'; |
$str[]='Stachys recta L.'; |
$str[]='Stachys sylvatica L.'; |
$str[]='Stellaria holostea L.'; |
$str[]='Symphytum officinale L.'; |
$str[]='Symphytum officinale L.'; |
$str[]='Teucrium scorodonia L.'; |
$str[]='Tilia platyphyllos Scop.'; |
$str[]='Tussilago farfara L.'; |
$str[]='Urtica dioica L.'; |
$str[]='Urtica dioica L.'; |
$str[]='Urtica dioica L.'; |
$str[]='Vaccinium myrtillus L.'; |
$str[]='Valeriana officinalis subsp. repens (Host) O. Bolòs and Vigo'; |
$str[]='Valeriana officinalis subsp. repens (Host) O. Bolòs & Vigo'; |
$str[]='Viburnum lantana L.'; |
$str[]='Viburnum opulus L.'; |
$str[]='Viola reichenbachiana Jordan ex Boreau'; |
$str[]='Viscum album L.'; |
$str[]='Aegopodium podagraria L.'; |
$str[]='Ajuga reptans L.'; |
$str[]='Alisma plantago-aquatica L.'; |
$str[]='Alliaria petiolata (M. Bieb.) Cavara & Grande'; |
$str[]='Alnus glutinosa (L.) Gaertn.'; |
$str[]='Bidens frondosa L.'; |
$str[]='Bidens tripartita L.'; |
$str[]='Callitriche palustris L.'; |
$str[]='Campanula trachelium L.'; |
$str[]='Carex brizoides L.'; |
$str[]='Carex vesicaria L.'; |
$str[]='Circaea lutetiana L.'; |
$str[]='Dryopteris filix-mas (L.) Schott'; |
$str[]='Elatine hexandra (Lapierre) DC.'; |
$str[]='Fragaria vesca L.'; |
$str[]='Glechoma hederacea L.'; |
$str[]='Glyceria fluitans (L.) R. Br.'; |
$str[]='Gnaphalium uliginosum L.'; |
$str[]='Iris pseudacorus L.'; |
$str[]='Lathyrus pratensis L.'; |
$str[]='Lemna minor L.'; |
$str[]='Leucanthemum vulgare Lam.'; |
$str[]='Lotus pedunculatus Cav.'; |
$str[]='Lycopus europaeus L.'; |
$str[]='Lysimachia nemorum L.'; |
$str[]='Lythrum portula (L.) D.A. Webb'; |
$str[]='Lythrum salicaria L.'; |
$str[]='Milium effusum L.'; |
$str[]='Oxalis acetosella L.'; |
$str[]='Phalaris arundinacea L.'; |
$str[]='Phyteuma spicatum L.'; |
$str[]='Potamogeton natans L.'; |
$str[]='Primula elatior (L.) Hill'; |
$str[]='Ranunculus flammula L.'; |
$str[]='Ranunculus sceleratus L.'; |
$str[]='Sagittaria sagittifolia L.'; |
$str[]='Scrophularia nodosa L.'; |
$str[]='Silene dioica (L.) Clairv.'; |
$str[]='Sparganium emersum Rehmann'; |
$str[]='Sparganium erectum L.'; |
$str[]='Valeriana officinalis L. subsp. tenuifolia Schübler & Martens'; |
$str[]='Veronica montana L.'; |
$str[]='Vinca minor L.'; |
$str[]='Acer campestre L.'; |
$str[]='Acer campestre L.'; |
$str[]='Achillea millefolium L.'; |
$str[]='Achillea millefolium L.'; |
$str[]='Achillea ptarmica L.'; |
$str[]='Achillea ptarmica L.'; |
$str[]='Achillea ptarmica L.'; |
foreach ($str as $st) { |
$data = $parse->parse($st); |
print 'nom : '; |
print $st; |
print ', genus : '; |
print $data['genus']; |
print ', species : '; |
print $data['species']; |
print ', authority : '; |
print $data['authority']; |
if (isset ($data['infra']) && $data['infra']!='') { |
print ', infra : '; |
print $data['infra']; |
} |
if (isset ($data['infra_authority']) && $data['infra_authority']!='') { |
print ', infra authority : '; |
print $data['infra_authority']; |
} |
if (isset ($data['infra_type']) && $data['infra_type']!='') { |
print ', infra type : '; |
print $data['infra_type']; |
} |
print "</br>"; |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryKeyWordList.php |
---|
New file |
0,0 → 1,394 |
<?php |
// declare(encoding='UTF-8'); |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Service de recherche et modification de l'arbre des mots clés associés à un id. |
* 1: Le service recoit un mot clé à ajouter à l'arbre |
* 2: Le service recherche l'arbre ou sous arbre correspondant au critères demandé |
* 3: Le service renvoie l'arbre au format json |
* |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2011, Tela-Botanica |
*/ |
class InventoryKeyWordList extends Cel { |
protected $suffix = ''; |
public function getElement($uid) { |
// Controle detournement utilisateur |
session_start(); |
$this->suffix = '_'.$uid[0]; |
$id_utilisateur = $uid[1] ; |
$this->controleUtilisateur($uid[1]); |
$requete = 'SELECT mot_cle, id_mot_cle_utilisateur, ce_mot_cle_utilisateur_parent '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' '. |
'ORDER BY niveau '; |
$resultats_mots_cles = $this->requeter($requete); |
if (is_array($resultats_mots_cles)) { |
$mots_cles = array(); |
foreach($resultats_mots_cles as $mot_cle) { |
$mots_cles[] = $mot_cle; |
} |
$infos = json_encode($mots_cles); |
header('content-type: application/json'); |
print $infos; |
exit(); |
} |
} |
public function updateElement($uid, $pairs) { |
session_start(); |
$this->suffix = '_'.$uid[0]; |
$id_utilisateur = $uid[1]; |
$this->controleUtilisateur($uid[1]); |
$id_mot_cle = $pairs['id']; |
$action = $pairs['action']; |
if ($action == 'modification') { |
$nouveau_nom = $pairs['motcle']; |
$nouvel_id_general = md5(strtolower($nouveau_nom)); |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET mot_cle = '.$this->proteger($nouveau_nom).' , '. |
' md5 = '.$this->proteger($nouvel_id_general).' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur) ; |
$reussite = $this->executer($requete); |
if ($reussite) { |
echo 'OK'; |
} |
} else if ($action == 'deplacement') { |
$this->commencerTransaction(); |
$transaction_reussie_1 = true; |
$id_pere = $pairs['parent']; |
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur); |
$bg = $bornes['bg']; |
$bd = $bornes['bd']; |
$niveau = $bornes['niveau']; |
// on inverse l'intervalle de l'élément déplacé et du sous arbre |
$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur); |
$bg_negative = $bg - $bd - 1; |
$bd_negative = $bd - $bd - 1; |
// on recalcule les intervalles de l'arbre privé de ce sous arbre |
$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur); |
$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur); |
$bg_pere = $bornes_pere['bg']; |
$bd_pere = $bornes_pere['bd']; |
$niveau_pere = $bornes_pere['niveau']; |
$decalage = $bd - $bg + 1; |
// on decale les bornes droite du pere pour préparer l'insertion |
$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur); |
$nouvelle_bd = $bd_pere + $decalage; |
$modif_niveau = $niveau_pere - $niveau + 1; |
$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur); |
$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur); |
if ($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6) { |
$this->completerTransaction(); |
} else { |
$this->annulerTransaction(); |
} |
} |
} |
public function createElement($pairs) { |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
$this->suffix = '_'.$pairs['mode']; |
$id_utilisateur = $pairs['ce_utilisateur']; |
$mot_cle = $pairs['motcle']; |
// TODO supprimer accents |
$id_mot_cle_general = md5(mb_strtolower($mot_cle)); |
$id_mot_cle = $pairs['id']; |
$id_parent = $pairs['parent']; |
$this->ajouterMotCleRacine($id_utilisateur); |
$this->commencerTransaction(); |
$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur); |
$borne_pere = $bornes['bd']; |
$niveau = $bornes['niveau'] + 1; |
$bg = $bornes['bd']; |
$bd = $bg + 1; |
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false; |
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '. |
'VALUES ( '. |
$this->proteger($id_mot_cle).', '. |
$this->proteger($id_utilisateur).', '. |
$this->proteger($mot_cle).', '. |
$this->proteger($id_mot_cle_general).', '. |
$this->proteger($bg).', '. |
$this->proteger($bd).', '. |
$this->proteger($niveau).', '. |
$this->proteger($id_parent).') ' ; |
$transaction_reussie_2 = $this->executer($requete); |
if ($transaction_reussie_1 && $transaction_reussie_2) { |
$this->completerTransaction(); |
echo 'OK'; |
} else { |
$this->annulerTransaction(); |
} |
} |
public function deleteElement($uid) { |
session_start(); |
$this->suffix = '_'.$uid[0]; |
$id_utilisateur = $uid[1]; |
$id_mot_cle = $uid[2]; |
$this->controleUtilisateur($id_utilisateur); |
$this->commencerTransaction(); |
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur); |
$bg = $bornes['bg']; |
$bd = $bornes['bd']; |
$requete = 'DELETE FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE bg >= '.$this->proteger($bg).' '. |
' AND bd <= '.$this->proteger($bd).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$transaction_reussie_1 = $this->executer($requete); |
$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false; |
if ($transaction_reussie_1 && $transaction_reussie_2) { |
$this->completerTransaction(); |
} else { |
$this->annulerTransaction(); |
} |
} |
private function ajouterMotCleRacine($id) { |
$requete = 'SELECT COUNT(*) as nb_mc '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE ce_utilisateur = '.$this->proteger($id).' '; |
$resultat = $this->requeter($requete); |
if (is_array($resultat) && count($resultat) > 0) { |
$valeurs = $resultat[0]['nb_mc']; |
switch ($this->suffix) { |
case '_obs' : |
$nom_racine = 'Projets'; |
$id_racine = 'racine_obs'; |
break; |
case '_images' : |
$nom_racine = 'Mots clés'; |
$id_racine = 'racine'; |
break; |
default: |
$nom_racine = $this->suffix; |
$id_racine = $this->suffix; |
} |
if ($valeurs == 0) { |
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '. |
'VALUES ("'.$nom_racine.'", 1, 2, "'.$id_racine.'", "'.$id_racine.'", '.$this->proteger($id).', "", 0) '; |
$this->executer($requete); |
} |
} |
} |
/** |
* Désactive l'auto-commit puis débute la transaction |
*/ |
private function commencerTransaction() { |
// Désactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 0 '; |
$reussite_autocommit = $this->executer($requete); |
// Débute une nouvelle transaction |
$requete = 'BEGIN '; |
$reussite_begin = $this->executer($requete); |
} |
/** |
* Termine la transaction puis réactive l'auto-commit |
*/ |
private function completerTransaction() { |
// Complète la transaction |
$requete = 'COMMIT '; |
$reussite_commit = $this->executer($requete); |
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executer($requete); |
echo 'OK'; |
} |
/** |
* Annule la transaction et réactive l'auto-commit |
*/ |
private function annulerTransaction() { |
// Annule la transaction |
$requete = 'ROLLBACK '; |
$reussite_rollback = $this->executer($requete); |
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executer($requete); |
echo 'ERROR'; |
} |
/** |
* Renvoie les bornes d'un noeud de l'arbre des mots clés |
*/ |
private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) { |
$requete = 'SELECT bd, bg, niveau '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$resultat = $this->requeter($requete); |
if(is_array($resultat) && count($resultat) > 0) { |
$valeurs = $resultat[0]; |
} |
return $valeurs; |
} |
/** |
* Décale les bornes de deux pour insérer un nouvel élément |
*/ |
private function decalerBornesPlusDeux($valeur, $id_utilisateur) { |
// Décalage borne droite |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd + 2 WHERE bd >= '.$this->proteger($valeur).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
// Décalage borne gauche |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg + 2 '. |
'WHERE bg >= '.$this->proteger($valeur).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
return $reussi_1 && $reussi_2; |
} |
/** |
* Décale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre). |
*/ |
private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) { |
$decalage = $bd - $bg + 1; |
// Décalage borne droite |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd - '.$this->proteger($decalage).' '. |
'WHERE bd >= '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
// Décalage borne gauche |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg - '.$this->proteger($decalage).' '. |
'WHERE bg > '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
return $reussi_1 && $reussi_2; |
} |
/** |
* Décale à droite des bornes donées d'un intervalle positif donne (pour l'ajout d'un sous arbre). |
*/ |
private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) { |
$decalage = $largeur; |
// decalage borne droite |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd + '.$this->proteger($decalage).' '. |
'WHERE bd >= '.$this->proteger($valeur_bornes).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
// decalage borne gauche |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg + '.$this->proteger($decalage).' '. |
'WHERE bg >= '.$this->proteger($valeur_bornes).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
return $reussi_1 && $reussi_2; |
} |
/** |
* Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie. |
*/ |
private function exclureIntervalle($bg, $bd, $id_utilisateur) { |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bd = bd - '.$this->proteger($bd).' - 1 , '. |
' bg = bg - '.$this->proteger($bd).' - 1 '. |
'WHERE bd <= '.$this->proteger($bd).' '. |
' AND bg >= '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
return $this->executer($requete); |
} |
/** |
* Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place. |
* Décalage borne droite |
*/ |
private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) { |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET bg = bg + '.$this->proteger($decalage).' , '. |
' bd = bd + '.$this->proteger($decalage).', '. |
' niveau = niveau + '.$modif_niveau.' '. |
' WHERE bg >= '.$this->proteger($bg).' '. |
' AND bd <= '.$this->proteger($bd).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
return $this->executer($requete); |
} |
private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) { |
$requete = 'UPDATE cel_mots_cles'.$this->suffix.' '. |
'SET ce_mot_cle_utilisateur_parent = '.$this->proteger($id_pere).' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
return $this->executer($requete); |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/LocationSearch.php |
---|
New file |
0,0 → 1,98 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Classe gérant la completion des noms de lieux |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author David Delon <david.delon@clapas.net> |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2010, David Delon |
*/ |
/** |
* Cas d'utilisation : |
* Service completion nom de commune (plus tard de lieu en général) |
* |
* 1 : L'application recoit un debut de nom de lieu |
* 2 : Si la longueur du prefixe est > 2, l'application retourne les 50 premieres lieux |
* commencant par ce prefixe |
**/ |
class LocationSearch extends Cel { |
function getElement($uid){ |
$retour = array(); |
if (isset($uid[0])) { |
$retour = $this->executerRequeteLieu($uid[0]); |
} |
$output = json_encode($retour); |
header("content-type: application/json"); |
print($output); |
} |
function getRessource(){ |
print "[]"; |
return; |
} |
private function executerRequeteLieu($lieu) { |
$lieu = $this->formaterChaineLieuPourRequete($lieu); |
$retour = array(); |
if ($this->estUneChaineRequeteValide($lieu)) { |
$requete_information_lieu = 'SELECT DISTINCT nom, code '. |
'FROM cel_zones_geo '. |
'WHERE '. |
'nom LIKE '.$this->proteger($lieu.'%').' '. |
'ORDER BY nom LIMIT 50'; |
$liste_lieux = $this->requeter($requete_information_lieu); |
if($liste_lieux) { |
foreach($liste_lieux as $lieu) { |
$retour[] = $this->formaterLigneResultat($lieu); |
} |
} |
} |
return $retour; |
} |
private function formaterChaineLieuPourRequete($params) { |
$lieu = $params; |
$lieu=ltrim($lieu); |
$lieu=ereg_replace('\*+','%',$lieu); |
return $lieu; |
} |
private function estUneChaineRequeteValide($lieu) { |
return (strlen($lieu) > 0) && ($lieu != '%'); |
} |
private function formaterLigneResultat($ligne) { |
return array($ligne['nom']." (".sprintf("%02s",$ligne['code']).")",$ligne['code']); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.4 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.3 2007-05-21 18:13:03 ddelon |
* Correction bug recherche commune du type "la canourgue" |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/InventoryExport.php |
---|
New file |
0,0 → 1,129 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david@tela-botania.org> |
* @author Aurélien Peronnet <aurelien@tela-botania.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* in:utf8 |
* out:iso8859 |
* |
* Export vers feuille de calcul d'une selection de releves |
* |
*/ |
class InventoryExport extends Cel { |
private $extendSpreadsheetProductor; |
function InventoryExport($config) { |
parent::__construct($config); |
$this->extendSpreadsheetProductor = new SpreadsheetProductor(); |
$this->extendSpreadsheetProductor->initSpreadsheet(); |
} |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$criteres = array(); |
$chercheur_observations = new RechercheObservation($this->config); |
if(isset($uid[1])) |
{ |
$criteres = $chercheur_observations->parserRequeteCriteres($uid[1]); |
} |
// Creating a workbook |
$workbook = new Spreadsheet_Excel_Writer(); |
$workbook->send('liste.xls'); |
// Creating a worksheet |
$worksheet = $workbook->addWorksheet('Liste'); |
$worksheet->write(0,0,'Espece'); |
$worksheet->write(0,1,'Numero nomenclatural'); |
$worksheet->write(0,2,'Nom retenu'); |
$worksheet->write(0,3,'Numero nomenclatural nom retenu'); |
$worksheet->write(0,4,'Numero taxonomique'); |
$worksheet->write(0,5,'Famille'); |
$worksheet->write(0,6,'Commune'); |
$worksheet->write(0,7,'Identifiant Commune'); |
$worksheet->write(0,8,'Date'); |
$worksheet->write(0,9,'Lieu-dit'); |
$worksheet->write(0,10,'Station'); |
$worksheet->write(0,11,'Milieu'); |
$worksheet->write(0,12,'Notes'); |
$worksheet->write(0,13,'Latitude'); |
$worksheet->write(0,14,'Longitude'); |
$worksheet->write(0,15,'Referentiel Geographique'); |
$numero_page = isset($criteres['numero_page']) ? $criteres['numero_page'] : 0; |
$limite = isset($criteres['limite']) ? $criteres['limite'] : 50; |
$observations = $chercheur_observations->rechercherObservations($uid[0], $criteres, $numero_page, $limite); |
$i=1; |
foreach ($observations as $obs) { |
$obs = $this->denullifierTableauValeurCel(&$obs); |
if ($obs['date_observation'] != "0000-00-00 00:00:00") { |
$obs['date_observation'] = $this->formaterDate($obs['date_observation']); |
} |
else { |
$obs['date_observation']="00/00/0000"; |
} |
$worksheet->write($i,0,$obs['nom_sel']); |
$worksheet->write($i,1,$obs['nom_sel_nn']); |
$worksheet->write($i,2,$obs['nom_ret']); |
$worksheet->write($i,3,$obs['nom_ret_nn']); |
$worksheet->write($i,4,$obs['nt']); |
$worksheet->write($i,5,$obs['famille']); |
$worksheet->write($i,6,$obs['zone_geo']); |
$worksheet->write($i,7,$this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo'])); |
$worksheet->write($i,8,$obs['date_observation']); |
$worksheet->write($i,9,$obs['lieudit']); |
$worksheet->write($i,10,$obs['station']); |
$worksheet->write($i,11,$obs['milieu']); |
$worksheet->write($i,12,$obs['commentaire']); |
$worksheet->write($i,13,$obs['latitude']); |
$worksheet->write($i,14,$obs['longitude']); |
$worksheet->write($i,15,$obs['geodatum']); |
$i++; |
} |
$workbook->close(); |
exit(); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.7 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.6 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.5 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.4 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
*/ |
?> |
/tags/celw-v1.1/jrest/services/Resume.php |
---|
New file |
0,0 → 1,131 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package papyrus_bp |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/papyrus_bp/ |
*/ |
/** |
* Classe renvoyant un petit bout de json contenant les dernières obs publiques d'un utilisateur |
* Utilisée par l'annuaire appelant les web services résumé de chaque application |
* |
*/ |
class Resume extends Cel { |
function getElement($uid){ |
$requete_dernieres_obs = 'SELECT * FROM cel_obs'. |
' WHERE ce_utilisateur = '.$this->proteger($uid[1]). |
' AND transmission = 0'. |
' ORDER BY date_modification DESC LIMIT 0,5'; |
$resultat_dernieres_obs = $this->requeter($requete_dernieres_obs); |
$dernieres_obs = array(); |
$resume = array(); |
if (is_array($resultat_dernieres_obs)) { |
$dernieres_obs = $resultat_dernieres_obs; |
} |
$resume['titre'] = 'Vos dernières observations publiées'; |
$resume['lien_appli'] = '<a href="www.tela-botanica.org/appli:cel2"> Accéder au carnet en ligne </a>'; |
if (count($dernieres_obs) == 0) { |
$resume['message'] = 'Aucune observation saisie pour le moment'; |
} |
foreach ($dernieres_obs as $obs) { |
$chemin_sur_serveur = $this->config['cel_db']['url_images']; |
$date = 'Datée du '.$obs['date_modification'].'<br/>' ; |
$lieu = 'Lieu : '.trim($obs['zone_geo'],'000null').' ('.$this->convertirCodeZoneGeoVersDepartement(trim($obs['ce_zone_geo']),'000null').') '.trim($obs['station'],'000null').' '.trim($obs['lieudit'],'000null').'<br/>' ; |
$image =''; |
$cible_lien = ''; |
$req_liaison = 'SELECT * FROM cel_images WHERE id_image IN (SELECT id_image FROM cel_obs_images WHERE id_observation = "'.$obs['id_observation'].'") AND ce_utilisateur = "'.$obs['ce_utilisateur'].'"' ; |
$res_liaison = $this->requeter($req_liaison); |
$ligne_image = null; |
foreach ($res_liaison as $img) { |
$row = $img; |
} |
if($row != null) { |
$row['nom_original'] = htmlspecialchars($row['nom_original']); |
$row['id_image'] = htmlspecialchars($row['id_image']); |
$id = $row['id_image']; |
$tailleXY = $this->calculerDimensions(array($row['largeur'], $row['hauteur'])); |
$id = sprintf('%09s', $id) ; |
$id = wordwrap($id, 3 , '_', true) ; |
$id_fichier = $id.".jpg" ; |
$niveauDossier = split("_", $id) ; |
$dossierNiveau1 = $niveauDossier[0] ; |
$dossierNiveau2 = $niveauDossier[1] ; |
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ; |
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ; |
$chemin_fichier_s = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ; |
$image = '<img src="'.$chemin_fichier_s.'" alt="'.$row['nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img>'; |
$cible_lien = $chemin_fichier; |
} |
$resume_item = array('element' => $obs['nom_ret'].$date.$lieu, 'lien' => $cible_lien,'image' => $image); |
$resume['elements'][] = $resume_item; |
} |
header("Content-Type: application/json; charset=UTF-8"); |
$resume = json_encode($resume); |
print ($resume); |
exit; |
} |
public function calculerDimensions($tailleXY) { |
$tailleOr = 75 ; |
if($tailleXY[1] == 0) { |
$tailleXY[1] = $tailleOr; |
} |
if($tailleXY[0] == 0) { |
$tailleXY[0] = $tailleOr; |
} |
$maxTaille = max($tailleXY[1],$tailleXY[0]) ; |
if($maxTaille == $tailleXY[1]) { |
$rapport = $tailleXY[1]/$tailleXY[0] ; |
$tailleXY[1] = 75 ; |
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ; |
}else { |
$rapport = $tailleXY[0]/$tailleXY[1] ; |
$tailleXY[0] = 75 ; |
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ; |
} |
return $tailleXY ; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/CelRestClient.php |
---|
New file |
0,0 → 1,157 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Classe modèle spécifique à l'application, donc d'accés au données, elle ne devrait pas être appelée de l'extérieur. |
* |
* @category php5 |
* @package Cel |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version SVN: $Id$ |
*/ |
// TODO : remplacer les trigger_error par des exceptions qui pourrait être attrapées... |
class CelRestClient { |
const HTTP_URL_REQUETE_SEPARATEUR = '&'; |
const HTTP_URL_REQUETE_CLE_VALEUR_SEPARATEUR = '='; |
private $http_methodes = array('GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS', 'CONNECT', 'TRACE'); |
protected $parametres = null; |
private $url = null; |
private $reponse_entetes = null; |
//+----------------------------------------------------------------------------------------------------------------+ |
// ACCESSEURS |
public function getReponseEntetes($cle) { |
return $this->reponse_entetes; |
} |
public function getParametre($cle) { |
$valeur = (isset($this->parametres[$cle])) ? $this->parametres[$cle] : null; |
return $valeur; |
} |
public function ajouterParametre($cle, $valeur) { |
$this->parametres[$cle] = $valeur; |
} |
public function supprimerParametre($cle) { |
unset($this->parametres[$cle]); |
} |
public function nettoyerParametres() { |
$this->parametres = null; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// MÉTHODES |
public function consulter($url) { |
$retour = $this->envoyerRequete($url, 'GET'); |
return $retour; |
} |
public function ajouter($url, Array $donnees) { |
$retour = $this->envoyerRequete($url, 'PUT', $donnees); |
return $retour; |
} |
public function modifier($url, Array $donnees) { |
$retour = $this->envoyerRequete($url, 'POST', $donnees); |
return $retour; |
} |
public function supprimer($url) { |
$retour = $this->envoyerRequete($url, 'DELETE'); |
return $retour; |
} |
public function envoyerRequete($url, $mode, Array $donnees = array()) { |
$this->url = $url; |
$contenu = false; |
if (! in_array($mode, $this->http_methodes)) { |
$e = "Le mode de requête '$mode' n'est pas accepté!"; |
trigger_error($e, E_USER_WARNING); |
} else { |
if ($mode == 'GET') { |
$this->traiterUrlParametres(); |
} |
$contexte = stream_context_create(array( |
'http' => array( |
'method' => $mode, |
'header' => "Content-type: application/x-www-form-urlencoded\r\n", |
'content' => http_build_query($donnees, null, self::HTTP_URL_REQUETE_SEPARATEUR)))); |
$flux = @fopen($this->url, 'r', false, $contexte); |
if (!$flux) { |
$this->reponse_entetes = $http_response_header; |
$e = "L'ouverture de l'url '{$this->url}' par la méthode HTTP '$mode' a échoué!"; |
trigger_error($e, E_USER_WARNING); |
} else { |
// Informations sur les en-têtes et métadonnées du flux |
$this->reponse_entetes = stream_get_meta_data($flux); |
// Contenu actuel de $url |
$contenu = stream_get_contents($flux); |
fclose($flux); |
} |
$this->traiterEntete(); |
} |
$this->reinitialiser(); |
return $contenu; |
} |
private function traiterUrlParametres() { |
$parametres = array(); |
if (count($this->parametres) > 0) { |
foreach ($this->parametres as $cle => $valeur) { |
$cle = rawurlencode($cle); |
$valeur = rawurlencode($valeur); |
$parametres[] = $cle.self::HTTP_URL_REQUETE_CLE_VALEUR_SEPARATEUR.$valeur; |
} |
$url_parametres = implode(self::HTTP_URL_REQUETE_SEPARATEUR, $parametres); |
$this->url = $this->url.'?'.$url_parametres; |
} |
} |
private function traiterEntete() { |
$infos = $this->analyserEntete(); |
$this->traiterEnteteDebogage($infos); |
} |
private function analyserEntete() { |
$entetes = $this->reponse_entetes; |
$infos = array('date' => null, 'uri' => $this->url, 'debogages' => null); |
if (isset($entetes)) { |
if (isset($entetes['wrapper_data'])) { |
$entetes = $entetes['wrapper_data']; |
} |
foreach ($entetes as $entete) { |
if (preg_match('/^X_REST_DEBOGAGE_MESSAGES: (.+)$/', $entete, $match)) { |
$infos['debogages'] = json_decode($match[1]); |
} |
if (preg_match('/^Date: .+ ([012][0-9]:[012345][0-9]:[012345][0-9]) .*$/', $entete, $match)) { |
$infos['date'] = $match[1]; |
} |
} |
} |
return $infos; |
} |
private function traiterEnteteDebogage($entetes_analyses) { |
if (isset($entetes['debogages'])) { |
$date = $entetes['date']; |
$uri = $entetes['uri']; |
$debogages = $entetes['debogages']; |
foreach ($debogages as $debogage) { |
$e = "DEBOGAGE : $date - $uri :\n$debogage"; |
trigger_error($e, E_USER_NOTICE); |
} |
} |
} |
private function reinitialiser() { |
$this->nettoyerParametres(); |
} |
} |
/tags/celw-v1.1/jrest/services/InventoryImageExport.php |
---|
New file |
0,0 → 1,393 |
<?php |
Class InventoryImageExport extends DBAccessor { |
private $extendSpreadsheetProductor; |
private $archive; |
private $workbook; |
private $worksheet; |
private $chemin_export_liste; |
function InventoryImageExport($config) { |
parent::__construct($config); |
require_once('lib/zip.php'); |
$this->config=$config; |
$this->extendSpreadsheetProductor = new SpreadsheetProductor(); |
$this->extendSpreadsheetProductor->initSpreadsheet(); |
} |
function getElement($uid){ |
$this->authentifier(); |
$tableau = array(); |
$tag = $uid[0]; |
$limite = 0; |
$pas = 0; |
//ini_set('max_execution_time',120); |
/*if(isset($uid[1]) && isset($uid[2])) { |
$limite = $uid[] |
}*/ |
$taille_archive_courante = 0; |
$index_archive_courante = 0; |
$taille_max_archive = $this->config['cel_db']['taille_max_archive']; |
$liens_archives = array(); |
$DB=$this->connectDB($this->config,'cel_db'); |
$query_id_id_img = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE cmc_id_mot_cle_general = md5("'.$DB->escapeSimple($tag).'")' ; |
$res =& $DB->query($query_id_id_img); |
if (DB::isError($res)) { |
$this->logger("InventoryImageExport",'Erreur de requete '.$query_id_id_img); |
die($res->getMessage()); |
} |
$query='SELECT * FROM cel_images'; |
$premier_item = true ; |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$tableau['mots cles'] = array('utilisateur' => $row['cmc_id_proprietaire'], 'mot cle' => $row['cmc_id_mot_cle_utilisateur']); |
if($premier_item) { |
$query .= ' WHERE '; |
$premier_item = false ; |
} |
else{ |
$query .= ' OR '; |
} |
$query .= '(ci_meta_mots_cles LIKE "%'.$row['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur ="'.$row['cmc_id_proprietaire'].'")' ; |
} |
$query .= ' ORDER BY ci_meta_date_ajout' ; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
$this->logger('Requetes',$query); |
// création d'un objet 'zipfile' |
$this->archive = new zipfile(); |
$i = 1; |
$this->initialiserWorkBook($index_archive_courante); |
while ($image =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$image['ci_nom_original'] = htmlspecialchars($image['ci_nom_original']); |
$image['ci_id_image'] = htmlspecialchars($image['ci_id_image']); |
$image['ci_meta_date_ajout'] = htmlspecialchars($image['ci_meta_date_ajout']); |
$image['ci_ce_utilisateur'] = htmlspecialchars($image['ci_ce_utilisateur']); |
$image['ci_meta_user_comment'] = htmlspecialchars($image['ci_meta_user_comment']); |
$image['ci_note_image'] = htmlspecialchars($image['ci_note_image']); |
$id = $image['ci_id_image']; |
$tableau[$id]['image'] = $image; |
if($filename = $this->renvoyerCheminSurServeur($id,false)) { |
// appel de la classe |
// nom du fichier à ajouter dans l'archive |
// contenu du fichier |
$fp = fopen ($filename, 'r'); |
$content = fread($fp, filesize($filename)); |
fclose ($fp); |
// ajout du fichier dans cet objet |
if(preg_match('/\.(?:jpg|jpeg)$/i',$image['ci_nom_original'])) { |
$nom_fichier_image = preg_replace('/\.(?:jpg|jpeg)$/i','_'.$id.'.jpg', $image['ci_nom_original']); |
} else { |
$nom_fichier_image = $image['ci_nom_original'].'_'.$id.'.jpg'; |
} |
$chemin_sur_serveur = $this->config['cel_db']['url_images']; |
$id = sprintf('%09s', $id) ; |
$id = wordwrap($id, 3 , '_', true) ; |
$niveauDossier = split("_", $id) ; |
$dossierNiveau1 = $niveauDossier[0] ; |
$dossierNiveau2 = $niveauDossier[1] ; |
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ; |
$chemin_fichier = $chemin_sur_serveur_final.'/O/'.$id."_O.jpg" ; |
$obs_liee['url_image_liee'] = $chemin_fichier; |
$taille_fichier = filesize($filename); |
$req_liaison = 'SELECT * FROM cel_inventory WHERE ordre IN (SELECT coi_ce_observation FROM cel_obs_images WHERE coi_ce_image = "'.$image['ci_id_image'].'") AND identifiant = "'.$image['ci_ce_utilisateur'].'"' ; |
$res_liaison =& $DB->query($req_liaison); |
if (DB::isError($res_liaison)) { |
die($res_liaison->getMessage()); |
} |
if (DB::isError($res_liaison)) { |
die($res_liaison->getMessage()); |
} |
while($obs_liee = & $res_liaison->fetchrow(DB_FETCHMODE_ASSOC)) { |
$tableau[$id]['obs'] = $obs_liee; |
$obs_liee['nom_image_liee'] = $nom_fichier_image; |
$obs_liee['url_image_liee'] = $chemin_fichier; |
$this->ecrireLigneWorkBook($i,$obs_liee); |
$i++; |
} |
//$this->archive->addfile($content, $nom_fichier_image); |
//$taille_archive_courante += $taille_fichier; |
if($taille_archive_courante <= $taille_max_archive) { |
} else { |
// fermeture du workbook |
$this->workbook->close(); |
$i = 1; |
// ajout du fichier liste dans cet objet |
// contenu du fichier |
$fp = fopen($this->chemin_export_liste, 'r'); |
$contenu = fread($fp, filesize($this->chemin_export_liste)); |
fclose ($fp); |
$this->archive->addfile($contenu,'liste.'.md5($tag).'_'.$index_archive_courante.'.xls'); |
$liens_archives[] = $this->enregistrerArchive($this->archive,$index_archive_courante,$tag); |
$index_archive_courante++; |
$taille_archive_courante = 0; |
$this->archive = new zipfile(); |
$this->initialiserWorkBook($index_archive_courante); |
} |
} |
//$this->verifierOuRelancerExecution(); |
//$this->logger('InventoryImageExport'," Temps d'éxécution à l'image ".$id." : ".$this->getTempsEcoule()); |
} |
// fermeture du workbook |
$this->workbook->close(); |
$i = 1; |
// ajout du fichier liste dans cet objet |
// contenu du fichier |
$fp = fopen($this->chemin_export_liste, 'r'); |
$contenu = fread($fp, filesize($this->chemin_export_liste)); |
fclose ($fp); |
$this->archive->addfile($contenu,'liste.'.md5($tag).'_'.$index_archive_courante.'.xls'); |
$liens_archives[] = $this->enregistrerArchive($this->archive,$index_archive_courante,$tag); |
$index_archive_courante++; |
$j = 1; |
$sortie = '<div><ul>'; |
foreach($liens_archives as $lien) { |
$sortie .= '<li> <a href = "'.$lien.'"> Partie '.$j.'</a></li>'; |
$j++; |
} |
$sortie .= '</div></ul>'; |
//$this->logger('InventoryImageExport',count($tableau)); |
//$this->logger('InventoryImageExport',print_r($tableau,true)); |
header('Content-Type: text/html'); |
echo $sortie; |
} |
function getRessource(){ |
//$this->getElement(); |
} |
public function authentifier() { |
if (!isset($_SERVER['PHP_AUTH_USER'])) { |
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"'); |
header('HTTP/1.0 401 Unauthorized'); |
header('Content-type: text/html; charset=UTF-8'); |
echo 'Accès interdit'; |
exit; |
} else { |
if($this->verifierAcces($_SERVER['PHP_AUTH_USER'])) { |
return ; |
} |
else |
{ |
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"'); |
header('HTTP/1.0 401 Unauthorized'); |
header('Content-type: text/html; charset=UTF-8'); |
echo 'Accès interdit'; |
exit ; |
} |
} |
} |
public function verifierAcces($id) { |
$DB=$this->connectDB($this->config,'database_ident'); |
$query="SELECT ".$this->config['database_ident']['ann_id']." as name FROM ".$this->config['database_ident']['annuaire']." WHERE ".$this->config['database_ident']['ann_id']." ='".$DB->escapeSimple($id) |
."' AND ".$this->config['database_ident']['ann_pwd']." = ".$this->config['database_ident']['pass_crypt_funct']."('".$DB->escapeSimple($_SERVER['PHP_AUTH_PW'])."')" ; |
$res =& $DB->getOne($query); |
if($res == "") { |
return false ; |
} |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
return $this->isAdmin($id) ; |
} |
private function renvoyerCheminSurServeur($id,$url = true) { |
if($url) { |
$chemin_sur_serveur = $this->config['cel_db']['url_images']; |
} else { |
$chemin_sur_serveur = $this->config['cel_db']['chemin_images']; |
} |
$id = sprintf('%09s', $id) ; |
$id = wordwrap($id, 3 , '_', true) ; |
$id_fichier = $id.".jpg" ; |
$niveauDossier = split("_", $id) ; |
$dossierNiveau1 = $niveauDossier[0] ; |
$dossierNiveau2 = $niveauDossier[1] ; |
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ; |
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ; |
return $chemin_fichier; |
} |
private function renvoyerCheminExport($url = true) { |
if($url) { |
return $this->config['cel_db']['url_export']; |
} else { |
return $this->config['cel_db']['chemin_export']; |
} |
} |
private function enregistrerArchive($zip,$index,$tag) { |
// production de l'archive' Zip |
$this->archive = $zip->file(); |
$chemin_export = $this->renvoyerCheminExport(false); |
$url_export = $this->renvoyerCheminExport(true); |
$chemin_archive = $chemin_export.'/'.md5($tag).'_'.$index.'.zip'; |
$url_archive = $url_export.'/'.md5($tag).'_'.$index.'.zip'; |
$fp = fopen($chemin_archive,'w+'); |
$ecriture = fwrite($fp,$this->archive); |
fclose($fp); |
if($ecriture) { |
return $url_archive; |
} else { |
return false; |
} |
} |
private function initialiserWorkBook($index) { |
// Creating a workbook |
$this->chemin_export_liste = $this->renvoyerCheminExport(false).'/liste'.$index.'.xls'; |
$this->workbook = new Spreadsheet_Excel_Writer($this->chemin_export_liste); |
// Creating a worksheet |
$this->worksheet = $this->workbook->addWorksheet('Liste'); |
$this->worksheet->write(0,0,'url de l\'image'); |
$this->worksheet->write(0,1,'Nom original de l\'image'); |
//$this->worksheet->write(0,1,'Nom saisi'); |
//$this->worksheet->write(0,2,'Numero nomenclatural'); |
$this->worksheet->write(0,2,'Nom retenu'); |
$this->worksheet->write(0,3,'Numero nomenclatural nom retenu'); |
$this->worksheet->write(0,4,'Numero taxonomique'); |
$this->worksheet->write(0,5,'Famille'); |
//$this->worksheet->write(0,7,'Commune'); |
//$this->worksheet->write(0,8,'Identifiant Commune'); |
$this->worksheet->write(0,6,'Date Observation'); |
// $this->worksheet->write(0,10,'Lieu dit'); |
//$this->worksheet->write(0,11,'Station'); |
//$this->worksheet->write(0,12,'Milieu'); |
$this->worksheet->write(0,7,'Contributeur'); |
$this->worksheet->write(0,8,'Commentaire'); |
} |
private function ecrireLigneWorkBook($index, $observation) { |
$this->worksheet->write($index,0,$observation['url_image_liee']); |
$this->worksheet->write($index,1,$observation['nom_image_liee']); |
//$this->worksheet->write($index,1,$observation['nom_sel']); |
//$this->worksheet->write($index,2,$observation['num_nom_sel']); |
$this->worksheet->write($index,2,$observation['nom_ret']); |
$this->worksheet->write($index,3,$observation['num_nom_ret']); |
$this->worksheet->write($index,4,$observation['num_taxon']); |
$this->worksheet->write($index,5,$observation['famille']); |
//$this->worksheet->write($index,7,$observation['location']); |
//$this->worksheet->write($index,8,$observation['id_location']); |
$this->worksheet->write($index,6,$observation['date_observation']); |
//$this->worksheet->write($index,10,$observation['lieudit']); |
//$this->worksheet->write($index,11,$observation['station']); |
//$this->worksheet->write($index,12,$observation['milieu']); |
$this->worksheet->write($index,7,$observation['identifiant']); |
$this->worksheet->write($index,8,$observation['commentaire']); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.5 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.4 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/CelStatistique.php |
---|
New file |
0,0 → 1,1085 |
<?php |
/** |
* Service fournissant des urls vers des images de graphiques sur les statistiques de l'application CEL. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* /CelStatistique/TypeDeGraph : retourne le graphique demandé |
* Paramêtres : |
* serveur=[0-9] : retourne le graphique demandé sur le serveur numéro 0 à 9 (voir http://code.google.com/intl/fr/apis/chart/docs/making_charts.html#enhancements ) |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright 2009 |
*/ |
class CelStatistique extends Cel { |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($param) { |
$graph = null; |
$serveur = ''; |
if (isset($param[0])) { |
$graph_demande = array_shift($param); |
$methode = 'get'.$graph_demande; |
if (method_exists($this, $methode)) { |
$graph = $this->$methode($param); |
} else { |
$this->messages[] = "Ce type de graphique '$graph_demande' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Le premier paramêtre du service CEL Statistique doit correspondre au type de graphique."; |
} |
if (!is_null($graph)) { |
$serveur = (isset($_GET['serveur']) && preg_match('/^[0-9]$/', $_GET['serveur'])) ? $_GET['serveur'].'.' : ''; |
$url = "http://{$serveur}chart.apis.google.com/chart"; |
$contexte = stream_context_create( |
array('http' => array( |
'method' => 'POST', |
'content' => http_build_query($graph)))); |
$image = file_get_contents($url, false, $contexte); |
$this->envoyer($image, 'image/png', null, false); |
} else { |
$info = 'Un problème est survenu : '.print_r($this->messages, true); |
$this->envoyer($info); |
} |
} |
private function getEvolImgLieesParMois($param) { |
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null; |
// Récupération des données |
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m') AS periode, COUNT(ci_id_image) AS nbre ". |
"FROM cel_obs_images LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) ". |
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ". |
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : ''). |
'GROUP BY periode '. |
'ORDER BY periode '; |
$resulats = $this->executerRequete($requete); |
$img_totale = array(); |
foreach ($resulats as $info) { |
$img_totale[$info['periode']] = $info['nbre']; |
} |
// Trie des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
$les_mois = array(); |
$pas = 3; // intervalle de mois entre deux étiquettes |
$periode = 0; |
$cumul = 0; |
$img_totale_cumul = array(); |
foreach ($img_totale as $annee_mois => $nbre) { |
$annee = substr($annee_mois, 0, 4); |
$mois = substr($annee_mois, 4, 2); |
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01")); |
$cumul += $nbre; |
$img_totale_cumul[$annee_mois] = $cumul; |
if (!isset($dates[$annee][$mois])) { |
$annees[] = (!isset($dates[$annee]) ? $annee : ''); |
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; |
// Ajouter au tableau dates tjrs à la fin |
$dates[$annee][$mois] = 1; |
} |
} |
// Post traitement des données |
$titre = "Évolution des images liées aux observations par mois"; |
$valeurs_y = implode(',', $img_totale); |
$valeurs_r = implode(',', $img_totale_cumul); |
$valeurs_max_y = (count($img_totale) > 0 ) ? max($img_totale) : 0; |
$valeurs_max_r = (count($img_totale_cumul) > 0 ) ? max($img_totale_cumul) : 0; |
$y_val_fin = $valeurs_max_y; |
$y_pas = round(($valeurs_max_y / 6), 0); |
$r_val_fin = $valeurs_max_r; |
$r_pas = round(($valeurs_max_r / 6), 0); |
$etiquettes_x1 = implode('|', $les_mois); |
$etiquettes_x2 = implode('|', $annees); |
$etiquettes_y = 'Images'; |
$etiquettes_r2 = 'Cumul'; |
// Construire de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '007F00,99CC00', |
'chd' => 't:'.$valeurs_y.'|'.$valeurs_r, |
'chds' => "0,$valeurs_max_y,0,$valeurs_max_r", |
'chxt' => 'y,y,x,x,r,r', |
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'|5:|'.$etiquettes_r2, |
'chxp' => '1,50|3,0|5,50', |
'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas", |
'chm' => 'N ** ,000000,0,-1,8,1.0,ht', |
'chxs' => '0,007F00|1,007F00|4,99CC00|5,99CC00'); |
return $graph; |
} |
private function getEvolImgParMois($param) { |
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null; |
// Récupération des données |
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m') AS periode, COUNT(ci_id_image) AS nbre ". |
"FROM cel_images ". |
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ". |
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : ''). |
'GROUP BY periode '. |
'ORDER BY periode '; |
$resulats = $this->executerRequete($requete); |
$img_totale = array(); |
foreach ($resulats as $info) { |
$img_totale[$info['periode']] = $info['nbre']; |
} |
// Trie des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
$les_mois = array(); |
$pas = 3; // intervalle de mois entre deux étiquettes |
$periode = 0; |
$cumul = 0; |
$img_totale_cumul = array(); |
foreach ($img_totale as $annee_mois => $nbre) { |
$annee = substr($annee_mois, 0, 4); |
$mois = substr($annee_mois, 4, 2); |
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01")); |
$this->debug[] = $mois."/".$mois_fmt_B; |
$cumul += $nbre; |
$img_totale_cumul[$annee_mois] = $cumul; |
if (!isset($dates[$annee][$mois])) { |
$annees[] = (!isset($dates[$annee]) ? $annee : ''); |
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; |
// Ajouter au tableau dates tjrs à la fin |
$dates[$annee][$mois] = 1; |
} |
} |
// Post traitement des données |
$titre = "Évolution du dépôt d'images par mois"; |
$valeurs_y = implode(',', $img_totale); |
$valeurs_r = implode(',', $img_totale_cumul); |
$valeurs_max_y = (count($img_totale) > 0 ) ? max($img_totale) : 0; |
$valeurs_max_r = (count($img_totale_cumul) > 0 ) ? max($img_totale_cumul) : 0; |
$y_val_fin = $valeurs_max_y; |
$y_pas = round(($valeurs_max_y / 6), 0); |
$r_val_fin = $valeurs_max_r; |
$r_pas = round(($valeurs_max_r / 6), 0); |
$etiquettes_x1 = implode('|', $les_mois); |
$etiquettes_x2 = implode('|', $annees); |
$etiquettes_y = 'Images'; |
$etiquettes_r2 = 'Cumul'; |
// Construire de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '007F00,99CC00', |
'chd' => 't:'.$valeurs_y.'|'.$valeurs_r, |
'chds' => "0,$valeurs_max_y,0,$valeurs_max_r", |
'chxt' => 'y,y,x,x,r,r', |
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'|5:|'.$etiquettes_r2, |
'chxp' => '1,50|3,0|5,50', |
'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,-1,8,1.0,ht', |
'chxs' => '0,007F00|1,007F00|4,99CC00|5,99CC00'); |
return $graph; |
} |
private function getEvolImgParMoisGlissant($param) { |
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null; |
// Récupération des données |
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m%d') AS periode, COUNT(ci_id_image) AS nbre ". |
"FROM cel_images ". |
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ". |
' AND ci_meta_date_ajout > DATE_SUB(NOW(), INTERVAL 31 DAY) '. |
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : ''). |
'GROUP BY periode '. |
'ORDER BY periode '; |
$resultats = $this->executerRequete($requete); |
// Traitement du resultat |
$img_totale = array(); |
if ($resultats !== false) { |
foreach ($resultats as $info) { |
$img_totale[$info['periode']] = $info['nbre']; |
} |
} |
// Trie des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
$annees_mois = array(); |
$jours = array(); |
foreach ($img_totale as $annee_mois_jours => $nbre) { |
$annee = substr($annee_mois_jours, 0, 4); |
$mois = substr($annee_mois_jours, 4, 2); |
$jour = substr($annee_mois_jours, 6, 2); |
$annee_mois_fmt_B = strftime('%B %Y', mktime(0, 0, 0, $mois, 1, $annee)); |
if (!isset($dates[$annee][$mois][$jour])) { |
$annees_mois[] = (!isset($dates[$annee][$mois]) ? $annee_mois_fmt_B : ''); |
$jours[] = $jour; |
// Ajouter au tableau dates tjrs à la fin |
$dates[$annee][$mois][$jour] = 1; |
} |
} |
// Post traitement des données |
$titre = "Évolution du dépôt d'images sur un mois glissant"; |
$valeurs_max = (count($img_totale) > 0) ? max($img_totale) : 0; |
$valeurs = implode(',', $img_totale); |
$y_val_fin = $valeurs_max; |
$y_pas = round($valeurs_max / 6); |
$etiquettes_x1 = implode('|', $jours); |
$etiquettes_x2 = implode('|', $annees_mois); |
$etiquettes_y2 = 'Images'; |
// Construction de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '007F00', |
'chd' => 't:'.$valeurs, |
'chds' => '0,'.$valeurs_max, |
'chxt' => 'y,y,x,x', |
'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2, |
'chxp' => '0,0|1,50', |
'chxr' => "0,0,$y_val_fin,$y_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht', |
'chxs' => '0,007F00|1,007F00'); |
$this->debug[] = $graph; |
return $graph; |
} |
private function getEvolImgParAn($param) { |
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : null; |
// Récupération des données |
$requete = "SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y') AS periode, COUNT(ci_id_image) AS nbre ". |
"FROM cel_images ". |
"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ". |
((isset($utilisateur)) ? " AND ci_ce_utilisateur = $utilisateur " : ''). |
'GROUP BY periode '. |
'ORDER BY periode '; |
$resulats = $this->executerRequete($requete); |
$img_totale = array(); |
foreach ($resulats as $info) { |
$img_totale[$info['periode']] = $info['nbre']; |
} |
// Trie des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
foreach ($img_totale as $annee => $nbre) { |
if (!isset($dates[$annee])) { |
$annees[] = $annee; |
$dates[$annee] = 1; |
} |
} |
// Post traitement des données |
$titre = "Évolution du dépôt d'images par année"; |
$valeurs = implode(',', $img_totale); |
$valeurs_max = (count($img_totale) > 0) ? max($img_totale) : 0; |
$valeurs_min = (count($img_totale) > 0) ? min($img_totale) : 0; |
$y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min); |
$y_val_fin = $valeurs_max; |
$y_pas = round(($valeurs_max / 6), 0); |
$etiquettes_x = implode('|', $annees);; |
$etiquettes_y = 'Images'; |
// Construire de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '007F00', |
'chd' => 't:'.$valeurs, |
'chds' => "$valeurs_min,$valeurs_max", |
'chxt' => 'y,y,x', |
'chxl' => '1:|'.$etiquettes_y.'|2:|'.$etiquettes_x.'', |
'chxp' => '0,0|1,50|2,0', |
'chxr' => "0,$y_val_deb,$y_val_fin,$y_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht', |
'chxs' => '0,007F00|1,007F00'); |
return $graph; |
} |
private function getEvolUtilisateurParMois($param) { |
// Récupération des données |
$requete = 'SELECT DISTINCT identifiant , '. |
' MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '. |
' COUNT(id) AS obs_nbre '. |
'FROM cel_inventory '. |
"WHERE date_creation != '0000-00-00 00:00:00' ". |
" AND identifiant LIKE '%@%' ". |
'GROUP BY identifiant '. |
'ORDER BY date_min ASC '; |
$resultats = $this->executerRequete($requete); |
// Trie des données et des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
$utilisateurs = array(); |
$les_mois = array(); |
$pas = 3; // intervalle de mois entre deux étiquettes |
$periode = 0; |
foreach ($resultats as $enrg) { |
$annee = substr($enrg['date_min'], 0, 4); |
$mois = substr($enrg['date_min'], 5, 2); |
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01")); |
if (!isset($dates[$annee][$mois])) { |
$annees[] = (!isset($dates[$annee]) ? $annee : ''); |
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; |
$utilisateurs["$annee-$mois"] = 1; |
// Ajouter au tableau dates tjrs à la fin |
$dates[$annee][$mois] = 1; |
} else { |
$utilisateurs["$annee-$mois"]++; |
} |
} |
// Post traitement des données |
$titre = 'Évolution des utilisateurs par mois'; |
$valeurs = implode(',', $utilisateurs); |
$valeurs_max = max($utilisateurs); |
$y_val_fin = $valeurs_max; |
$y_pas = 5; |
$etiquettes_x1 = implode('|', $les_mois); |
$etiquettes_x2 = implode('|', $annees); |
$etiquettes_y = 'Utilisateurs'; |
// Construire de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '0000FF',//4D89F9 |
'chd' => 't:'.$valeurs, |
'chds' => '0,'.$valeurs_max, |
'chxt' => 'y,y,x,x', |
'chxl' => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'', |
'chxp' => '1,50|3,0', |
'chxr' => "0,0,$y_val_fin,$y_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,2::2,8,1.0,ht', |
'chxs' => '0,0000FF|1,0000FF'); |
return $graph; |
} |
private function getEvolObsParMoisGlissant($param) { |
// Récupération des données |
$format_date = '%Y%m%d'; |
$where = 'date_creation > DATE_SUB(NOW(), INTERVAL 31 DAY)'; |
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id', $format_date, $where); |
// Trie des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
$annees_mois = array(); |
$jours = array(); |
foreach ($obs_totale as $annee_mois_jours => $nbre) { |
$annee = substr($annee_mois_jours, 0, 4); |
$mois = substr($annee_mois_jours, 4, 2); |
$jour = substr($annee_mois_jours, 6, 2); |
$annee_mois_fmt_B = strftime('%B %Y', mktime(0, 0, 0, $mois, 1, $annee)); |
if (!isset($dates[$annee][$mois][$jour])) { |
$annees_mois[] = (!isset($dates[$annee][$mois]) ? $annee_mois_fmt_B : ''); |
$jours[] = $jour; |
// Ajouter au tableau dates tjrs à la fin |
$dates[$annee][$mois][$jour] = 1; |
} |
} |
// Post traitement des données |
$titre = 'Évolution des observations sur un mois glissant'; |
$valeurs_max = (count($obs_totale) > 0 ) ? max($obs_totale) : 0; |
$valeurs = implode(',', $obs_totale); |
$y_val_fin = $valeurs_max; |
$y_pas = round($valeurs_max / 6); |
$etiquettes_x1 = implode('|', $jours); |
$etiquettes_x2 = implode('|', $annees_mois); |
$etiquettes_y2 = 'Observations'; |
// Construction de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '822013', |
'chd' => 't:'.$valeurs, |
'chds' => '0,'.$valeurs_max, |
'chxt' => 'y,y,x,x', |
'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2, |
'chxp' => '0,0|1,50', |
'chxr' => "0,0,$y_val_fin,$y_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht', |
'chxs' => '0,822013|1,822013'); |
return $graph; |
} |
private function getEvolObsParMois($param) { |
// Récupération des données |
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id'); |
// Trie des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
$les_mois = array(); |
$pas = 3; // intervalle de mois entre deux étiquettes |
$periode = 0; |
$cumul = 0; |
$obs_totale_cumul = array(); |
foreach ($obs_totale as $annee_mois => $nbre) { |
$annee = substr($annee_mois, 0, 4); |
$mois = substr($annee_mois, 4, 2); |
$mois_fmt_B = strftime('%b', strtotime("1999-$mois-01")); |
$cumul += $nbre; |
$obs_totale_cumul[$annee_mois] = $cumul; |
if (!isset($dates[$annee][$mois])) { |
$annees[] = (!isset($dates[$annee]) ? $annee : ''); |
$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : ''; |
// Ajouter au tableau dates tjrs à la fin |
$dates[$annee][$mois] = 1; |
} |
} |
// Post traitement des données |
$titre = 'Évolution des observations par mois'; |
$valeurs_y = implode(',', $obs_totale); |
$valeurs_r = implode(',', $obs_totale_cumul); |
$valeurs_max_y = (count($obs_totale) > 0 ) ? max($obs_totale) : 0; |
$valeurs_max_r = (count($obs_totale_cumul) > 0 ) ? max($obs_totale_cumul) : 0; |
$y_val_fin = $valeurs_max_y; |
$y_pas = round(($valeurs_max_y / 6), 0); |
$r_val_fin = $valeurs_max_r; |
$r_pas = round(($valeurs_max_r / 6), 0); |
$etiquettes_x1 = implode('|', $les_mois); |
$etiquettes_x2 = implode('|', $annees); |
$etiquettes_y2 = 'Observations'; |
$etiquettes_r2 = 'Cumul'; |
// Construire de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '822013,F1841D', |
'chd' => 't:'.$valeurs_y.'|'.$valeurs_r, |
'chds' => "0,$valeurs_max_y,0,$valeurs_max_r", |
'chxt' => 'y,y,x,x,r,r', |
'chxl' => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2.'|5:|'.$etiquettes_r2.'', |
'chxp' => '1,50|3,0|5,50', |
'chxr' => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas", |
'chm' => 'N ** ,000000,0,2::2,8,1.0,ht', |
'chxs' => '0,822013|1,822013|4,F1841D|5,F1841D'); |
return $graph; |
} |
private function getEvolObsParAn($param) { |
// Récupération des données |
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id', '%Y'); |
// Trie des dates pour les étiquettes des axes |
$dates = array(); |
$annees = array(); |
foreach ($obs_totale as $annee => $nbre) { |
if (!isset($dates[$annee])) { |
$annees[] = $annee; |
$dates[$annee] = 1; |
} |
} |
// Post traitement des données |
$titre = 'Évolution des observations par année'; |
$valeurs = implode(',', $obs_totale); |
$valeurs_max = (count($obs_totale) > 0 ) ? max($obs_totale) : 0; |
$valeurs_min = (count($obs_totale) > 0 ) ? min($obs_totale) : 0; |
$y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min); |
$y_val_fin = $valeurs_max; |
$y_pas = round(($valeurs_max / 6), 0); |
$etiquettes_x = implode('|', $annees);; |
$etiquettes_y = 'Observations'; |
// Construire de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '600x200', |
'chco' => '822013', |
'chd' => 't:'.$valeurs, |
'chds' => "$valeurs_min,$valeurs_max", |
'chxt' => 'y,y,x', |
'chxl' => '1:|'.$etiquettes_y.'|2:|'.$etiquettes_x.'', |
'chxp' => '0,0|1,50|2,0', |
'chxr' => "0,$y_val_deb,$y_val_fin,$y_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht', |
'chxs' => '0,822013|1,822013'); |
return $graph; |
} |
private function getEvolObsHisto($param) { |
// Récupération des données |
$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id'); |
$obs_identifiee = $this->executerRequeteEvol('cel_inventory', 'id', "identifiant LIKE '%@%' "); |
$lignes = array('total', 'obs. identifiée'); |
// Post traitement des données |
$titre = 'Évolution des observations'; |
$valeurs = implode(',', $obs_totale).'|'.implode(',', $obs_identifiee); |
$valeurs_max = (count($obs_totale) > 0 ) ? max($obs_totale) : 0; |
$etiquettes = implode('|', array_keys($lignes)); |
// Construire de l'url de l'image |
$graph = array('cht' => 'lc', |
'chtt' => $titre, |
'chs' => '500x300', |
'chco' => 'FF0000,00FF00', |
'chd' => 't:'.$valeurs, |
'chds' => "0,$valeurs_max", |
'chxt' => 'y', |
'chxl' => '0:|'.$etiquettes.'', |
'chm' => 'N,000000,0,-1,10'); |
return $graph; |
} |
private function getNbreObsIdVsTest($param) { |
// Récupération des données |
$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id'); |
$obs_identifiee = $this->executerRequeteNombre('cel_inventory', 'id', "identifiant LIKE '%@%' "); |
$obs_test = $obs_totale - $obs_identifiee; |
$pourcent_identifiee = round(($obs_identifiee / ($obs_totale / 100)), 2).'%'; |
$pourcent_anonyme = round(($obs_test / ($obs_totale / 100)), 2).'%'; |
// Post traitement des données de la base de données |
$titre = "Nombre d'observations|tests vs. identifiées"; |
$etiquette_obs_test = "tests ($obs_test - $pourcent_anonyme)"; |
$etiquette_obs_id = "identifiées ($obs_identifiee - $pourcent_identifiee)"; |
$donnees = array($etiquette_obs_test => $obs_test, $etiquette_obs_id => $obs_identifiee); |
$valeurs = implode(',', $donnees); |
$etiquettes = implode('|', array_keys($donnees)); |
// Construire les paramêtres de l'url de l'image |
$graph = array('cht' => 'p3', |
'chtt' => $titre, |
'chs' => '250x200', |
'chco' => 'FF0000,00FF00', |
'chd' => 't:'.$valeurs, |
'chds' => "0,$obs_totale", |
'chdl' => $etiquettes, |
'chdlp' => 'bv|r', |
'chts' => '000000,12'); |
return $graph; |
} |
private function getNbreObsPublicVsPrivee($param) { |
// Récupération des données |
$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id'); |
$obs_public = $this->executerRequeteNombre('cel_inventory', 'id', 'transmission = 1'); |
$obs_privee = $obs_totale - $obs_public; |
$pourcent_privee = round(($obs_privee / ($obs_totale / 100)), 2).'%'; |
$pourcent_public = round(($obs_public / ($obs_totale / 100)), 2).'%'; |
// Post traitement des données de la base de données |
$titre = "Nombre d'observations|publiques vs. privées"; |
$etiquette_obs_public = "publiques ($obs_public - $pourcent_public)"; |
$etiquette_obs_privee = "privées ($obs_privee - $pourcent_privee)"; |
$donnees = array($etiquette_obs_privee => $obs_privee, $etiquette_obs_public => $obs_public); |
$valeurs = implode(',', $donnees); |
$etiquettes = implode('|', array_keys($donnees)); |
// Construire les paramêtres du graph |
$graph = array('cht' => 'p3', |
'chtt' => $titre, |
'chs' => '250x200', |
'chco' => 'FF0000,00FF00', |
'chd' => 't:'.$valeurs, |
'chds' => "0,$obs_totale", |
'chdl' => $etiquettes, |
'chdlp' => 'bv|r', |
'chts' => '000000,12'); |
return $graph; |
} |
private function getNbreObsDetermineeVsInconnue($param) { |
// Récupération des données |
$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id'); |
$obs_determinee = $this->executerRequeteNombre('cel_inventory', 'id', 'num_nom_sel != 0'); |
$obs_inconnue = $obs_totale - $obs_determinee; |
$pourcent_determinee = round(($obs_determinee / ($obs_totale / 100)), 2).'%'; |
$pourcent_inconnue = round(($obs_inconnue / ($obs_totale / 100)), 2).'%'; |
// Post traitement des données de la base de données |
$titre = "Nombre d'observations|determinées vs. inconnues"; |
$etiquette_obs_determinee = "determinées ($obs_determinee - $pourcent_determinee)"; |
$etiquette_obs_inconnue = "non déterminées ($obs_inconnue - $pourcent_inconnue)"; |
$donnees = array($etiquette_obs_inconnue => $obs_inconnue, $etiquette_obs_determinee => $obs_determinee); |
$valeurs = implode(',', $donnees); |
$etiquettes = implode('|', array_keys($donnees)); |
// Construire les paramêtres du graph |
$graph = array('cht' => 'p3', |
'chtt' => $titre, |
'chs' => '250x200', |
'chco' => 'FF0000,00FF00', |
'chd' => 't:'.$valeurs, |
'chds' => "0,$obs_totale", |
'chdl' => $etiquettes, |
'chdlp' => 'bv|r', |
'chts' => '000000,12'); |
return $graph; |
} |
private function getNbreObsAvecIndicationGeo($param) { |
// Récupération des données |
$total = $this->executerRequeteNombre('cel_inventory', 'id'); |
$where_commune = $this->creerWhereIndicationGeo('location'); |
$obs['commune'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_commune); |
$where_commune_id = $this->creerWhereIndicationGeo('id_location'); |
$obs['commune identifiée'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_commune_id); |
$where_lieudit = $this->creerWhereIndicationGeo('lieudit'); |
$obs['lieu-dit'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_lieudit); |
$where_station = $this->creerWhereIndicationGeo('station'); |
$obs['station'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_station); |
$where_milieu = $this->creerWhereIndicationGeo('milieu'); |
$obs['milieu'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_milieu); |
$where_xy = $this->creerWhereIndicationGeo('coord_x').' AND '.$this->creerWhereIndicationGeo('coord_y'); |
$obs['coordonnée'] = $this->executerRequeteNombre('cel_inventory', 'id', $where_xy); |
$donnees = array(); |
$num = 1; |
foreach ($obs as $etiquette => $nbre) { |
$pourcent = round(($obs[$etiquette] / ($total / 100)), 1).'%'; |
$legende = "$num : $etiquette ($nbre - $pourcent)"; |
$donnees['valeurs'][] = $nbre; |
$donnees['etiquettes'][] = $num++; |
$donnees['legendes'][] = $legende; |
} |
// Post traitement des données de la base de données |
$titre = "Nombre d'observations|avec indications géographiques"; |
$valeurs = implode(',', $donnees['valeurs']); |
$etiquettes = implode('|', $donnees['etiquettes']); |
$legendes = implode('|', $donnees['legendes']); |
// Construire les paramêtres du graph |
$graph = array('cht' => 'rs', |
'chtt' => $titre, |
'chs' => '600x300', |
'chco' => 'FFFFFF', |
'chd' => 't:'.$valeurs, |
'chds' => "0,$total", |
'chdl' => $legendes, |
'chxt' => 'x', |
'chxl' => "0:|$etiquettes", |
//'chxp' => '1,0,20,40,60,80,100',// Grille sous forme de cible |
'chm' => 'B,FF000080,0,1.0,5.0'); |
return $graph; |
} |
private function creerWhereIndicationGeo($champ) { |
$where = null; |
if (isset($champ)) { |
$where = "$champ != '000null' ". |
"AND $champ != '' ". |
"AND $champ IS NOT NULL "; |
} |
return $where; |
} |
private function getUtilisationJournaliere($param) { |
// Sur quel jour, voulons nous estimer l'utilisation |
$aujourdhui = date('Y-m-d'); |
if (isset($param[0]) && preg_match('/^[0-9]{4}(?:-[0-9]{2}){2}$/', $param[0])) { |
$aujourdhui = $param[0]; |
} |
$aujourdhui_fmt = strftime('%d %b %Y', strtotime($aujourdhui)); |
// Récupération des données |
$max_obs = array(); |
$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d', |
"date_creation NOT LIKE '$aujourdhui%' ", 'date_creation'); |
$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d', |
"date_modification NOT LIKE '$aujourdhui%' ", 'date_modification'); |
$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d', |
"date_transmission NOT LIKE '$aujourdhui%' ", 'date_transmission'); |
$obs_aujourdhui = $this->executerRequeteNombre('cel_inventory', 'id', |
"(date_creation LIKE '$aujourdhui%' |
OR date_modification LIKE '$aujourdhui%' |
OR date_transmission LIKE '$aujourdhui%') "); |
// Cummul des obs crées, modifiées, transmises par jour |
$donnees = array(); |
foreach ($max_obs as $obs_par_jour) { |
foreach ($obs_par_jour as $annee_mois_jour => $nbre) { |
if (!isset($donnees[$annee_mois_jour])) { |
$donnees[$annee_mois_jour] = $nbre; |
} else { |
$donnees[$annee_mois_jour] += $nbre; |
} |
} |
} |
// Post traitement des données |
$valeur = $obs_aujourdhui; |
$valeur_max = 400; |
if ($valeur > $valeur_max) { |
$pourcentage = 100; |
} else { |
$pourcentage = round(($valeur / ($valeur_max / 100)), 0); |
} |
$etiquettes_x = $aujourdhui_fmt; |
$etiquettes_y = "faible|moyenne|forte"; |
$titre = "Intensité d'utilisation pour le $aujourdhui_fmt"; |
$legende = "$valeur changements"; |
// Construire de l'url de l'image |
$graph = array('cht' => 'gom', |
'chtt' => $titre, |
'chdl' => "$legende", |
'chdlp' => 'b', |
'chs' => '350x200', |
'chco' => 'FFFF00,0A7318', |
'chls' => '3|10', |
'chma' => '0,0,0,0|300,40', |
'chd' => 't:'.$pourcentage, |
'chxt' => 'x,y', |
'chxl' => '0:|'.$etiquettes_x.'|1:|'.$etiquettes_y.'', |
'chxp' => '0,50'); |
return $graph; |
} |
private function getNbreObsParUtilisateur($param) { |
// Récupération des données |
$requete = 'SELECT identifiant, COUNT(id) AS nbre '. |
'FROM cel_inventory '. |
'GROUP BY identifiant '; |
$utilisateurs = $this->executerRequete($requete); |
// Création des classes d'utilisateurs |
$classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0); |
$donnees['Utilisateurs'] = $classes; |
$valeur_max = 0; |
foreach ($utilisateurs as $utilisateur) { |
$id = $utilisateur['identifiant']; |
$nbre = $utilisateur['nbre']; |
// Détermination de la classe |
$classe = ''; |
if (0 < $nbre && $nbre <= 10) { |
$classe = '00->10'; |
} else if (10 < $nbre && $nbre <= 50) { |
$classe = '11->50'; |
} else if (50 < $nbre && $nbre <= 100) { |
$classe = '51->100'; |
} else if (100 < $nbre && $nbre <= 500) { |
$classe = '101->500'; |
} else if (500 < $nbre) { |
$classe = '500->∞'; |
} |
// Détermination du type d'utilisateur |
if (strstr($id, '@')) { |
$type = 'Utilisateurs'; |
// Incrémentation du tableau de données et récupration de la valeur max |
$donnees[$type][$classe]++; |
if ($donnees[$type][$classe] > $valeur_max) { |
$valeur_max = $donnees[$type][$classe]; |
} |
} |
} |
// Post traitement des données |
$titre = "Nombre d'observations par utilisateur"; |
$y1_val_fin = $valeur_max; |
$y1_pas = '100'; |
$valeurs = implode(',', $donnees['Utilisateurs']); |
$etiquettes_x1 = implode('|', array_keys($classes)); |
$etiquettes_x2 = 'Observations'; |
$etiquettes_y2 = 'Utilisateurs'; |
$legendes = implode('|', array_keys($donnees)); |
// Construire de l'url de l'image |
$graph = array('cht' => 'bvg', |
'chtt' => $titre, |
'chs' => '400x200', |
'chco' => '00FF00,FF0000', |
'chbh' => 'r,0.3,1', |
'chd' => 't:'.$valeurs, |
'chds' => "0,$valeur_max", |
'chxt' => 'x,x,y,y', |
'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'', |
'chxp' => '1,100|3,100', |
'chxr' => "2,0,$y1_val_fin,$y1_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e'); |
//echo '<pre>'.print_r($graph,true).'</pre>'; |
return $graph; |
} |
private function getNbreObsParUtilisateurEtTest($param) { |
// Récupération des données |
$requete = 'SELECT identifiant, COUNT(id) AS nbre '. |
'FROM cel_inventory '. |
'GROUP BY identifiant '; |
$utilisateurs = $this->executerRequete($requete); |
// Création des classes d'utilisateurs |
$classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0); |
$donnees['Utilisateurs'] = $classes; |
$donnees['Tests'] = $classes; |
$valeur_max = 0; |
foreach ($utilisateurs as $utilisateur) { |
$id = $utilisateur['identifiant']; |
$nbre = $utilisateur['nbre']; |
// Détermination de la classe |
$classe = ''; |
if (0 < $nbre && $nbre <= 10) { |
$classe = '00->10'; |
} else if (10 < $nbre && $nbre <= 50) { |
$classe = '11->50'; |
} else if (50 < $nbre && $nbre <= 100) { |
$classe = '51->100'; |
} else if (100 < $nbre && $nbre <= 500) { |
$classe = '101->500'; |
} else if (500 < $nbre) { |
$classe = '500->∞'; |
} |
// Détermination du type d'utilisateur |
if (strstr($id, '@')) { |
$type = 'Utilisateurs'; |
} else { |
$type = 'Tests'; |
} |
// Incrémentation du tableau de données et récupration de la valeur max |
$donnees[$type][$classe]++; |
if ($donnees[$type][$classe] > $valeur_max) { |
$valeur_max = $donnees[$type][$classe]; |
} |
} |
// Post traitement des données |
$titre = "Nombre d'observations par utilisateur et test"; |
$y1_val_fin = $valeur_max; |
$y1_pas = '100'; |
$valeurs = implode(',', $donnees['Utilisateurs']).'|'.implode(',', $donnees['Tests']); |
$etiquettes_x1 = implode('|', array_keys($classes)); |
$etiquettes_x2 = 'Observations'; |
$etiquettes_y2 = 'Utilisateurs'; |
$legendes = implode('|', array_keys($donnees)); |
// Construire de l'url de l'image |
$graph = array('cht' => 'bvg', |
'chtt' => $titre, |
'chs' => '400x200', |
'chco' => '00FF00,FF0000', |
'chbh' => 'r,0.3,1', |
'chd' => 't:'.$valeurs, |
'chds' => "0,$valeur_max", |
'chxt' => 'x,x,y,y', |
'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'', |
'chxp' => '1,100|3,100', |
'chxr' => "2,0,$y1_val_fin,$y1_pas", |
'chm' => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e|N,000000,1,0::1,8,1.0,e', |
'chdl' => $legendes, |
'chdlp' => 'b'); |
//echo '<pre>'.print_r($graph,true).'</pre>'; |
return $graph; |
} |
private function getNuagePointsObsParHeureEtJourSemaine($param) { |
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : false; |
// Récupération des données de la base |
$requete = 'SELECT identifiant, DATE_FORMAT(date_creation, "%w-%H") AS periode, (ROUND(LOG10(COUNT(id))) + 1) AS nbre '. |
'FROM cel_inventory '. |
'WHERE date_creation != "0000-00-00 00:00:00" '. |
' AND identifiant '.($utilisateur ? "= $utilisateur " : 'LIKE "%@%" '). |
'GROUP BY periode, identifiant '; |
$infos = $this->executerRequete($requete); |
// Traitement résulat requête |
$observations = array(); |
foreach ($infos as $info) { |
if (isset($observations[$info['periode']])) { |
$observations[$info['periode']] += $info['nbre']; |
} else { |
$observations[$info['periode']] = $info['nbre']; |
} |
} |
// Postraitement des données |
// Jour de la semaine |
$donnees['joursSemaine'] = array(); |
for ($njs = 0; $njs < 7; $njs++) { |
$donnees['joursSemaine'][] = strftime('%A', strtotime('2010-05-'.(16+$njs))); |
} |
// Heure |
$donnees['heures'] = array(); |
for ($h = 0; $h < 24; $h++) { |
$heure_fmt = sprintf('%02s', $h);// Format numérique 00 |
$donnees['heures'][] = strftime('%H', strtotime("0000-00-00 $heure_fmt:00:00")); |
} |
// Nbre |
$valeur_max = max($observations); |
for ($njs = 0; $njs < 7; $njs++) { |
for ($h = 0; $h < 24; $h++) { |
$hfmt = sprintf('%02s', $h);// Format numérique 00 |
$periode = $njs.'-'.$hfmt; |
$donnees['valeurs_x'][] = round(($h + 1) * (100 / 24), 0); |
$donnees['valeurs_y'][] = round(($njs + 1) * (100 / 7), 0); |
$ps = 0; |
if (isset($observations[$periode])) { |
$ps = round($observations[$periode] * (100 / $valeur_max), 0); |
} |
$donnees['valeurs_ps'][] = $ps; |
} |
} |
//echo '<pre>'.print_r($donnees,true).'</pre>'; |
// Préparation des paramêtres du graph |
$titre = "Nombre de création d'observation|par heure et jour de la semaine"; |
$valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']); |
$etiquettes_x1 = '|'.implode('|', $donnees['heures']); |
$etiquettes_x2 = 'Heures'; |
$etiquettes_y1 = '|'.implode('|', $donnees['joursSemaine']); |
$x_axis_step_size = str_replace(',', '.', (100 / 24)); |
$y_axis_step_size = str_replace(',', '.', (100 / 7)); |
// Construction du tableau des paramêtres du graph |
$graph = array('cht' => 's', |
'chtt' => $titre, |
'chs' => '400x200', |
'chco' => '00FF00', |
'chd' => 't:'.$valeurs, |
'chxt' => 'x,x,y', |
'chxr' => "0,-1,23,1|2,-1,6,1", |
'chxp' => '1,100', |
'chxl' => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'', |
'chg' => "$x_axis_step_size,$y_axis_step_size,1,5"); |
//echo '<pre>'.print_r($graph,true).'</pre>'; |
return $graph; |
} |
private function getNuagePointsObsAnciennete($param) { |
// Récupération des données de la base |
$requete = 'SELECT DISTINCT identifiant , '. |
' MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '. |
' COUNT(id) AS obs_nbre '. |
'FROM cel_inventory '. |
"WHERE date_creation != '0000-00-00 00:00:00' ". |
" AND identifiant LIKE '%@%' ". |
'GROUP BY identifiant '. |
'ORDER BY date_min ASC '; |
$resultats = $this->executerRequete($requete); |
// Trie des données |
$max_obs = 0; |
$max_obs_log = 0; |
$max_anciennete = 0; |
$donnees = array(); |
foreach ($resultats as $enrg) { |
$tps_deb = strtotime($enrg['date_min']); |
$tps_fin = strtotime($enrg['date_max']); |
$donnee = array(); |
if (($tps_fin - $tps_deb) == 0) { |
$donnee['anciennete'] = 1; |
} else { |
$donnee['anciennete'] = round((($tps_fin - $tps_deb) / 86400), 0); |
} |
$donnee['obs'] = $enrg['obs_nbre']; |
$donnee['obs_log'] = log10($enrg['obs_nbre']); |
$donnees[] = $donnee; |
$max_obs_log = ($donnee['obs_log'] > $max_obs_log) ? $donnee['obs_log'] : $max_obs_log; |
$max_obs = ($donnee['obs'] > $max_obs) ? $donnee['obs'] : $max_obs; |
$max_anciennete = ($donnee['anciennete'] > $max_anciennete) ? $donnee['anciennete'] : $max_anciennete; |
} |
// Postraitement des données |
foreach ($donnees as $donnee) { |
$donnees['valeurs_x'][] = round($donnee['anciennete'] * (100 / $max_anciennete), 0); |
$donnees['valeurs_y'][] = round($donnee['obs_log'] * (100 / $max_obs_log), 0); |
$donnees['valeurs_ps'][] = 20; |
} |
// Échelle log des obs |
$donnees['echelle_y1'] = array(); |
$pas = $max_obs_log / 100 ; |
for ($i = 0 ; $i < 5 ; $i++) { |
$donnees['echelle_y1'][] = round(pow(10, (($i*20) * $pas)), 0); |
} |
$donnees['echelle_y1'][] = $max_obs; |
//echo '<pre>'.print_r($donnees['valeurs_x'],true).'</pre>'; |
// Préparation des paramêtres du graph |
$titre = "Répartition des utilisateurs en fonction|du nombre d'observations et de l'ancienneté"; |
$valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']); |
$etiquettes_x2 = 'Ancienneté en jours'; |
$etiquettes_y1 = implode('|', $donnees['echelle_y1']); |
$etiquettes_y2 = 'Observations'; |
$x_axis_step_size = $max_anciennete; |
// Construction du tableau des paramêtres du graph |
$graph = array('cht' => 's', |
'chtt' => $titre, |
'chs' => '400x200', |
'chco' => '0000FF', |
'chxt' => 'x,x,y,y', |
'chd' => 't:'.$valeurs, |
'chxr' => "0,0,$x_axis_step_size|2,0,$max_obs",//|2,0,$y_axis_step_size,$pas |
'chxp' => '1,100|3,100', |
'chm' => 'h,C3C3C3,0,-0.2,0.2,-1', |
'chxl' => '1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'|3:|'.$etiquettes_y2.'');// |
//echo '<pre>'.print_r($graph,true).'</pre>'; |
return $graph; |
} |
private function executerRequeteEvol($table, $champ, $format_date = '%Y%m', $where = null, $champ_date = 'date_creation', $order_by = null, $limit = null) { |
$utilisateur = isset($_GET['utilisateur']) ? $this->bdd->quote($_GET['utilisateur']) : false; |
$requete = "SELECT DATE_FORMAT($champ_date, '$format_date') AS periode, COUNT($champ) AS nbre ". |
"FROM $table ". |
"WHERE $champ_date != '0000-00-00 00:00:00' ". |
(($utilisateur != false) ? " AND identifiant = $utilisateur " : ''). |
((is_null($where)) ? '' : " AND $where "). |
'GROUP BY periode '. |
((is_null($order_by)) ? '' : "ORDER BY $order_by "); |
((is_null($limit)) ? '' : "LIMIT $limit "); |
$evolution = $this->executerRequete($requete); |
// Traitement du tableau |
$donnees_traitees = array(); |
if ($evolution !== false) { |
foreach ($evolution as $info) { |
$donnees_traitees[$info['periode']] = $info['nbre']; |
} |
} |
return $donnees_traitees; |
} |
private function executerRequeteNombre($table, $champ, $where = null) { |
$utilisateur = null; |
if (isset($_GET['utilisateur'])) { |
$utilisateur = $this->bdd->quote($_GET['utilisateur']); |
$where = isset($where) ? $where.' AND ' : ''; |
$where .= "identifiant = $utilisateur "; |
} |
$requete = "SELECT COUNT($champ) AS nbre ". |
"FROM $table ". |
((isset($where)) ? "WHERE $where " : ''); |
$nbre = $this->executerRequete($requete, 'Column'); |
return $nbre; |
} |
} |
/tags/celw-v1.1/jrest/services/InventoryObservationList.php |
---|
New file |
0,0 → 1,126 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* InventoryObservationList.php |
* |
* in=utf8 |
* out=utf8 |
* |
* Cas d'utilisation : |
* 1: Service recherche d'observations a partir de divers critères |
* a: Le service recherche les observations correspondant aux critères demandés |
* b: Le service renvoie la liste des observations correspondantes |
* |
* 2: Service modification en masse d'observations |
* a: Le service recherche les observations correspondant aux identifiants donnés |
* b: Le service modifie les observations correspondantes avec les infos données en paramètres |
* |
* 3: Service de suppression d'observations en masse |
* a: Le service recherche les observations correspondant aux critères demandés |
* b: Le service supprime la liste des observations correspondantes |
*/ |
class InventoryObservationList extends Cel { |
/** |
* renvoie les observations correspondant au critères de filtrage |
* |
* uid[0] : utilisateur obligatoire |
* uid[1] : criteres de filtrage de la forme critere1=valeur1&critere2=valeur2 |
*/ |
function getElement($uid) |
{ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$chercheur_observations = new RechercheObservation($this->config); |
$numero_page = 0; |
$taille_page = 50; |
$criteres = array(); |
if (isset($uid[1])) |
{ |
$criteres = $chercheur_observations->parserRequeteCriteres($uid[1]) ; |
if (isset($criteres['numero_page']) && isset($criteres['limite'])) { |
$numero_page = $criteres['numero_page']; |
$taille_page = $criteres['limite']; |
} |
} |
$retour = $chercheur_observations->rechercherObservations($uid[0], $criteres, $numero_page, $taille_page); |
$retour_encode = json_encode($retour) ; |
header("Content-type: application/json"); |
print($retour_encode); |
exit(); |
} |
/** |
* met à jour les métadonnées d'une liste d'observations |
* |
* uid[0] : utilisateur obligatoire |
* uid[1] : ordres des observations à modifier séparés par des virgules |
* pairs : données à mettre à jour sous la forme de clés => valeurs |
*/ |
function updateElement($uid,$pairs) { |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[1])) { |
//TODO: envoyer un message d'erreur |
return; |
} |
$uid[1] = rtrim($uid[1],','); |
$gestionnaire_observation = new GestionObservation($this->config); |
$modification_observation = $gestionnaire_observation->modifierObservation($uid[0],$uid[1],$pairs); |
return true; |
} |
/** |
* Supprime une liste d'observations |
* |
* uid[0] : utilisateur obligatoire |
* uid[1] : ordres des observations à supprimer séparés par des virgules |
*/ |
function deleteElement($uid) |
{ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[1])) { |
//TODO: envoyer un message d'erreur |
return; |
} |
$uid[1] = rtrim($uid[1],','); |
$gestionnaire_observation = new GestionObservation($this->config); |
$modification_observation = $gestionnaire_observation->supprimerObservation($uid[0],$uid[1]); |
if ($modification_observation) { |
echo "OK"; |
} |
exit() ; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/CelWidgetSaisie.php |
---|
New file |
0,0 → 1,158 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service permettant d'insérer les informations fournie par le widget Saisie dans le CEL. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* PUT /CelWidgetSaisie : ajout de données en les passant via $_POST |
* |
* @author Jean-Pascal MILCENT <jpm@clapas.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2011, Jean-Pascal MILCENT |
*/ |
class CelWidgetSaisie extends CelMotCle { |
private $projet = null; |
private $utilisateur_id = null; |
public function getElement($params) { |
//$resultat[] = $this->ajouterMotCleObs('jpm@clapas.org', 'Projets coopératifs', self::OBS_RACINE_ID.'.projets-cooperatifs', self::OBS_RACINE_ID); |
//$resultat[] = $this->ajouterMotCleObs('jpm@clapas.org', 'Biodiversite34', self::OBS_RACINE_ID.'.projets-cooperatifs.biodiversite34', self::OBS_RACINE_ID.'.projets-cooperatifs'); |
//$this->envoyerJson($resultat); |
} |
public function createElement($requeteDonnees) { |
if (array_key_exists('projet', $requeteDonnees)) { |
$this->debug[] = 'Projet : ok'; |
$this->projet = $requeteDonnees['projet']; |
if (array_key_exists('utilisateur', $requeteDonnees)) { |
$this->debug[] = 'Utilisateur : ok'; |
$utilisateur = $requeteDonnees['utilisateur']; |
if (array_key_exists('courriel', $utilisateur)) { |
$this->debug[] = 'Courriel : ok'; |
extract($utilisateur); |
$this->utilisateur_id = $courriel; |
$ordre = $this->getMaxOrdre($courriel); |
if (!is_null($ordre)) { |
$this->debug[] = 'Ordre : ok'; |
// Triage et manipulation des données |
$observations = array(); |
foreach ($requeteDonnees as $cle => $obs) { |
if (preg_match('/^obsId[0-9]+$/', $cle)) { |
$obsAAjouter = array(); |
$obsAAjouter['identifiant'] = $courriel; |
$obsAAjouter['prenom_utilisateur'] = $prenom; |
$obsAAjouter['nom_utilisateur'] = $nom; |
$obsAAjouter['ordre'] = $ordre++; |
$obsAAjouter['nom_sel'] = $obs['nom_sel']; |
$obsAAjouter['num_nom_sel'] = $obs['num_nom_sel']; |
$obsAAjouter['nom_ret'] = $obs['nom_ret']; |
$obsAAjouter['num_nom_ret'] = $obs['num_nom_ret']; |
$obsAAjouter['num_taxon'] = $obs['num_taxon']; |
$obsAAjouter['famille'] = $obs['famille']; |
$obsAAjouter['date_observation'] = $this->transormerDateFrVersMysql($obs['date']); |
$obsAAjouter['milieu'] = $obs['milieu']; |
$obsAAjouter['commentaire'] = $obs['notes']; |
$obsAAjouter['transmission'] = '1'; |
$obsAAjouter['date_creation'] = date('Y-m-d H:i:s'); |
$obsAAjouter['date_transmission'] = date('Y-m-d H:i:s'); |
$obsAAjouter['coord_x'] = $obs['latitude']; |
$obsAAjouter['coord_y'] = $obs['longitude']; |
$obsAAjouter['location'] = $obs['commune_nom']; |
$obsAAjouter['id_location'] = substr($obs['commune_code_insee'], 0, 2); |
$obsAAjouter['ref_geo'] = 'WGS84'; |
$observations[] = $this->protegerTableau($obsAAjouter); |
} |
} |
$this->debug[] = 'Nbre obs ajoutée : '.count($observations); |
// Insertion dans la base |
$ok = true; |
$obs_a_lier = array(); |
foreach ($observations as $obs) { |
$insert = "INSERT INTO cel_inventory "; |
$champs = '('.implode(', ', array_keys($obs)).') '; |
$values = 'VALUES ('.implode(', ', $obs).') '; |
$requete = $insert.$champs.$values; |
if ($this->executerRequeteSimple($requete) === false) { |
$ok = false; |
} else { |
$obs_ok[] = trim($obs['ordre'], "'"); |
} |
} |
if ($ok === true) { |
$this->debug[] = print_r($obs_ok, true); |
$liaison_ok = $this->lierObsAMotsCles($obs_ok); |
if ($liaison_ok === false) { |
$e = "Toutes les observations n'ont pas pu être liées au mot-clé du projet."; |
$this->messages[] = $e; |
} |
} else { |
$this->messages[] = "Un problème est survenu lors de l'insertion dans la base de données."; |
} |
} else { |
$this->messages[] = "Un nouveau numéro d'ordre d'observation n'a pu être généré."; |
} |
} else { |
$this->messages[] = "L'identifiant de l'utilisateur (courriel) n'a pas été transmis."; |
} |
} else { |
$this->messages[] = "Les informations concernant l'utilisateur (prénom, nom, courriel) n'ont pas été transmises."; |
} |
} else { |
$this->messages[] = "Les informations concernant le projet coopératif n'ont pas été transmises."; |
} |
$msg = (count($this->messages) > 0) ? 'erreur' : 'ok'; |
$retour = (object) array('msg' => $msg); |
$this->envoyerJson($obj); |
} |
private function getMaxOrdre($identifiant) { |
$ordre = null; |
$identifiant = $this->bdd->quote($identifiant); |
$requete = "SELECT MAX(ordre) AS ordre ". |
"FROM cel_inventory ". |
"WHERE identifiant = $identifiant "; |
$ordre_max = $this->executerRequete($requete, 'Column'); |
if ($ordre_max !== false) { |
$ordre = $ordre_max + 1; |
} |
return $ordre; |
} |
/** |
* Transforme une date au format français (jj/mm/aaaa) dans un format Mysql (aaaa-mm-jj). |
* @param string $dateFr date au format français (jj/mm/aaaa) |
* @return string date au format Mysql (aaaa-mm-jj) |
*/ |
private function transormerDateFrVersMysql($dateFr) { |
$dateMysql = '0000-00-00'; |
$morceauxDate = explode('/', $dateFr); |
if (count($morceauxDate) == 3) { |
$dateMysql = implode('-', array_reverse($morceauxDate)); |
} |
return $dateMysql; |
} |
private function lierObsAMotsCles($observations) { |
$categorie = self::OBS_RACINE_ID.'.projets-cooperatifs'; |
$projet = $categorie.'.'.strtolower($this->projet); |
$ajout_mot_cle_1 = $this->ajouterMotCleObs($this->utilisateur_id, 'Projets coopératifs', $categorie, self::OBS_RACINE_ID); |
$ajout_mot_cle_2 = $this->ajouterMotCleObs($this->utilisateur_id, $this->projet, $projet, $categorie); |
$liaison_ok = false; |
if ($ajout_mot_cle_1 && $ajout_mot_cle_2) { |
$liaison_ok = $this->lierMotCleObs($this->utilisateur_id, array($projet), $observations); |
} else { |
$e = "La catégorie du projet et le mot-clé du projet n'ont pas pu être ajouté."; |
$this->messages[] = $e; |
} |
return $liaison_ok; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/CelMotCle.php |
---|
New file |
0,0 → 1,477 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Classe mère permettant de rassembler les manipulation concernant les mots clés. |
* Pour l'utiliser, il suffit d'étendre votre service avec cette classe à la place de Cel. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2011, Tela-Botanica |
*/ |
// TODO : compléter la classe avec des méthdodes de modification, suppression et consultation des mots-clés. |
// TODO : ajout vérification de la non présence du caractère '|' dans les chaines utilisateurs... |
class CelMotCle extends Cel { |
const OBS_RACINE_ID = 'racine_obs'; |
const OBS_RACINE_NOM = 'Projets'; |
const OBS_TABLE_SUFFIXE = '_obs'; |
const IMG_RACINE_ID = 'racine'; |
const IMG_RACINE_NOM = 'Mots clés'; |
const IMG_TABLE_SUFFIXE = '_images'; |
const SEPARATEUR_MOT_CLE_TEXTE = '##'; |
const SEPARATEUR_MOT_CLE_ID = ';'; |
/** |
* @var String permet de savoir si nous avons à faire à un mot clé d'observation ou d'image. |
*/ |
private $suffix = ''; |
/** |
* @var String identifiant de l'utilisateur dont nous gérons les mots-clés. |
*/ |
private $utilisateur_id = ''; |
/** |
* Lie un mot-clé à une ou plusieurs observations. |
* |
* @param String $utilisateur_id identifiant de l'utilisateur. |
* @param String $mot_cle texte du mot-clé. |
* @param Array $ordres_obs un tableau d'odre d'observation (int) pour lesquels nous devons ajouter le mot-clé. |
*/ |
public function lierMotCleObs($utilisateur_id, Array $mots_cles_ids, Array $ordres) { |
$retour = false; |
if ($this->verifierOrdres($ordres)) { |
$mots_cles_ids_concatenes = $this->concatenerMotsClesIds($mots_cles_ids); |
$ordres_sql_in = implode(', ', $ordres); |
$requete = 'UPDATE cel_inventory '. |
"SET mots_cles = REPLACE(CONCAT(IFNULL(mots_cles, ''), |$mots_cles_ids_concatenes|), 'null', '') ". |
"WHERE ordre IN ($ordres_sql_in) ". |
" AND identifiant = |$utilisateur_id| "; |
$resultat = $this->executer($requete); |
if ($resultat) { |
$retour = true; |
foreach ($ordres as $ordre) { |
$regeneration = $this->regenererIndexTexteMotCle($ordre); |
if ($regeneration === false) { |
$retour = false; |
} |
} |
} else { |
$e = "Erreur de mise à jour des mots clés d'une obs : $requete"; |
$this->logger('CEL_bugs', $e); |
$this->messages[] = $e; |
} |
} else { |
$this->messages[] = "Le tableau des ordres des obs ne contenait pas que des nombres entiers."; |
} |
return $retour; |
} |
private function regenererIndexTexteMotCle($ordre) { |
$ok = false; |
$mots_cles_ids = $this->obtenirIdsMotsClesConcatenes($ordre); |
if ($mots_cles_ids) { |
$mots_cles = $this->obtenirMotClesTexte($mots_cles_ids); |
$mots_cles_concatenes = $this->concatenerMotsCles($mots_cles); |
$ok = $this->mettreAJourMotsClesConcatenes($mots_cles_concatenes, $ordre); |
} |
return $ok; |
} |
private function obtenirIdsMotsClesConcatenes($ordre) { |
$requete = 'SELECT mots_cles '. |
'FROM cel_inventory '. |
"WHERE ordre = $ordre ". |
" AND identifiant = |{$this->utilisateur_id}| "; |
$resultat = $this->recupererResultat($requete); |
$mots_cles_ids = false; |
if ($resultat) { |
$mots_cles_ids = $resultat['mots_cles']; |
} |
return $mots_cles_ids; |
} |
private function obtenirMotClesTexte($mot_cle_ids) { |
$mot_cle_ids_in = $this->formaterIdsMotClePourClauseInSql($mot_cle_ids); |
$requete = 'SELECT cmc_mot_cle '. |
'FROM cel_mots_cles_obs '. |
"WHERE cmc_id_mot_cle_utilisateur IN ($mot_cle_ids_in) ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$resultats = $this->recupererResultats($requete); |
$mots_cles = array(); |
if ($resultats) { |
foreach ($resultats as $mot_cle) { |
$mots_cles[] = $mot_cle['cmc_mot_cle']; |
} |
} |
return $mots_cles; |
} |
private function formaterIdsMotClePourClauseInSql($mot_cle_ids) { |
$mot_cle_ids = $this->nettoyerMotsCles($mot_cle_ids); |
$mot_cle_ids = str_replace(self::SEPARATEUR_MOT_CLE_ID, ',', $mot_cle_ids); |
$mot_cle_ids = trim($mot_cle_ids, ','); |
$mot_cle_ids_proteges = implode(',', $this->protegerTableau(explode(',', $mot_cle_ids))); |
return $mot_cle_ids_proteges; |
} |
private function concatenerMotsClesIds(Array $mots_cles_ids) { |
$mots_cles_ids_concatenes = ''; |
if (count($mots_cles_ids) > 0) { |
foreach ($mots_cles_ids as $mot_cle_id) { |
$mots_cles_ids_concatenes .= $this->nettoyerMotsCles($mot_cle_id).self::SEPARATEUR_MOT_CLE_ID; |
} |
} |
return $mots_cles_ids_concatenes; |
} |
private function concatenerMotsCles(Array $mots_cles) { |
$mot_cles_concatenes = ''; |
if (count($mots_cles) > 0) { |
foreach ($mots_cles as $mot_cle) { |
$mot_cles_concatenes .= $mot_cle.self::SEPARATEUR_MOT_CLE_TEXTE; |
} |
} |
$mot_cles_concatenes = rtrim($mot_cles_concatenes, self::SEPARATEUR_MOT_CLE_TEXTE); |
return $mot_cles_concatenes; |
} |
private function mettreAJourMotsClesConcatenes($mots_cles, $ordre) { |
$requete = 'UPDATE cel_inventory '. |
"SET mots_cles_texte = |$mots_cles| ". |
"WHERE ordre = $ordre ". |
" AND identifiant = |{$this->utilisateur_id}| "; |
$ok = $this->executer($requete) ? true : false; |
return $ok; |
} |
private function verifierOrdres($ordres) { |
$ok = true; |
foreach ($ordres as $ordre) { |
if (! preg_match('/^[0-9]+$/', $ordre)) { |
$this->debug[] = "Ordre pb : $ordre"; |
$ok = false; |
} |
} |
return $ok; |
} |
private function nettoyerMotsCles($chaine) { |
$valeur = str_replace('null', '', $chaine); |
$valeur = trim($valeur, ';;'); |
return $valeur; |
} |
public function ajouterMotCleObs($utilisateur_id, $mot_cle, $mot_cle_id, $mot_cle_parent_id) { |
$this->suffix = self::OBS_TABLE_SUFFIXE; |
$this->utilisateur_id = $utilisateur_id; |
return $this->ajouterMotCle($mot_cle, $mot_cle_id, $mot_cle_parent_id); |
} |
public function ajouterMotCleImg($utilisateur_id, $mot_cle, $mot_cle_id, $mot_cle_parent_id) { |
$this->suffix = self::IMG_TABLE_SUFFIXE; |
$this->utilisateur_id = $utilisateur_id; |
return $this->ajouterMotCle($mot_cle, $mot_cle_id, $mot_cle_parent_id); |
} |
private function ajouterMotCle($mot_cle, $mot_cle_id, $mot_cle_parent_id) { |
$retour = true; |
$this->ajouterMotCleRacine(); |
if ($this->verifierAbscence($mot_cle_id)) { |
$this->commencerTransaction(); |
$bornes = $this->retrouverBornesEtNiveau($mot_cle_parent_id); |
$borne_pere = $bornes['cmc_bd']; |
$niveau = $bornes['cmc_niveau'] + 1; |
$bg = $bornes['cmc_bd']; |
$bd = $bg + 1; |
$mot_cle_encode = $this->encoderMotCle($mot_cle); |
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere) ? true : false; |
$requete = "INSERT INTO cel_mots_cles{$this->suffix} ". |
"VALUES ( |$mot_cle|, |$bg|, |$bd|, |$mot_cle_encode|, |$mot_cle_id|, ". |
" |{$this->utilisateur_id}|, |$mot_cle_parent_id|, |$niveau|) "; |
$transaction_reussie_2 = $this->executerSQL($requete); |
if (!$transaction_reussie_2) { |
$e = "Échec d'insertion du mot-clé : $requete "; |
$this->messages[] = $e; |
} |
$retour = null; |
if ($transaction_reussie_1 && $transaction_reussie_2) { |
$retour = $this->completerTransaction(); |
} else { |
$retour = $this->annulerTransaction(); |
} |
} else { |
$e = "Le mot-clé '$mot_cle' ayant l'id '$mot_cle_id' existe déjà."; |
$this->debug[] = $e; |
} |
return $retour; |
} |
private function ajouterMotCleRacine() { |
$nbre_mots_cles = $this->compterMotsCles(); |
$this->debug[] = $nbre_mots_cles; |
if ($nbre_mots_cles == 0) { |
switch ($this->suffix) { |
case self::OBS_TABLE_SUFFIXE : |
$nom_racine = self::OBS_RACINE_NOM; |
$id_racine = self::OBS_RACINE_ID; |
break; |
case self::IMG_TABLE_SUFFIXE : |
$nom_racine = self::IMG_RACINE_NOM; |
$id_racine = self::IMG_RACINE_ID; |
break; |
default: |
$nom_racine = $this->suffix; |
$id_racine = $this->suffix; |
} |
$requete = "INSERT INTO cel_mots_cles{$this->suffix} ". |
"VALUES (|$nom_racine|, 1, 2, |$id_racine|, |$id_racine|, |{$this->utilisateur_id}|, '', 0) "; |
$this->debug[] = $requete; |
if ($this->executerSQL($requete) === false) { |
$e = "La requête d'insertion du mot-clé racine a échoué."; |
$this->messages[] = $e; |
} |
} |
} |
private function verifierAbscence($mot_cle_id) { |
$absence = false; |
$requete = 'SELECT COUNT(*) AS nbre '. |
"FROM cel_mots_cles{$this->suffix} ". |
"WHERE cmc_id_mot_cle_utilisateur = |$mot_cle_id| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$nbre = $this->recupererValeur($requete); |
if ($nbre === false) { |
$e = "La requête de vérification d'abscence d'un mot-clé a échoué."; |
$this->messages[] = $e; |
} else if ($nbre == 0) { |
$absence = true; |
} |
return $absence; |
} |
private function compterMotsCles() { |
$nbre = 0; |
$requete = 'SELECT COUNT(*) AS nbre '. |
"FROM cel_mots_cles{$this->suffix} ". |
"WHERE cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$nbre = $this->recupererValeur($requete); |
if ($nbre === false) { |
$e = "La requête de comptage du nombre de mots-clés a échoué."; |
$this->messages[] = $e; |
} |
return $nbre; |
} |
/** |
* Désactive l'auto-commit puis débute la transaction |
*/ |
private function commencerTransaction() { |
// Désactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 0 '; |
$reussite_autocommit = $this->executerSQL($requete); |
// Débute une nouvelle transaction |
$requete = 'BEGIN '; |
$reussite_begin = $this->executerSQL($requete); |
} |
/** |
* Termine la transaction puis réactive l'auto-commit |
*/ |
private function completerTransaction() { |
// Complète la transaction |
$requete = 'COMMIT '; |
$reussite_commit = $this->executerSQL($requete); |
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executerSQL($requete); |
return true; |
} |
/** |
* Annule la transaction et réactive l'auto-commit |
*/ |
private function annulerTransaction() { |
// Annule la transaction |
$requete = 'ROLLBACK '; |
$reussite_rollback = $this->executerSQL($requete); |
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executerSQL($requete); |
return false; |
} |
/** |
* Renvoie les bornes d'un noeud de l'arbre des mots clés |
*/ |
private function retrouverBornesEtNiveau($mot_cle_id) { |
$requete = 'SELECT cmc_bd, cmc_bg, cmc_niveau '. |
"FROM cel_mots_cles{$this->suffix} ". |
"WHERE cmc_id_mot_cle_utilisateur = |$mot_cle_id| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$resultat = $this->recupererResultat($requete); |
return $resultat; |
} |
/** |
* Décale les bornes de deux pour insérer un nouvel élément |
*/ |
private function decalerBornesPlusDeux($valeur) { |
// Décalage borne droite |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
'SET cmc_bd = cmc_bd + 2 '. |
"WHERE cmc_bd >= |$valeur| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$reussi_1 = $this->executerSQL($requete); |
if (!$reussi_1) { |
$e = "Échec du décalage de la borne droite de +2 : $requete "; |
$this->messages[] = $e; |
} |
// Décalage borne gauche |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
'SET cmc_bg = cmc_bg + 2 '. |
"WHERE cmc_bg >= |$valeur| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$reussi_2 = $this->executerSQL($requete); |
if (!$reussi_2) { |
$e = "Échec du décalage de la borne gauche de +2 : $requete"; |
$this->messages[] = $e; |
} |
return ($reussi_1 && $reussi_2); |
} |
/** |
* Décale les bornes d'un intervalle négatif donné (pour la suppression d'un sous arbre). |
*/ |
private function decalerBornesMoinsIntervalle($bg, $bd) { |
$decalage = $bd - $bg + 1; |
// Décalage borne droite |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
"SET cmc_bd = cmc_bd - $decalage ". |
"WHERE cmc_bd >= |$bg| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$reussi_1 = $this->executerSQL($requete); |
// Décalage borne gauche |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
"SET cmc_bg = cmc_bg - $decalage ". |
"WHERE cmc_bg > |$bg| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$reussi_2 = $this->executerSQL($requete); |
return $reussi_1 && $reussi_2; |
} |
/** |
* Décale à droite des bornes donées d'un intervalle positif donné (pour l'ajout d'un sous arbre). |
*/ |
private function decalerBornesPlusIntervalle($valeur_bornes, $largeur) { |
// Décalage borne droite |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
"SET cmc_bd = cmc_bd + |$largeur| ". |
"WHERE cmc_bd >= |$valeur_bornes| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$reussi_1 = $this->executerSQL($requete); |
// Décalage borne gauche |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
"SET cmc_bg = cmc_bg + |$largeur| ". |
"WHERE cmc_bg >= |$valeur_bornes| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
$reussi_2 = $this->executerSQL($requete); |
return $reussi_1 && $reussi_2; |
} |
/** |
* Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie. |
*/ |
private function exclureIntervalle($bg, $bd) { |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
"SET cmc_bd = cmc_bd - |$bd| - 1 , ". |
" cmc_bg = cmc_bg - |$bd| - 1 ". |
"WHERE cmc_bd <= |$bd| ". |
" AND cmc_bg >= |$bg| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
return $this->executerSQL($requete); |
} |
/** |
* Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place. |
* Décalage borne droite |
*/ |
private function inclureIntervalle($bg, $bd, $largeur, $modif_niveau) { |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
"SET cmc_bg = cmc_bg + |$largeur| , ". |
" cmc_bd = cmc_bd + |$largeur|, ". |
" cmc_niveau = cmc_niveau + |$modif_niveau| ". |
"WHERE cmc_bg >= |$bg| ". |
" AND cmc_bd <= |$bd| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
return $this->executerSQL($requete); |
} |
private function changerPere($mot_cle_id, $id_pere) { |
$requete = "UPDATE cel_mots_cles{$this->suffix} ". |
"SET cmc_id_parent = |$id_pere| ". |
"WHERE cmc_id_mot_cle_utilisateur = |$mot_cle_id| ". |
" AND cmc_id_proprietaire = |{$this->utilisateur_id}| "; |
return $this->executerSQL($requete); |
} |
private function executerSQL($requete) { |
$execution = $this->executer($requete); |
$execution = ($execution === false) ? false : true; |
return $execution; |
} |
private function recupererValeur($requete) { |
$resultat = $this->requeter($requete, Cel::SQL_RETOUR_COLONNE); |
return $resultat; |
} |
private function recupererResultat($requete) { |
$resultat = $this->requeter($requete, Cel::SQL_RETOUR_LIGNE, Cel::SQL_MODE_ASSOC); |
return $resultat; |
} |
private function recupererResultats($requete) { |
$resultat = $this->requeter($requete, Cel::SQL_RETOUR_COMPLET, Cel::SQL_MODE_ASSOC); |
return $resultat; |
} |
private function verifierLignesAffectees($requete) { |
$execution = $this->executer($requete); |
return $execution; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/squelettes/opml.tpl.xml |
---|
New file |
0,0 → 1,18 |
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?> |
<opml version="1.0"> |
<head> |
<text/> |
</head> |
<body> |
<outline text="CEL"> |
<?php foreach ($liste_flux as $flux) : ?> |
<outline title="<?=$flux['titre']?>" |
description="<?=$flux['description']?>" |
htmlUrl="<?=$flux['url_html']?>" |
xmlUrl="<?=$flux['url_xml']?>" |
type="<?=$flux['type']?>" |
text="<?=$flux['texte']?>"/> |
<?php endforeach; ?> |
</outline> |
</body> |
</opml> |
/tags/celw-v1.1/jrest/services/squelettes/rss1.tpl.xml |
---|
New file |
0,0 → 1,45 |
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?> |
<!DOCTYPE rdf:RDF [ |
<!ENTITY % HTMLlat1 PUBLIC |
"-//W3C//ENTITIES Latin 1 for XHTML//EN" |
"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"> |
%HTMLlat1; |
]> |
<rdf:RDF |
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
xmlns:dc="http://purl.org/dc/elements/1.1/" |
xmlns="http://purl.org/rss/1.0/"> |
<channel rdf:about="<?=$guid?>"> |
<title><?=$titre?></title> |
<link><?=$lien_cel?></link> |
<description><?=$description?></description> |
<dc:publisher><?=$editeur?></dc:publisher> |
<dc:date><?=$date_maj_W3C?></dc:date> |
<?php if (isset($items)) : ?> |
<items> |
<rdf:Seq> |
<?php foreach ($items as $item) : ?> |
<rdf:li resource="<?=$item['guid']?>" /> |
<?php endforeach; ?> |
</rdf:Seq> |
</items> |
<?php endif; ?> |
</channel> |
<?php if (isset($items)) : ?> |
<?php foreach ($items as $item) : ?> |
<item rdf:about="<?=$item['guid']?>"> |
<title><?=$item['titre']?></title> |
<link><?=(isset($item['lien'])) ? $item['lien'] : 'http://www.tela-botanica.org/'?></link> |
<description><?=$item['description_encodee']?></description> |
<dc:date><?=$item['date_maj_W3C']?></dc:date> |
</item> |
<?php endforeach; ?> |
<?php endif; ?> |
</rdf:RDF> |
/tags/celw-v1.1/jrest/services/squelettes/rss2.tpl.xml |
---|
New file |
0,0 → 1,25 |
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?> |
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> |
<channel> |
<title><?=$titre?></title> |
<link><?=$lien_cel?></link> |
<atom:link href="<?=$lien_service?>" rel="self" type="application/rss+xml" /> |
<description><?=$description?></description> |
<?php if (isset($items)) : ?> |
<?php foreach ($items as $item) : ?> |
<item> |
<guid><?=$item['guid']?></guid> |
<title><?=$item['titre']?></title> |
<? if (isset($item['lien'])) : ?> |
<link><?=$item['lien']?></link> |
<? endif; ?> |
<description><?=$item['description_encodee']?></description> |
<category><?= $item['categorie'] ?></category> |
<pubDate><?=$item['date_maj_RSS']?></pubDate> |
</item> |
<?php endforeach; ?> |
<?php endif; ?> |
</channel> |
</rss> |
/tags/celw-v1.1/jrest/services/squelettes/doublon_defaut.tpl.html |
---|
New file |
0,0 → 1,52 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml"> |
<head> |
<title>Images en doublon - <?=$utilisateur?></title> |
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> |
<style type="text/css"> |
html, body{ |
margin:0; |
padding:0; |
height: 100%; |
font-family: Arial; |
font-size: 12px; |
} |
ul{ |
list-style-type:none; |
} |
.doublon{ |
float:left; |
} |
.doublon-liste{ |
clear:left; |
} |
</style> |
<!-- JavaScript --> |
<script type="text/javascript" src="http://www.tela-botanica.org/commun/jquery/1.4.4/jquery-1.4.4.min.js"></script> |
<script type="text/javascript" src="http://www.tela-botanica.org/commun/jquery/lazyload/1.5.0/jquery.lazyload.mini.js"></script> |
<script type="text/javascript"> |
$(document).ready(function(){ |
$("img").lazyload(); |
}); |
</script> |
</head> |
<body> |
<h1><?=count($doublons)?> images en doublon - <?=$utilisateur?></h1> |
<ul> |
<?php foreach ($doublons as $doublon) : ?> |
<li class="doublon-liste"> |
<?php foreach ($doublon as $img) : ?> |
<ul class="doublon"> |
<li>Image : <?=$img['img_ordre']?></li> |
<li>Observation(s) : <?=implode(', ', $img['obs_ordre'])?></li> |
<li><img src="<?=$img['url']?>" alt="Id #<?=$img['img_id']?>"/></li> |
</ul> |
<?php endforeach; ?> |
</li> |
<?php endforeach; ?> |
</ul> |
</body> |
</html> |
/tags/celw-v1.1/jrest/services/squelettes/atom.tpl.xml |
---|
New file |
0,0 → 1,35 |
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";?> |
<feed xmlns="http://www.w3.org/2005/Atom"> |
<title><?=$titre?></title> |
<link href="<?=$lien_cel?>" rel="alternate" type="text/html" hreflang="fr" /> |
<link href="<?=$lien_service?>" rel="self" type="application/atom+xml"/> |
<updated><?=$date_maj_ATOM?></updated> |
<author> |
<name><?=$editeur?></name> |
</author> |
<id><?=$guid?></id> |
<rights>Copyright (c) <?=$annee_courante?>, <?=$editeur?></rights> |
<generator uri="<?=$lien_service?>" version="<?=$generateur_version?>"><?=$generateur?></generator> |
<?php if (isset($items)) : ?> |
<?php foreach ($items as $item) : ?> |
<entry> |
<id><?=$item['guid']?></id> |
<title><?=$item['titre']?></title> |
<? if (isset($item['lien'])) : ?> |
<link href="<?=$item['lien']?>"/> |
<? endif; ?> |
<updated><?=$item['date_maj_ATOM']?></updated> |
<author><name><?=$item['modifier_par']?></name></author> |
<content type="xhtml" xml:lang="fr"> |
<div xmlns="http://www.w3.org/1999/xhtml"> |
<?=$item['description'];?> |
</div> |
</content> |
</entry> |
<?php endforeach; ?> |
<?php endif; ?> |
</feed> |
/tags/celw-v1.1/jrest/services/CodeAsync.php |
---|
New file |
0,0 → 1,21 |
<?php |
Class CodeAsync extends Cel { |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$value=array(); |
$cle = urldecode($uid[0]); |
$addr = "http://maps.google.com/maps?file=api&v=2&sensor=true&key=".$cle; |
$script = file_get_contents($addr) ; |
header("Content-Type: text/plain; charset=UTF-8"); |
$value = json_encode($script) ; |
echo $value; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryImageCount.php |
---|
New file |
0,0 → 1,62 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2010, Aurélien Peronnet |
*/ |
/** |
* InventoryImageCount.php |
* |
* in : utf8 |
* out : utf8 |
* Cas d'utilisation : |
* Service recherche du nombre a partir de divers critères |
* |
* 2: Le service recherche le nombre d'images correspondant aux critères demandés |
* 3: Le service renvoie le nombre calculé |
*/ |
class InventoryImageCount extends Cel { |
/** |
* renvoie le nombre d'images correspondant aux criteres |
* uid[0] : utilisateur obligatoire |
* uid[1] : critères de filtrage de la forme critère1=valeur1;critère2=valeur2 |
*/ |
function getElement($uid) |
{ |
//TODO : remplacer le contenu du $uid[1] par le tableau $_GET; |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$chercheur_images = new RechercheImage($this->config); |
$numero_page = 0; |
$taille_page = 50; |
$criteres = array(); |
if(isset($uid[1])) |
{ |
$criteres = $chercheur_images->parserRequeteCriteres($uid[1]) ; |
} |
$retour = $chercheur_images->compterImages($uid[0], $criteres); |
$retour_encode = json_encode($retour) ; |
$retour_encode = $this->nettoyerCaracteresNuls($retour_encode); |
header("content-type: application/json"); |
print $retour_encode ; |
exit() ; |
} |
private function nettoyerCaracteresNuls($chaine) { |
return str_replace('\u0000','',$chaine); |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryImportExcel.php |
---|
New file |
0,0 → 1,1051 |
<?php |
// In : utf8 |
// Out : utf8 |
// TODO : traiter image multilignes |
// TODO : doublons |
/* |
Octobre 2010 David Delon. |
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur |
et liaison d'images déjà chargee aux observations ainsi crées. |
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé |
Aucune valeur dans les colonnes n'est obligatoire |
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent. |
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images. |
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés). |
*/ |
// Nom des colonnes |
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)" |
define('LIEUDIT','lieu-dit'); // Texte libre |
define('STATION','station'); // Texte libre |
define('MILIEU','milieu'); // Texte libre |
define('LATITUDE','latitude'); // En decimal systeme WGS84 |
define('LONGITUDE','longitude'); // En decimal systeme WGS84 |
define('NOTES','notes'); // Texte libre |
define('DATEOBS','date'); // date au format jj/mm/aaaa |
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999) |
define('IMAGE','image'); // nom des fichiers images préalablement uploadés sur le CEL séparés par des "/" |
define('DEPARTEMENT','departement'); // Texte libre |
define('TRANSMETTRE','transmettre'); // "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non"" |
// Resultat de l'analyse d'une ligne |
define('LIGNE_VIDE',1); // |
define('LIGNE_NORMALE',2); // |
define('LIGNE_IMAGE_SEULEMENT',3); // |
// Parser de Nom |
include('NameParser.php'); |
Class InventoryImportExcel extends DBAccessor { |
// Element constituant une observation |
var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE ); |
// Fichier configuration |
var $config; |
// Encapsulation classe lecture fichier excel |
var $extendExcelReader; |
// Dernier numero d'ordre utilise |
var $dernier_ordre=1; |
var $cpt_images_liees=0; |
/** |
Constructeur |
**/ |
function InventoryImportExcel($config) { |
$this->config=$config; |
// Pas d'heritage multiple en php :( |
$this->extendExcelReader = new ExcelReader(); |
$this->extendExcelReader->initExcelReader(); |
} |
/** |
Sur post |
**/ |
function createElement($pairs) { |
$pairs['utilisateur']=$_POST['identifiant']; |
session_start(); |
$this->controleUtilisateur($pairs['utilisateur']); |
foreach($_FILES as $file) { // C'est le plus simple |
$infos_fichier = $file ; |
} |
// Chargement tableau en memoire |
$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], false); // false : pour menager la memoire. |
$arr = array(); |
$rowcount=$data->rowcount(0); |
$colcount=$data->colcount(0); |
if ($rowcount<=1) { // TODO : retour erreur |
print "Tableau vide"; |
exit; |
} |
// Chargement tableau |
for($row=1;$row<=$rowcount;$row++) |
for($col=1;$col<=$colcount;$col++) |
$arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue |
// 1 : Traitement intitules |
$line = array(); |
/* Les colonnes ne sont pas forcemment dans l'ordre : on les extrait pour traitement futur */ |
for($col=1;$col<=$colcount;$col++) { |
$colonne=strtolower($arr[$col][1]); |
$colonne=trim($colonne); |
$colonne=cp1252_to_utf8($colonne); |
$colonne=remove_accent($colonne); |
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter |
case COMMUNE: |
case LIEUDIT: |
case STATION: |
case MILIEU: |
case DEPARTEMENT: |
case LATITUDE: |
case LONGITUDE: |
case NOTES: |
case DATEOBS: |
case ESPECE: |
case TRANSMETTRE: |
case IMAGE: |
$selection=array_values($arr[$col]); |
array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules |
$line[$colonne]=$selection; |
break; |
} |
} |
// print_r($line[COMMUNE]); |
// print_r($line[LIEUDIT]); |
// print_r($line[STATION]); |
// print_r($line[MILIEU]); |
// print_r($line[DEPARTEMENT]); |
// print_r($line[LATITUDE]); |
// print_r($line[LONGITUDE]); |
// print_r($line[NOTES]); |
// print_r($line[DATEOBS]); |
// print_r($line[ESPECE]); |
// print_r($line[IMAGE]); |
// 1 : Traitement lignes |
$cpt_obs=0; |
$cpt_img=0; |
/* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */ |
$DB=$this->connectDB($this->config,'database_cel'); |
$query="SELECT MAX(ordre) AS ordre FROM cel_inventory WHERE identifiant='".$DB->escapeSimple($pairs['utilisateur'])."' "; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$this->dernier_ordre=$row['ordre']; // 1 par defaut |
} |
for ($i=0;$i<=$rowcount-1;$i++) { |
// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement |
while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) { |
if ($retour_analyse==LIGNE_IMAGE_SEULEMENT) { |
// print "image non rattachee a une observation"; |
} |
else { |
// print "vide"; |
} |
$i++; |
} |
while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) { |
$ordre=$this->traiterLigne($line,$i,$pairs['utilisateur'],$DB); |
if ($ordre>0) { |
$cpt_obs++; // Compteur d'observations crees |
} |
$i++; |
// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement |
while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) { |
if ($retour_analyse==LIGNE_IMAGE_SEULEMENT) { |
$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$ordre); // images supplementaires |
} |
else { |
// print "vide"; |
} |
$i++; |
} |
} |
} |
//print $cpt_obs ." nouvelle(s) observation(s) !"; |
$message = ''; |
if($this->cpt_images_liees > 0) { |
$message = $this->cpt_images_liees.' images liees pour '; |
} |
$message .= $cpt_obs; |
print $message; |
} |
function analyserLigne($line,$i) { |
$ligne_vide=true; |
$ligne_image_seulement=true; |
$ligne_normale=true; |
$ligne_identique_sauf_image = true; |
foreach ($this->format_observation as $colonne) { |
if($i < 1) { |
$ligne_identique_sauf_image = false; |
} else { |
if($colonne!= IMAGE && $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') { |
$ligne_identique_sauf_image = false; |
} |
} |
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') { |
if ($colonne!=IMAGE) { |
$ligne_image_seulement=false; |
$ligne_vide=false; |
} |
$ligne_vide=false; |
} |
} |
if ($ligne_vide) { |
return LIGNE_VIDE; |
} |
else { |
if ($ligne_image_seulement || $ligne_identique_sauf_image) { |
return LIGNE_IMAGE_SEULEMENT; |
} |
else { |
return LIGNE_NORMALE; |
} |
} |
} |
function traiterLigne($line,$i,$utilisateur,$DB) { // Controle donnee et insertion |
$info_image=array(); |
$info_transmettre = "0"; |
foreach ($this->format_observation as $colonne) { |
if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') { |
switch ($colonne) { // On ne garde que les colonnes que l'on souhaite traiter |
case COMMUNE: |
$info_commune=$this->traiterCommune($line[COMMUNE][$i]); |
break; |
case LIEUDIT: |
$info_lieudit=$this->traiterLieudit($line[LIEUDIT][$i]); |
break; |
case STATION: |
$info_station=$this->traiterStation($line[STATION][$i]); |
break; |
case MILIEU: |
$info_milieu=$this->traiterMilieu($line[MILIEU][$i]); |
break; |
case DEPARTEMENT: |
$info_commune['code']=$this->traiterDepartement($line[DEPARTEMENT][$i]); |
break; |
case LATITUDE: |
$info_latitude=$this->traiterLatitude($line[LATITUDE][$i]); |
break; |
case LONGITUDE: |
$info_longitude=$this->traiterLongitude($line[LONGITUDE][$i]); |
break; |
case NOTES: |
$info_notes=$this->traiterNotes($line[NOTES][$i]); |
break; |
case DATEOBS: |
$info_dateobs=$this->traiterDateObs($line[DATEOBS][$i]); |
break; |
case TRANSMETTRE: |
$info_transmettre=$this->traiterTransmettre($line[TRANSMETTRE][$i]); |
break; |
case ESPECE: |
$info_espece=$this->traiterEspece($line[ESPECE][$i]); |
if (isset($info_espece['en_id_nom']) && $info_espece['en_id_nom']!='') { |
$complement=$this->rechercherInformationsComplementaires($info_espece['en_id_nom']); |
$info_espece['nom_ret']=$complement['Nom_Retenu']; |
$info_espece['num_nom_ret']=$complement['Num_Nom_Retenu']; |
$info_espece['num_taxon']=$complement['Num_Taxon']; |
$info_espece['famille']=$complement['Famille']; |
} |
break; |
case IMAGE: |
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur |
break; |
} |
} |
else { |
switch($colonne) { |
case COMMUNE: |
$info_commune['name']="000null"; |
$info_commune['code']="000null"; |
break; |
case LIEUDIT: |
$info_lieudit="000null"; |
break; |
case STATION: |
$info_station="000null"; |
break; |
case MILIEU: |
$info_milieu="000null"; |
break; |
case DEPARTEMENT: |
/*if (!isset ($info_commune['code']) || $info_commune['code']=='') { |
$info_commune['code']="000null"; |
}*/ |
break; |
case LATITUDE: |
$info_latitude="000null"; |
break; |
case LONGITUDE: |
$info_longitude="000null"; |
break; |
case TRANSMETTRE: |
$info_transmettre = "0"; |
break; |
} |
} |
} |
$this->dernier_ordre++; |
list($jour,$mois,$annee)=split("/",$info_dateobs); |
$info_dateobs=$annee."-".$mois."-".$jour." 0:0:0"; |
$query = "INSERT INTO cel_inventory (identifiant,ordre,nom_sel,num_nom_sel,nom_ret,num_nom_ret,num_taxon,famille,location,id_location,date_observation,lieudit,station, milieu, commentaire, transmission, date_creation,date_modification,coord_x,coord_y) " . |
" VALUES('".$DB->escapeSimple($utilisateur)."','". |
$DB->escapeSimple($this->dernier_ordre)."','". |
$DB->escapeSimple($info_espece['nom_sel'])."','". |
$DB->escapeSimple($info_espece['en_id_nom'])."','". |
$DB->escapeSimple($info_espece['nom_ret'])."','". |
$DB->escapeSimple($info_espece['num_nom_ret'])."','". |
$DB->escapeSimple($info_espece['num_taxon'])."','". |
$DB->escapeSimple($info_espece['famille'])."','". |
$DB->escapeSimple($info_commune['name'])."','". |
$DB->escapeSimple($info_commune['code'])."','". |
$DB->escapeSimple($info_dateobs)."','". |
$DB->escapeSimple($info_lieudit)."','". |
$DB->escapeSimple($info_station)."','". |
$DB->escapeSimple($info_milieu)."','". |
$DB->escapeSimple($info_notes)."','". |
$DB->escapeSimple($info_transmettre)."',". |
"now() , now(),'". |
$DB->escapeSimple($info_latitude)."','". |
$DB->escapeSimple($info_longitude)."')"; |
// print "\n"; |
$res =& $DB->query($query); |
if (PEAR::isError($res)) { |
return false; |
} |
// creation lien image |
foreach ($info_image as $pic) { |
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation ) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ; |
$res =& $DB->query($query); |
if (PEAR::isError($res)) { |
return false; |
} else { |
$this->cpt_images_liees++; |
} |
} |
return $this->dernier_ordre; |
} |
function traiterLigneComplement($line,$i,$utilisateur, $ordre = null) { |
$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / + utilisateur |
// creation lien image |
foreach ($info_image as $pic) { |
$DB=$this->connectDB($this->config,'cel_db'); |
$query = 'INSERT INTO cel_obs_images (coi_ce_image, coi_ce_utilisateur, coi_ce_observation) VALUES ("'.$DB->escapeSimple($pic['ci_id_image']).'","'.$DB->escapeSimple($utilisateur).'", "'.$DB->escapeSimple($this->dernier_ordre).'") ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image' ; |
$res =& $DB->query($query); |
if (PEAR::isError($res)) { |
return false; |
} else { |
$this->cpt_images_liees++; |
} |
} |
} |
function traiterCommune($identifiant_commune) { // Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee |
$identifiant_commune=trim($identifiant_commune); |
$identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau |
preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements); |
$DB=$this->connectDB($this->config,'database_cel'); // FIXME regarder si opportun ici |
if ($elements[1]) { // commune + departement : montpellier (34) |
$nom_commune=$elements[1]; |
$code_commune=$elements[2]; |
$query="SELECT DISTINCT name, code FROM locations WHERE name = '".$DB->escapeSimple($nom_commune)."' AND code ='".$DB->escapeSimple($code_commune)."'"; |
} |
else { // Code insee seul |
preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements); |
if ($elements[1]) { // code insee commune |
$code_insee_commune=$elements[1]; |
$query="SELECT DISTINCT name, code FROM locations WHERE insee_code ='".$DB->escapeSimple($code_insee_commune)."'"; |
} |
else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise |
// Commune |
preg_match('/(.*)/',$identifiant_commune,$elements); |
if ($elements[1]) { // commune |
$nom_commune=$elements[1]; |
$nom_commune=trim($nom_commune); |
$nom_commune=utf8_decode($nom_commune); |
$nom_commune=cp1252_to_utf8($nom_commune); |
$nom_commune=remove_accent($nom_commune); |
$nom_commune=preg_replace("/ /","%",$nom_commune); |
$query="SELECT DISTINCT name, code FROM locations WHERE name like '".$DB->escapeSimple($nom_commune)."'"; |
} |
} |
} |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
return $res->fetchrow(DB_FETCHMODE_ASSOC); |
} |
function traiterLieudit($lieudit) { // texte libre |
//echo "traitement lieudit"; |
$lieudit=fix_latin($lieudit); |
return trim($lieudit); |
} |
function traiterStation($station) { // texte libre |
// echo "traitement station"; |
$station=fix_latin($station); |
return trim($station); |
} |
function traiterMilieu($milieu) { // texte libre |
// echo "traitement milieu"; |
$milieu=fix_latin($milieu); |
return trim($milieu); |
} |
function traiterDepartement($departement) { // texte libre |
if(is_numeric($departement) && strlen($departement) == 5) { |
$departement = substr($departement,0,2); |
} |
if(is_numeric($departement) && strlen($departement) == 4) { |
$departement = substr($departement,0,1); |
$departement = "0"+$departement; |
} |
return utf8_encode(trim($departement)); |
} |
function traiterLatitude($latitude) { // verifier formal decimal + limite france ? TODO |
// echo "traitement latitude"; |
return trim($latitude); |
} |
function traiterLongitude($longitude) { // verifier format decimal + limite france ? TODO |
// echo "traitement longitude"; |
return trim($longitude); |
} |
function traiterNotes($notes) { // texte libre |
// echo "traitement notes"; |
$notes=remove_accent($notes); |
return utf8_encode(trim($notes)); |
} |
function traiterDateObs($dateobs) { // verifier jj/mm/aaaa sinon date vide TODO |
// echo "traitement dateobs"; |
return trim($dateobs); |
} |
function traiterTransmettre($transmettre) { |
$transmission = '0'; |
if (trim($transmettre) == "1" || trim($transmettre) == "oui") { |
$transmission = '1'; |
} |
return $transmission; |
} |
function traiterEspece($identifiant_espece) { // texte libre, nom scientifique , ou code nomenclatural (format BDNFFnn999999) ou code taxonomique (format BDNFFnt999999) |
// echo "traitement espece"; |
$identifiant_espece=trim($identifiant_espece); |
$identifiant_espece=utf8_encode($identifiant_espece); // FIXME : devrait deja etre en utf8 a ce niveau |
preg_match('/BDNFFnn([0-9][0-9]*)/',$identifiant_espece,$elements); |
if ($elements[1]) { // Numero nomenclatural |
// Recherche du nom associe |
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection |
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,". |
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ". |
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ". |
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ". |
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ". |
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" . |
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a, " . |
" eflore_naturaliste_intitule_abreviation AS auteur_bex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_b ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_m ". |
" WHERE a.esn_id_nom= '".$elements[1]. "'". |
" AND a.esn_id_version_projet_taxon = 25 ". |
" AND en_ce_rang = enrg_id_rang" . |
" AND en_id_nom = a.esn_id_nom" . |
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ". |
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom "; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC); |
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$elements[1]); |
} |
else { // Numero taxonomique ou nom scientifique |
preg_match('/BDNFFnt([0-9][0-9]*)/',$identifiant_espece,$elements); |
if ($elements[1]) { // Numero taxonomique |
$DB=$this->connectDB($this->config); |
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,". |
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ". |
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ". |
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ". |
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ". |
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" . |
" FROM eflore_nom, eflore_nom_rang," . |
" eflore_naturaliste_intitule_abreviation AS auteur_bex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_b ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_m ". |
" , eflore_selection_nom ". |
" WHERE esn_id_taxon = '".$elements[1]. "'". |
" AND esn_id_version_projet_taxon = 25 ". |
" AND esn_ce_statut=3 ". |
" AND en_id_nom = esn_id_nom" . |
" AND en_ce_rang = enrg_id_rang" . |
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ". |
" AND esn_id_version_projet_taxon=en_id_version_projet_nom "; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC); |
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$row['en_id_nom']); |
} |
else { // Nom scientifique |
$nameparser=new NameParser(); |
$nom_latin_decoupe=$nameparser->parse($identifiant_espece); |
//print_r($nom_latin_decoupe); |
$DB=$this->connectDB($this->config); // FIXME regarder si opportun ici |
// requete sous espece (on privilegie les noms retenu cf tri par esn_ce_statut) |
if (isset($nom_latin_decoupe['infra']) && $nom_latin_decoupe['infra']!="") { |
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" . |
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " . |
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " . |
" AND enrg_abreviation_rang = '".$DB->escapeSimple($nom_latin_decoupe['infra_type'])."' " . |
" AND en_epithete_infra_specifique = '".$DB->escapeSimple($nom_latin_decoupe['infra'])."' " . |
" AND esn_id_nom= en_id_nom ". |
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " . |
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " . |
" ORDER BY esn_ce_statut ". |
" LIMIT 1"; |
} |
else { // espece (on privilegie les noms retenu cf tri par esn_ce_statut) |
$query="SELECT DISTINCT en_id_nom, esn_ce_statut" . |
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom " . |
" WHERE en_id_version_projet_nom = '25' AND en_nom_genre = '".$DB->escapeSimple($nom_latin_decoupe['genus'])."' " . |
" AND enrg_abreviation_rang = 'sp.' " . |
" AND esn_id_nom= en_id_nom ". |
" AND esn_id_version_projet_taxon=en_id_version_projet_nom " . |
" AND en_epithete_espece = '".$DB->escapeSimple($nom_latin_decoupe['species'])."' AND en_ce_rang = enrg_id_rang " . |
" ORDER BY esn_ce_statut ". |
" LIMIT 1"; |
} |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
$id_nom=$res->fetchrow(DB_FETCHMODE_ASSOC); |
// Recherche du nom associe |
$DB=$this->connectDB($this->config); // FIXME : gerer cache de connection |
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,". |
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ". |
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ". |
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ". |
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ". |
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, en_id_nom" . |
" FROM eflore_nom, eflore_nom_rang, eflore_selection_nom a, " . |
" eflore_naturaliste_intitule_abreviation AS auteur_bex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_b ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_m ". |
" WHERE a.esn_id_nom= '".$id_nom['en_id_nom']. "'". |
" AND a.esn_id_version_projet_taxon = 25 ". |
" AND en_ce_rang = enrg_id_rang" . |
" AND en_id_nom = a.esn_id_nom" . |
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ". |
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom "; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
if ($res->numRows() > 0 ) { |
$row =& $res->fetchrow(DB_FETCHMODE_ASSOC); |
return array("nom_sel"=>$this->formaterNom($row),"en_id_nom"=>$id_nom['en_id_nom']); |
} |
else { |
return array("nom_sel"=>$identifiant_espece); |
} |
} |
} |
} |
function traiterImage($images,$utilisateur) { // recherche id image de ce nom |
$DB=$this->connectDB($this->config,'cel_db'); |
$liste_images = explode("/",$images) ; |
$row =array(); |
foreach($liste_images as $image) { |
$query="SELECT * FROM cel_images WHERE ci_ce_utilisateur='".$DB->escapeSimple($utilisateur)."' AND ci_nom_original='".$DB->escapeSimple($image)."'"; |
$res =& $DB->query($query); |
$row [] =& $res->fetchrow(DB_FETCHMODE_ASSOC); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
} |
return $row; |
} |
function rechercherInformationsComplementaires($numNom) { // Num taxon, Num retenu ... |
$DB=$this->connectDB($this->config); |
$query = "SELECT DISTINCT en_nom_genre, en_epithete_espece, en_nom_supra_generique, en_epithete_infra_generique,". |
" auteur_bex.enaia_intitule_abrege AS abreviation_auteur_basio_ex ". |
" , auteur_b.enaia_intitule_abrege AS abreviation_auteur_basio ". |
" , auteur_mex.enaia_intitule_abrege AS abreviation_auteur_modif_ex ". |
" , auteur_m.enaia_intitule_abrege AS abreviation_auteur_modif ". |
" , en_epithete_espece, en_epithete_infra_specifique, enrg_abreviation_rang, b.esn_id_taxon, b.esn_id_nom" . |
" FROM eflore_nom, eflore_nom_rang," . |
" eflore_naturaliste_intitule_abreviation AS auteur_bex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_b ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_mex ". |
" , eflore_naturaliste_intitule_abreviation AS auteur_m ". |
" ,eflore_selection_nom a, eflore_selection_nom b". |
" WHERE a.esn_id_nom= ".$numNom. |
" AND a.esn_id_version_projet_taxon = 25 ". |
" AND a.esn_id_taxon=b.esn_id_taxon ". |
" AND b.esn_ce_statut=3 ". |
" AND a.esn_id_version_projet_taxon=b.esn_id_version_projet_taxon" . |
" AND en_ce_rang = enrg_id_rang" . |
" AND en_id_nom = b.esn_id_nom" . |
" AND en_ce_auteur_basio_ex = auteur_bex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_basio = auteur_b.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif_ex = auteur_mex.enaia_id_intitule_naturaliste_abrege ". |
" AND en_ce_auteur_modif = auteur_m.enaia_id_intitule_naturaliste_abrege ". |
" AND a.esn_id_version_projet_taxon=en_id_version_projet_nom "; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
// Nom retenu, Num Nomenclatural nom retenu, Num Taxon, |
$value=array('Nom_Retenu'=>"",'Num_Nom_Retenu'=>"0",'Num_Taxon'=>"0",'Famille'=>""); |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$fam=$this->rechercherFamille($row['esn_id_taxon'],$DB); |
// Recherche Famille |
while (($fam['en_ce_rang']!='fin') && ($fam['en_ce_rang'] !=120)) { |
$fam=$this->rechercherFamille($fam['etr_id_taxon_2'],$DB); |
} |
if ($fam['en_ce_rang']==120) { |
$famille=$fam['en_nom_supra_generique']; |
} |
else { |
$famille="Famille inconnue"; |
} |
$value=array('Nom_Retenu'=>$this->formaterNom($row),'Num_Nom_Retenu'=>$row['esn_id_nom'],'Num_Taxon'=>$row['esn_id_taxon'],'Famille'=>$famille); |
} |
return $value; |
} |
function formaterNom($rawnom) { |
// Constitution du nom: |
$nom = ''; |
if ($rawnom['en_nom_supra_generique'] != '') { |
$nom .= $rawnom['en_nom_supra_generique']; |
} else if ($rawnom['en_epithete_infra_generique'] != '') { |
$nom .= $rawnom['en_epithete_infra_generique']; |
} else { |
if ($rawnom['en_nom_genre'] != '') { |
$nom .= $rawnom['en_nom_genre']; |
} |
if ($rawnom['en_epithete_espece']!= '') { |
$nom .= ' '.$rawnom['en_epithete_espece']; |
} |
if ($rawnom['en_epithete_infra_specifique'] != '') { |
if (!empty($rawnom['enrg_abreviation_rang'])) { |
$nom .= ' '.$rawnom['enrg_abreviation_rang'].''; |
} |
$nom .= ' '.$rawnom['en_epithete_infra_specifique']; |
} |
} |
return $nom .$this->retournerAuteur($rawnom) ; |
} |
function rechercherFamille($taxon,&$DB) { |
$row=array(); |
$query="SELECT DISTINCT en_ce_rang, etr_id_taxon_2, en_id_nom, en_nom_supra_generique ". |
" FROM eflore_taxon_relation, eflore_selection_nom, eflore_nom ". |
" WHERE etr_id_taxon_1 = ".$taxon. |
" AND etr_id_version_projet_taxon_1 = 25 ". |
" AND etr_id_categorie_taxon = 3 ". |
" AND etr_id_valeur_taxon = 3 ". |
" AND esn_id_taxon = etr_id_taxon_2 ". |
" AND esn_ce_statut = 3 ". |
" AND esn_id_version_projet_taxon = etr_id_version_projet_taxon_1 ". |
" AND en_id_nom = esn_id_nom ". |
" AND esn_id_version_projet_taxon=en_id_version_projet_nom "; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
die($res->getMessage()); |
} |
if ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
return $row; |
} |
else { |
$row['en_ce_rang']='fin'; |
return $row; |
} |
} |
function retournerAuteur($rawnom) { |
$auteurs = ''; |
$auteur_basio = ''; |
$auteur_modif = ''; |
if (!empty($rawnom['abreviation_auteur_basio_ex']) && $rawnom['abreviation_auteur_basio_ex']!='-' ) { |
$auteur_basio .= $rawnom['abreviation_auteur_basio_ex']; |
if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') { |
$auteur_basio .= ' ex '.$rawnom['abreviation_auteur_basio']; |
} |
} else if (!empty($rawnom['abreviation_auteur_basio']) && $rawnom['abreviation_auteur_basio']!='-') { |
$auteur_basio .= $rawnom['abreviation_auteur_basio']; |
} |
if (!empty($rawnom['abreviation_auteur_modif_ex']) && $rawnom['abreviation_auteur_modif_ex']!='-') { |
$auteur_modif .= $rawnom['abreviation_auteur_modif_ex']; |
if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') { |
$auteur_modif .= ' ex '.$rawnom['abreviation_auteur_modif']; |
} |
} else if (!empty($rawnom['abreviation_auteur_modif']) && $rawnom['abreviation_auteur_modif']!='-') { |
$auteur_modif .= $rawnom['abreviation_auteur_modif']; |
} |
if (!empty($auteur_modif)) { |
$auteurs = ' ('.$auteur_basio.') '.$auteur_modif; |
} elseif (!empty($auteur_basio)) { |
$auteurs = ' '.$auteur_basio; |
} |
return $auteurs ; |
} |
} |
function init_byte_map(){ |
$byte_map = array(); |
for($x=128;$x<256;++$x){ |
$byte_map[chr($x)]=utf8_encode(chr($x)); |
} |
$cp1252_map=array( |
"\x80"=>"\xE2\x82\xAC", // EURO SIGN |
"\x82" => "\xE2\x80\x9A", // SINGLE LOW-9 QUOTATION MARK |
"\x83" => "\xC6\x92", // LATIN SMALL LETTER F WITH HOOK |
"\x84" => "\xE2\x80\x9E", // DOUBLE LOW-9 QUOTATION MARK |
"\x85" => "\xE2\x80\xA6", // HORIZONTAL ELLIPSIS |
"\x86" => "\xE2\x80\xA0", // DAGGER |
"\x87" => "\xE2\x80\xA1", // DOUBLE DAGGER |
"\x88" => "\xCB\x86", // MODIFIER LETTER CIRCUMFLEX ACCENT |
"\x89" => "\xE2\x80\xB0", // PER MILLE SIGN |
"\x8A" => "\xC5\xA0", // LATIN CAPITAL LETTER S WITH CARON |
"\x8B" => "\xE2\x80\xB9", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK |
"\x8C" => "\xC5\x92", // LATIN CAPITAL LIGATURE OE |
"\x8E" => "\xC5\xBD", // LATIN CAPITAL LETTER Z WITH CARON |
"\x91" => "\xE2\x80\x98", // LEFT SINGLE QUOTATION MARK |
"\x92" => "\xE2\x80\x99", // RIGHT SINGLE QUOTATION MARK |
"\x93" => "\xE2\x80\x9C", // LEFT DOUBLE QUOTATION MARK |
"\x94" => "\xE2\x80\x9D", // RIGHT DOUBLE QUOTATION MARK |
"\x95" => "\xE2\x80\xA2", // BULLET |
"\x96" => "\xE2\x80\x93", // EN DASH |
"\x97" => "\xE2\x80\x94", // EM DASH |
"\x98" => "\xCB\x9C", // SMALL TILDE |
"\x99" => "\xE2\x84\xA2", // TRADE MARK SIGN |
"\x9A" => "\xC5\xA1", // LATIN SMALL LETTER S WITH CARON |
"\x9B" => "\xE2\x80\xBA", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK |
"\x9C" => "\xC5\x93", // LATIN SMALL LIGATURE OE |
"\x9E" => "\xC5\xBE", // LATIN SMALL LETTER Z WITH CARON |
"\x9F" => "\xC5\xB8" // LATIN CAPITAL LETTER Y WITH DIAERESIS |
); |
foreach($cp1252_map as $k=>$v){ |
$byte_map[$k]=$v; |
} |
return $byte_map; |
} |
function fix_latin($instr){ |
$byte_map = init_byte_map(); |
$ascii_char='[\x00-\x7F]'; |
$cont_byte='[\x80-\xBF]'; |
$utf8_2='[\xC0-\xDF]'.$cont_byte; |
$utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}'; |
$utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}'; |
$utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}'; |
$nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s"; |
if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already |
$outstr=''; |
$char=''; |
$rest=''; |
while((strlen($instr))>0){ |
if(1==@preg_match($nibble_good_chars,$instr,$match)){ |
$char=$match[1]; |
$rest=$match[2]; |
$outstr.=$char; |
}elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){ |
$char=$match[1]; |
$rest=$match[2]; |
$outstr.=$byte_map[$char]; |
} |
$instr=$rest; |
} |
return $outstr; |
} |
function remove_accent($str) |
{ |
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', |
'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', |
'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', |
'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', |
'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', |
'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', |
'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', |
'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', |
'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', |
'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', |
'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', |
'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', |
'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', |
'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ'); |
$b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', |
'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', |
'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', |
'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', |
'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', |
'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', |
'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', |
'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', |
'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', |
'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', |
'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', |
'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', |
'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o'); |
return str_replace($a, $b, $str); |
} |
function cp1252_to_utf8($str) { |
$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac", |
"\xc2\x82" => "\xe2\x80\x9a", |
"\xc2\x83" => "\xc6\x92", |
"\xc2\x84" => "\xe2\x80\x9e", |
"\xc2\x85" => "\xe2\x80\xa6", |
"\xc2\x86" => "\xe2\x80\xa0", |
"\xc2\x87" => "\xe2\x80\xa1", |
"\xc2\x88" => "\xcb\x86", |
"\xc2\x89" => "\xe2\x80\xb0", |
"\xc2\x8a" => "\xc5\xa0", |
"\xc2\x8b" => "\xe2\x80\xb9", |
"\xc2\x8c" => "\xc5\x92", |
"\xc2\x8e" => "\xc5\xbd", |
"\xc2\x91" => "\xe2\x80\x98", |
"\xc2\x92" => "\xe2\x80\x99", |
"\xc2\x93" => "\xe2\x80\x9c", |
"\xc2\x94" => "\xe2\x80\x9d", |
"\xc2\x95" => "\xe2\x80\xa2", |
"\xc2\x96" => "\xe2\x80\x93", |
"\xc2\x97" => "\xe2\x80\x94", |
"\xc2\x98" => "\xcb\x9c", |
"\xc2\x99" => "\xe2\x84\xa2", |
"\xc2\x9a" => "\xc5\xa1", |
"\xc2\x9b" => "\xe2\x80\xba", |
"\xc2\x9c" => "\xc5\x93", |
"\xc2\x9e" => "\xc5\xbe", |
"\xc2\x9f" => "\xc5\xb8" |
); |
return strtr ( utf8_encode ( $str ), $cp1252_map ); |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/CelSyndicationImage.php |
---|
New file |
0,0 → 1,768 |
<?php |
/** |
* Service fournissant des informations concernant les images du CEL au format RSS1, RSS2 ou ATOM. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright 2010 |
*/ |
// TODO : résoudre le problème des images liées à plusieurs obs. Cela créé plusieurs item avec le même id pour atom... |
class CelSyndicationImage extends Cel { |
private $parametres_origines = null; |
private $format = null; |
private $service = null; |
private $squelette = null; |
private $squelette_dossier = null; |
private $auteurs = array(); |
private $flux = array(); |
private $format_image = 'XL'; |
private $criteres = array( |
'utilisateur' => 'c.ci_ce_utilisateur', |
'commune' => 'b.location', |
'dept' => 'b.id_location', |
'taxon' => 'b.nom_ret', |
'commentaire' => 'c.ci_meta_comment', |
'date' => 'c.ci_meta_date', |
'tag' => 'tag', |
'projet' => 'projet'); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params = array()) { |
// Initialisation des variables |
$this->parametres_origines = $params; |
$info = array(); |
$contenu = ''; |
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) { |
// Pré traitement des paramêtres |
$pour_bdd = false; |
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd); |
extract($p); |
$this->parametres = $params; |
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR; |
// Récupération de la liste des flux |
$this->chargerListeDesFlux(); |
// Chargement du bon type de service demandé |
if (isset($service)) { |
$this->service = $this->traiterNomService($service); |
$methode = $this->getNomMethodeService(); |
if (method_exists($this, $methode)) { |
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) { |
// Mise en minuscule de l'indication du format |
$this->format = strtolower($format); |
// Définition du fichier squelette demandé |
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml'; |
} else if (isset($this->flux[$this->service])) { |
$this->format = ''; |
$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom."; |
} |
if (!isset($this->flux[$this->service]) || isset($this->format)) { |
// Suppression des deux premiers paramètres (service et format) pour le reste des méthodes |
array_shift($this->parametres); |
array_shift($this->parametres); |
// Récupération du contenu à renvoyer |
$contenu = $this->$methode(); |
} |
} else { |
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé."; |
} |
} |
// Envoie sur la sortie standard |
$encodage = 'utf-8'; |
$mime = $this->getTypeMime(); |
$formatage_json = $this->getFormatageJson(); |
$this->envoyer($contenu, $mime, $encodage, $formatage_json); |
} |
private function chargerListeDesFlux() { |
$this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL', |
"Ce flux fournit l'url des nouvelles images du CEL liées à une observation."); |
$this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)', |
"Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation."); |
$this->setFlux('par-mots-cles', 'Flux de syndication obsolète', |
"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'."); |
$this->setFlux('par-commune','Flux de syndication obsolète', |
"Ce flux est désormais accessible via le flux multicriteres/atom/M?commune='commune'."); |
$this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '. |
'filtrées par un ou plusieurs critères', |
"Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ". |
"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ". |
"et/ou date."); |
} |
private function setFlux($nom, $titre, $description) { |
$url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/'; |
$formats = array('atom', 'rss2', 'rss1'); |
$flux = array(); |
foreach ($formats as $format) { |
$url = $url_base.$nom.'/'.$format; |
$flux[$format] = $url; |
} |
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux); |
} |
private function getFlux($nom) { |
return isset($this->flux[$nom]) ? $this->flux[$nom] : array(); |
} |
private function traiterNomService($nom) { |
$nom = strtolower($nom); |
return $nom; |
} |
private function getNomMethodeService() { |
$methode = ''; |
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service)))); |
$methode = 'getService'.$service_formate; |
return $methode; |
} |
private function getUrlBase() { |
$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/'); |
return $url_base; |
} |
private function getUrlServiceBase() { |
$url_service = $this->getUrlBase().implode('/', $this->parametres_origines); |
return $url_service; |
} |
private function getTypeMime() { |
$mime = ''; |
switch ($this->format) { |
case 'atom' : |
$mime = 'application/atom+xml'; |
break; |
case 'rss1' : |
case 'rss2' : |
$mime = 'application/rss+xml'; |
break; |
case 'opml' : |
$mime = 'text/x-opml'; |
break; |
default: |
$mime = 'text/html'; |
} |
return $mime; |
} |
private function getFormatageJson() { |
$json = false; |
switch ($this->service) { |
case 'liste-des-flux' : |
$json = true; |
break; |
default: |
$json = false; |
} |
return $json; |
} |
private function creerCategorie($element) { |
$categorie = ''; |
$categorie = 'Image'; |
$categorie = $this->nettoyerTexte($categorie); |
return $categorie; |
} |
private function etreFluxAdmin() { |
return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false; |
} |
private function creerUrlService() { |
$url_service = $this->getUrlServiceBase(); |
if (count($_GET) > 0) { |
$parametres_get = array(); |
foreach ($_GET as $cle => $valeur) { |
$parametres_get[] = $cle.'='.$valeur; |
} |
$url_service .= '?'.implode('&', $parametres_get); |
} |
return $url_service; |
} |
protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) { |
try { |
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($infos === false) { |
$this->messages[] = "La requête suivante a retourné aucun résultat :\n$requete"; |
} |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $infos; |
} |
private function executerService($elements) { |
// Prétraitement des données |
$donnees = $this->construireDonneesCommunesAuFlux($elements); |
foreach ($elements as $element) { |
$identifiants[$element['ci_ce_utilisateur']] = $element['ci_ce_utilisateur']; |
} |
$this->auteurs = $this->creerAuteurs($identifiants); |
foreach ($elements as $element) { |
$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element); |
} |
// Création du contenu à partir d'un template PHP |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function construireDonneesCommunesAuFlux($infos) { |
$donnees = $this->getFlux($this->service); |
$donnees['guid'] = $this->getUrlServiceBase(); |
$donnees['lien_service'] = $this->creerUrlService(); |
$donnees['lien_cel'] = (isset($infos['num_nom_sel'])) ? |
sprintf($this->config['settings']['efloreUrlTpl'], $infos['num_nom_sel'], 'illustration') : ''; |
$donnees['editeur'] = $this->config['settings']['editeur']; |
$derniere_info_en_date = reset($infos); |
$date_modification_timestamp = strtotime($derniere_info_en_date['ci_meta_date_ajout']); |
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$donnees['annee_courante'] = date('Y'); |
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage'; |
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0'; |
return $donnees; |
} |
private function construireDonneesCommunesAuxItems($info) { |
$item = array(); |
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['ci_meta_date_ajout']); |
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp); |
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$item['titre'] = $this->creerTitre($info); |
$item['guid'] = $this->creerGuidItem($info); |
$item['lien'] = $this->creerLienItem($info); |
$item['categorie'] = $this->creerCategorie($item); |
$item['description'] = $this->creerDescription($this->protegerCaracteresHtmlDansChamps($info), $item); |
$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item)); |
$item['modifier_par'] = $this->auteurs[$info['ci_ce_utilisateur']]; |
return $item; |
} |
private function creerGuidItem($element) { |
$guid = $this->getUrlImage($element['ci_id_image']); |
return $guid; |
} |
private function creerTitre($element) { |
$methode = 'creerTitre'.$this->service; |
$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple'; |
$titre = $this->$methode($element); |
$titre = $this->nettoyerTexte($titre); |
return $titre; |
} |
private function creerDescription($donnees, $item) { |
$methode = 'creerDescription'.$this->service; |
$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet'; |
$description = $this->$methode($donnees, $item); |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function creerLienItem($element) { |
if ($this->etreNull($element['id'])) { |
// Lien vers image grand format |
$lien = $this->getUrlImage($element['ci_id_image'], $this->format_image); |
} else { |
// Lien vers fiche eFlore onglet Illustration |
$lien = sprintf($this->config['settings']['efloreUrlTpl'], $element['num_nom_sel'], 'illustration'); |
} |
return $lien; |
} |
private function getServiceListeDesFlux() { |
return $this->flux; |
} |
private function getServiceOpml() { |
$donnees = array(); |
$id = 1; |
foreach ($this->flux as $flux_nom => $flux){ |
$info = array(); |
$info['type'] = 'atom'; |
$info['titre'] = $flux['titre']; |
$info['texte'] = "CEL - Images - $flux_nom"; |
$info['description'] = $flux['description']; |
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom'; |
$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication'; |
$donnees['liste_flux'][] = $info; |
} |
$this->squelette = $this->squelette_dossier.'opml.tpl.xml'; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getServiceSimple() { |
if (isset($this->parametres[0])) { |
$this->format_image = $this->parametres[0]; |
} |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '. |
' ci_id_image, ci_ce_utilisateur, ci_nom_original, ci_meta_date_ajout, ci_meta_mots_cles, ci_meta_comment, ci_note_image '. |
'FROM cel_obs_images AS coi '. |
'LEFT JOIN cel_inventory AS ci '. |
'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '. |
'LEFT JOIN cel_images AS cim '. |
'ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '. |
'WHERE ci.transmission = 1 '. |
' AND ci.identifiant = cim.ci_ce_utilisateur '. |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci_meta_date_ajout DESC').' '. |
"LIMIT $this->start, $this->limit "; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
$contenu = $this->executerService($elements); |
return $contenu; |
} |
private function creerTitreSimple($element) { |
if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['num_nom_sel'])) { |
$titre = "Ajout d'une photo par ".$this->auteurs[$element['ci_ce_utilisateur']]; |
} else { |
$titre = $element['nom_sel'].' [nn'.$element['num_nom_sel'].'] par '.$this->auteurs[$element['ci_ce_utilisateur']]; |
} |
return $titre; |
} |
private function creerDescriptionSimple($donnees, $item) { |
$description = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($donnees['num_nom_sel']), 'illustration'); |
return $description; |
} |
private function getServiceComplet() { |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ci.*, '. |
' ci_id_image, ci_ce_utilisateur, ci_nom_original, ci_meta_date_ajout, ci_meta_mots_cles, ci_meta_comment, ci_note_image '. |
'FROM cel_images AS cim '. |
' LEFT JOIN cel_obs_images AS coi '. |
' ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '. |
' LEFT JOIN cel_inventory AS ci '. |
' ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '. |
(($this->etreFluxAdmin()) ? '' : 'WHERE ci.transmission = 1 '). |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci_meta_date_ajout DESC').' '. |
"LIMIT $this->start, $this->limit "; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
$this->messages[] = "Aucune image disponible."; |
} |
return $contenu; |
} |
private function getServiceMultiCriteres() { |
$contenu = ''; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['limite'])) $this->limite = $_GET['limite']; |
// Construction de la requête |
$requete = 'SELECT * '. |
'FROM cel_obs_images AS a '. |
' INNER JOIN cel_inventory AS b '. |
' ON (a.coi_ce_observation = b.ordre AND a.coi_ce_utilisateur = b.identifiant) '. |
' INNER JOIN cel_images AS c '. |
' ON (a.coi_ce_image = c.ci_id_image AND a.coi_ce_utilisateur = c.ci_ce_utilisateur) '. |
'WHERE b.identifiant = c.ci_ce_utilisateur '. |
(($this->etreFluxAdmin()) ? '' : ' b.transmission = 1 AND '). |
' AND '; |
if ($this->estUneRechercheGenerale()) { |
$chaine_requete = $_GET['recherche']; |
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete); |
} else { |
$criteres = $this->traiterCriteresMultiples($_GET) ; |
if (!empty($criteres)) { |
$requete .= $this->creerSousRequeteRechercheParCriteres($criteres); |
} |
} |
$requete = str_replace(' AND ) ',' ', $requete); |
$requete = rtrim($requete, 'AND '); |
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : |
'c.ci_meta_date_ajout DESC').' '."LIMIT $this->start,$this->limit "; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
$this->messages[] = "Aucune image disponible."; |
} |
return $contenu; |
} |
private function creerSousRequeteRechercheParCriteres($criteres) { |
$requete = ''; |
foreach ($criteres as $pair) { |
$nom_valeur = explode("=",$pair); |
if (sizeof($nom_valeur) != 0) { |
switch ($nom_valeur[0]) { |
case "ci_limite" : $this->limite = $this->bdd->quote($nom_valeur[1]); break; |
case "c.ci_numero_page" : $this->limite*$this->bdd->quote($nom_valeur[1]); break; |
case "c.ci_meta_comment" : $mots_comment_liste = explode(" " , $nom_valeur[1]); |
foreach($mots_comment_liste as $mot_comment) { |
$mot_comment = trim($mot_comment) ; |
$requete .= $nom_valeur[0].' LIKE '.$this->bdd->quote('%'.$mot_comment.'%').' AND '; |
} |
break; |
case "c.ci_meta_date" : |
$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]); |
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) { |
$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1]; |
} |
$requete .= $nom_valeur[0].'='.$this->bdd->quote($nom_valeur[1]).' AND '; break; |
case "b.nom_ret" : |
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null'; |
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'. |
$nom_valeur[1].'%") AND '; break; |
case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break; |
case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]); break; |
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break; |
} |
} |
} |
$requete = rtrim($requete,' AND '); |
return $requete; |
} |
private function creerSousRequeteMotsCles($mot_cle) { |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$requete = $this->creerSousRequeteMotsClesOu($mot_cle); |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$requete = $this->creerSousRequeteMotsClesEt($mot_cle); |
} else { |
// Construction de la requête |
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE ". |
'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle)); |
$elements = $this->executerRequete($prerequete); |
if ($elements != false && count($elements) > 0) { |
$requete = ' ( '; |
foreach ($elements as $occurence) { |
$requete .= '(ci_meta_mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur = '. |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} else { |
$requete = ' (ci_meta_mots_cles like "inexistant" OR'; |
} |
} |
$requete = rtrim($requete,' OR ').' ) AND '; |
return $requete; |
} |
private function creerSousRequeteMotsClesOu($mot_cle) { |
$tab_mots_cles = explode('OU', $mot_cle); |
$where = ''; |
foreach ($tab_mots_cles as $mot) { |
$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR '; |
} |
$where = rtrim($where,' OR '); |
// Construction de la requête |
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_images WHERE $where "; |
$elements = $this->executerRequete($prerequete);//print_r($elements); |
if ($elements != false && count($elements) > 0) { |
$requete = ' ( '; |
foreach ($elements as $occurence) { |
$requete .= '(ci_meta_mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur = '. |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} else { |
$requete = ' (ci_meta_mots_cles like "inexistant" OR'; |
} |
return $requete; |
} |
private function creerSousRequeteMotsClesEt($mot_cle) { |
$where = ''; |
$champs = 'a.cmc_id_proprietaire , '; |
$table = ''; |
$i = "a"; $j = "a"; |
$tab_mots_cles = explode("ET", $mot_cle); |
foreach ($tab_mots_cles as $mot) { |
$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , "; |
$table .= "cel_mots_cles_images $i , "; |
$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND '; |
if ($i !== "a") { |
$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND "; |
$j++; |
} |
$i++; |
} |
$where = rtrim($where,' AND '); |
$champs = rtrim($champs,' , '); |
$table = rtrim($table,' , '); |
// Construction de la requête |
$prerequete = "SELECT $champs FROM $table WHERE $where "; |
$elements = $this->executerRequete($prerequete);//print_r($elements); |
if ($elements != false && count($elements) > 0) { |
$requete = ' ( '; |
foreach ($elements as $occurence) { |
$requete .= ' ('; |
for ($j = 'a'; $j < $i; $j++) { |
$requete .= 'ci_meta_mots_cles like "%'.$occurence[$j].'%" AND '; |
} |
$requete .= ' ci_ce_utilisateur = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} else { |
$requete = ' (ci_meta_mots_cles like "inexistant" OR'; |
} |
return $requete; |
} |
private function creerSousRequeteProjet($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$requete = $this->creerSousRequeteProjetOu($mot_cle); |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$requete = $this->creerSousRequeteProjetEt($mot_cle); |
} else { |
// Construction de la requête |
$prerequete = 'SELECT * '. |
'FROM cel_mots_cles_obs '. |
'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle)); |
$elements = $this->executerRequete($prerequete); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
foreach ($elements as $occurence) { |
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '. |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} |
} |
$requete = rtrim($requete,' OR ').' AND '; |
return $requete; |
} |
private function creerSousRequeteProjetOu($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
$tab_mots_cles = explode('OU', $mot_cle); |
$where = ''; |
foreach ($tab_mots_cles as $mot) { |
$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR '; |
} |
$where = rtrim($where,' OR '); |
// Construction de la requête |
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where "; |
$elements = $this->executerRequete($prerequete); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
foreach ($elements as $occurence) { |
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '. |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} |
return $requete; |
} |
private function creerSousRequeteProjetEt($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
$where = ''; |
$champs = 'a.cmc_id_proprietaire , '; |
$table = ''; |
$i = "a"; $j = "a"; |
$tab_mots_cles = explode("ET", $mot_cle); |
foreach ($tab_mots_cles as $mot) { |
$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , "; |
$table .= "cel_mots_cles_obs $i , "; |
$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND '; |
if ($i !== "a") { |
$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND "; |
$j++; |
} |
$i++; |
} |
$where = rtrim($where, ' AND '); |
$champs = rtrim($champs, ' , '); |
$table = rtrim($table, ' , '); |
// Construction de la requête |
$prerequete = "SELECT $champs FROM $table WHERE $where "; |
$elements = $this->executerRequete($prerequete);//print_r($elements); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
foreach ($elements as $occurence) { |
$requete = ' ('; |
for ($j = 'a'; $j < $i; $j++) { |
$requete .= 'mots_cles like "%'.$occurence[$j].'%" AND '; |
} |
$requete .= ' identifiant = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} |
return $requete; |
} |
private function creerSousRequeteRechercheGenerale($chaine_requete) { |
$requete = ''; |
if (trim($chaine_requete) != '') { |
$chaine_requete = strtolower($chaine_requete); |
$chaine_requete = str_replace(' ', '_', $chaine_requete); |
$requete = ' ('. |
'b.nom_ret LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'b.nom_sel LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'b.location LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.id_location LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'c.ci_ce_utilisateur LIKE "'.$chaine_requete.'%" '. |
') '; |
} |
return $requete; |
} |
private function estUneRechercheGenerale() { |
return isset($_GET['recherche']); |
} |
private function traiterCriteresMultiples($tableau_criteres) { |
$tableau_criteres_pour_bdd = array(); |
foreach($tableau_criteres as $nom_critere => $valeur_critere) { |
if (isset($this->criteres[$nom_critere])) { |
$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere; |
} |
} |
return $tableau_criteres_pour_bdd; |
} |
private function creerDescriptionComplet($donnees, $item) { |
$auteur = $this->auteurs[$donnees['ci_ce_utilisateur']]; |
$auteur_mail = $donnees['ci_ce_utilisateur']; |
$id_img = $donnees['ci_id_image']; |
$nom_fichier = $donnees['ci_nom_original']; |
$url_img = $this->getUrlImage($donnees['ci_id_image'], 'CS'); |
$url_img_normale = $this->getUrlImage($donnees['ci_id_image'], 'XL'); |
$mots_cles_image = $this->decoderMotsClesImg($donnees['identifiant'], $donnees['ci_meta_mots_cles']); |
$note = ($donnees['ci_note_image'] +1).'/5'; |
$commentaire_img = $donnees['ci_meta_comment']; |
$id_obs = $donnees['id']; |
$famille = $donnees['famille']; |
$nom_saisi = $donnees['nom_sel']; |
$nom_retenu = $donnees['nom_ret']; |
$mots_cles_obs = $this->decoderMotsClesObs($donnees['identifiant'], $donnees['mots_cles']); |
$lieu = $donnees['location'].' ('.$donnees['id_location'].') > '.$donnees['lieudit'].' > '.$donnees['station']; |
$milieu = $donnees['milieu']; |
$coordonnees = ($this->etreNull($donnees['coord_x']) && $this->etreNull($donnees['coord_y'])) ? '' : $donnees['coord_x'].'/'.$donnees['coord_y']; |
$commentaire_obs = $donnees['commentaire']; |
$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y'); |
$date_transmission = $this->formaterDate($donnees['date_transmission']); |
$date_modification = $this->formaterDate($donnees['date_modification']); |
$date_creation = $this->formaterDate($donnees['date_creation']); |
$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non'; |
$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'. |
'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'. |
'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'. |
'<div class="gauche">'. |
'<h3>'.'Image'.'</h3>'. |
'<ul>'. |
'<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'. |
'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'. |
'<li>'.'<span class="champ">Par :</span> '. |
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur). |
'</li>'. |
'<li>'.'<span class="champ">Nom du fichier :</span> '.$nom_fichier.'</li>'. |
'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'. |
'<li>'.'<span class="champ">Commentaires :</span> '.$commentaire_img.'</li>'. |
'<li>'.'<span class="champ">Mots-clés :</span> '.implode(', ', $mots_cles_image).'</li>'. |
'</ul>'. |
'</div>'; |
// TODO : ajouter le champ commentaire EXIF. |
if (! $this->etreNull($id_obs)) { |
$description .= |
'<div class="gauche">'. |
'<h3>'.'Observation'.'</h3>'. |
'<ul>'. |
'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'. |
'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'. |
'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'. |
'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'. |
'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'. |
'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'. |
(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : ''). |
'<li>'.'<span class="champ">Commentaire :</span> '.$commentaire_obs.'</li>'. |
'<li>'.'<span class="champ">Mots-clés :</span> '.implode(', ', $mots_cles_obs).'</li>'. |
(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : ''). |
'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'. |
'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'. |
'</ul>'. |
'</div>'; |
} |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function getServiceParMotsCles() { |
$infos=array(); |
$infos[0]['num_nom_sel'] = ''; |
$infos[0]['ci_meta_date_ajout'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getServiceParCommune() { |
$infos=array(); |
$infos[0]['num_nom_sel'] = ''; |
$infos[0]['ci_meta_date_ajout'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
} |
/tags/celw-v1.1/jrest/services/ImageDateList.php |
---|
New file |
0,0 → 1,114 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package papyrus_bp |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/papyrus_bp/ |
*/ |
/** |
* Liste les date des images par utilisateur |
* |
* in=utf8 |
* out=utf8 |
* |
* uid[0] : utilisateur obligatoire |
* uid[1] : si absent : valeur 'all' (annee) |
* uid[2] : si absent : valeur 'all' (mois) |
* uid[3] : si absent : valeur 'all' (jour) |
**/ |
class ImageDateList extends Cel { |
private $correspondance_fonction = array(1 => 'year', 2 => 'month', 3 => 'day'); |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if(!is_numeric($uid[0])) { |
return; |
} |
$condition_requete = $this->traiterParametresEtConstruireRequete($uid); |
$requete_liste_dates = 'SELECT DISTINCT '. |
'date_prise_de_vue AS id '. |
'FROM cel_images WHERE '.$condition_requete.' '. |
'ORDER BY date_prise_de_vue'; |
$liste_dates = $this->executerRequete($requete_liste_dates); |
$liste_dates = $this->formaterListeResultats($liste_dates); |
$output = json_encode($liste_dates); |
print($output); |
return true; |
} |
private function formaterListeResultats($liste_dates) { |
if (!$liste_dates) { |
$liste_dates = array(); |
} |
foreach($liste_dates as &$date) { |
if($date['id'] == null || trim($date['id']) == '' || $date['id'] == 'null') { |
$date = '0000-00-00'; |
} else { |
$date_heures = split(' ',$date['id']); |
if(count($date_heures) > 1) { |
$date = $date_heures[0]; |
} else { |
$date = $date['id']; |
} |
} |
} |
return $liste_dates; |
} |
private function traiterParametresEtConstruireRequete($params) { |
$requete_condition = ' ce_utilisateur = '.$this->proteger($params[0]); |
$taille_tableau_parametres = count($params); |
for($i=1; $i <= $taille_tableau_parametres; $i++) { |
if($this->estUnParametreDate($params[$i])) { |
$fonction_date = $this->correspondance_fonction[$i]; |
$requete_condition .= ' AND '.$fonction_date.'(date_prise_de_vue) = '.$this->proteger($params[$i]); |
} |
} |
return $requete_condition; |
} |
private function estUnParametreDate($valeur) { |
return is_numeric($valeur) && $valeur != "all"; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.4 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/UserOpenId.php |
---|
New file |
0,0 → 1,246 |
<?php |
/** |
David Delon david.delon@clapas.net 2007 |
Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et |
respectant les principes de diffusion des logiciels libres. Vous pouvez |
utiliser, modifier et/ou redistribuer ce programme sous les conditions |
de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA |
sur le site "http://www.cecill.info". |
En contrepartie de l'accessibilit� au code source et des droits de copie, |
de modification et de redistribution accord�s par cette licence, il n'est |
offert aux utilisateurs qu'une garantie limit�e. Pour les m�mes raisons, |
seule une responsabilit� restreinte p�se sur l'auteur du programme, le |
titulaire des droits patrimoniaux et les conc�dants successifs. |
A cet �gard l'attention de l'utilisateur est attir�e sur les risques |
associ�s au chargement, � l'utilisation, � la modification et/ou au |
d�veloppement et � la reproduction du logiciel par l'utilisateur �tant |
donn� sa sp�cificit� de logiciel libre, qui peut le rendre complexe � |
manipuler et qui le r�serve donc � des d�veloppeurs et des professionnels |
avertis poss�dant des connaissances informatiques approfondies. Les |
utilisateurs sont donc invit�s � charger et tester l'ad�quation du |
logiciel � leurs besoins dans des conditions permettant d'assurer la |
s�curit� de leurs syst�mes et ou de leurs donn�es et, plus g�n�ralement, |
� l'utiliser et l'exploiter dans les m�mes conditions de s�curit�. |
Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez |
pris connaissance de la licence CeCILL, et que vous en avez accept� les |
termes. |
*/ |
/* |
* User.php |
* |
* Cas d'utilisation : |
* Service identification utilisateur |
* |
* |
* 1: Aucun identifiant ni mot de passe transmis |
* 1: L'application retourne l'identifiant de session en cours |
* 2: Une identification est toujours active, cette identification est retournee |
* |
* 1: L'application recoit un identifiant et un mot de passe |
* 1 : On tente login |
* 2 : Si reussi etat connecte |
* 3 : sinon pas connecte |
* |
* 1: L'application recoit un identifiant et pas de mot de passe : |
* 1 : Deconnection |
* |
/* En resume : |
* /User/ : retour id si jamais connecte, sinon retour login_utilisateur |
* /User/login_utilisateur : logout |
* /User/login_utilisateur/password : login |
* |
*/ |
Class UserOpenId extends DBAccessor { |
function UserOpenId($config) { |
$this->config=$config; |
} |
// TODO : controle systematique ....dans tous les services |
// Si connected : name cookie = name service |
function getRessource(){ |
$expireTime = 60*60*24*100; // 100 jours |
session_set_cookie_params($expireTime); |
$connected=false; |
$admin=false; |
session_start(); |
if (!$this->GetUser()) { |
if (isset($_COOKIE["cel_name"]) && ($this->RememberedUser($_COOKIE["cel_name"], $_COOKIE["cel_password"]))) { |
$retour= $this->GetUserName(); |
$connected=true; |
} |
else { |
$retour = session_id(); |
$connected=false; |
} |
} |
else { |
$retour= $this->GetUserName(); |
$connected=true; |
} |
$admin = $this->isAdmin($retour) ; |
$output = json_encode(array($retour,$connected,$admin)); |
print($output); |
} |
function getElement($uid){ |
$connected=false; |
session_start(); |
// Non connect� : verification |
if (isset($uid[1])) { // Identification |
if (!$this->GetUser()) { // Si non identifi� |
if ($this->LoginUser($uid[0],$uid[1],1)) { // identification reussi |
$retour= $this->GetUserName(); |
$connected=true; |
} |
else { |
$retour = session_id(); |
$connected=false; |
} |
} |
else { // Deja identifi� |
$retour= $this->GetUserName(); |
$connected=true; |
} |
} |
else { // Deconnection |
$this->LogoutUser(); |
$retour = session_id(); |
$connected=false; |
} |
$admin = $this->isAdmin($retour) ; |
$output = json_encode(array($retour,$connected,$admin)); |
print($output); |
} |
// USERS |
function LoadUser($name) { |
$password = ; |
$admin = $this->isAdmin($name) ; |
$retour= array("name"=>$name,"password"=>$password,"admin"=>$admin); |
return $retour; |
} |
function GetUserName() { |
if ($user = $this->GetUser()) { |
$name = $user["name"]; |
} |
else { |
$name =""; |
} |
return $name; |
} |
function GetUser() { |
return (isset($_SESSION["user"]) ? $_SESSION["user"] : ''); |
} |
function SetUser($user, $remember=1) { |
$_SESSION["user"] = $user; |
$this->SetPersistentCookie("cel_name", $user["name"], $remember); |
$this->SetPersistentCookie("cel_password", $user["password"], $remember); |
$this->SetPersistentCookie("cel_remember", $remember, $remember); |
} |
function LogoutUser() { |
$_SESSION["user"] = ""; |
$this->DeleteCookie("cel_name"); |
$this->DeleteCookie("cel_password"); |
$this->DeleteCookie("cel_remember"); |
} |
function SetPersistentCookie($name, $value, $remember = 1) { |
SetCookie($name, $value, time() + ($remember ? 90*24*60*60 : 60 * 60),'/'); |
$_COOKIE[$name] = $value; |
} |
function DeleteCookie($name) { |
SetCookie($name, "", 1,'/'); $_COOKIE[$name] = ""; |
} |
function LoginUser($name,$password,$remember=1) { |
if ($existingUser = $this->LoadUser($name)) { |
if ($password!="debug") { |
if ($existingUser["password"] == md5($password)) { |
$this->SetUser($existingUser, $remember); |
return true; |
} |
else { |
return false; |
} |
} |
else { |
$this->SetUser($existingUser, $remember); |
return true; |
} |
} |
} |
function RememberedUser($name,$password,$remember=1) { |
if ($existingUser = $this->LoadUser($name)) { |
if ($existingUser["password"] == $password) { |
$this->SetUser($existingUser, $remember); |
return true; |
} |
else { |
return false; |
} |
} |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.5 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.4 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* Revision 1.3 2007-05-21 18:12:20 ddelon |
* Gestion des importations locale de releves |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/InventoryTransmit.php |
---|
New file |
0,0 → 1,67 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* |
* in : utf8 |
* out : utf8 |
* |
* |
* Transmission observation vers Tela |
*/ |
class InventoryTransmit extends Cel { |
function updateElement($uid,$pairs) { |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (isset($uid[1]) && $this->estUneSuiteIdentifiantsObservation($uid[1])) { |
$requete_transmission = 'UPDATE cel_obs '. |
'SET transmission = '.$pairs['transmission'].','. |
'date_modification = now(), date_transmission = now() '. |
'WHERE ce_utilisateur = '.$this->proteger($uid[0]).' AND ordre in ('.$uid[1].')'; |
} |
$resultat_transmission = $this->executer($requete_transmission); |
if (!$resultat_transmission) { |
return false; |
} |
return true; |
} |
private function estUneSuiteIdentifiantsObservation($chaine) { |
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules |
// sans virgule terminale |
$reg_exp = "/^(([0-9])+,)*([0-9])+$/"; |
return preg_match($reg_exp, $chaine); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.3 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.2 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/InventoryLocationList.php |
---|
New file |
0,0 → 1,60 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* @author David Delon <aurelien@tela-botanica.org> |
* @author Aurélien Peronnet <david@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2010, David Delon, Aurélien Peronnet |
*/ |
/** |
* InventoryLocationList.php |
* |
* in : utf8 |
* out : utf8 |
* Cas d'utilisation : |
* Service listage des zones géographiques d'un utilisateur |
*/ |
class InventoryLocationList extends Cel { |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$retour = array(); |
$requete_zones_geo = 'SELECT DISTINCT ce_zone_geo, zone_geo, lieudit, station FROM cel_obs '. |
'WHERE ce_utilisateur = '.$this->proteger($uid[0]).' '. |
'ORDER BY ce_zone_geo ASC, zone_geo ASC, lieudit ASC, station ASC'; |
$resultat_zones_geo = $this->requeter($requete_zones_geo); |
if (is_array($resultat_zones_geo)) { |
$retour = $resultat_zones_geo; |
} |
$output = json_encode($retour); |
header("content-type: application/json"); |
print($output); |
return true; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.6 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.5 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/ImageContribution.php |
---|
New file |
0,0 → 1,134 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* Classe renvoyant une liste très succinte des observations liées à une image de l'utilisateur |
* |
*/ |
class ImageContribution extends Cel { |
/** |
* Renvoi un petit bout de html contenant les dernières obs liées à |
* une image d'un utilisateur |
* |
* @param string $uid[0] mail de l'utilisateur |
* @param string $uid[1] identifiant numérique de l'utilisateur |
*/ |
function getElement($uid){ |
$requete_obs_liee_images = 'SELECT * FROM cel_obs'. |
' WHERE ce_utilisateur = '.$this->proteger($uid[1]). |
' AND id_observation IN (SELECT id_observation |
FROM cel_obs_images |
WHERE id_utilisateur = '.$this->proteger($uid[1]).' )'. |
' AND transmission = 0'. |
' ORDER BY date_modification DESC LIMIT 0,5'; |
$html = '<div id="resume_cel">'; |
$obs_liees_images = array(); |
$resultat_obs_liees_images = $this->requeter($requete_obs_liee_images); |
if(is_array($resultat_obs_liees_images)) { |
$obs_liees_images = $resultat_obs_liees_images; |
} |
foreach ($obs_liees_images as $obs) { |
$chemin_sur_serveur = $this->config['cel_db']['url_images']; |
$requete_img_liees = 'SELECT * FROM cel_images WHERE id_image '. |
'IN (SELECT id_image FROM cel_obs_images '. |
'WHERE id_observation = "'.$obs['id_observation'].'") '. |
'AND ce_utilisateur = "'.$obs['ce_utilisateur'].'"' ; |
$resultat_requete_img_liees = $this->requeter($requete_img_liees); |
if (is_array($resultat_requete_img_liees) && count($resultat_requete_img_liees) > 0) { |
$premiere_image_liee = $resultat_requete_img_liees[0]; |
$premiere_image_liee['nom_original'] = htmlspecialchars($premiere_image_liee['nom_original']); |
$premiere_image_liee['id_image'] = htmlspecialchars($premiere_image_liee['id_image']); |
$id = $premiere_image_liee['id_image']; |
$tailleXY = $this->calculerDimensions(array($premiere_image_liee['largeur'], $premiere_image_liee['hauteur'])); |
$id = sprintf('%09s', $id) ; |
$id = wordwrap($id, 3 , '_', true) ; |
$id_fichier = $id.".jpg" ; |
$niveauDossier = split("_", $id) ; |
$dossierNiveau1 = $niveauDossier[0] ; |
$dossierNiveau2 = $niveauDossier[1] ; |
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ; |
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ; |
$chemin_fichier_s = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ; |
$html .= '<div class="item_resume_cel">'; |
$html .= '<h4><a href="'.$chemin_fichier.'">'.$obs['nom_ret'].'</a></h4>'. |
'<img src="'.$chemin_fichier_s.'" alt="'.$premiere_image_liee['nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img><br/>'; |
$html .= '<span>Datée du '.$obs['date_modification'].'<br/>' ; |
$html .= 'Lieu : '.trim($obs['zone_geo'],'000null').' ('.trim($obs['ce_zone_geo'],'000null').') '.trim($obs['station'],'000null').' '.trim($obs['lieudit'],'000null').'<br/></p>' ; |
$html .= '</span>'; |
$html .= '</div>'; |
} |
} |
$html.= '</div>'; |
header("Content-Type: text/html; charset=UTF-8"); |
print $html; |
exit; |
} |
private function calculerDimensions($tailleXY) { |
$tailleOr = 75 ; |
if($tailleXY[1] == 0) { |
$tailleXY[1] = $tailleOr; |
} |
if($tailleXY[0] == 0) { |
$tailleXY[0] = $tailleOr; |
} |
$maxTaille = max($tailleXY[1],$tailleXY[0]) ; |
if($maxTaille == $tailleXY[1]) { |
$rapport = $tailleXY[1]/$tailleXY[0] ; |
$tailleXY[1] = 75 ; |
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ; |
}else { |
$rapport = $tailleXY[0]/$tailleXY[1] ; |
$tailleXY[0] = 75 ; |
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ; |
} |
return $tailleXY ; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryObservationCount.php |
---|
New file |
0,0 → 1,59 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* InventoryObservationCount.php |
* |
* in : utf8 |
* out : utf8 |
* |
* Cas d'utilisation : |
* Service recherche du nombre a partir de divers critères |
* |
* 2: Le service recherche le nombre d'images correspondant au critères demandé |
* 3: Le service renvoie le nombre calcule |
*/ |
class InventoryObservationCount extends Cel { |
/** |
* renvoie le nombre d' observations correspondant aux criteres |
* uid[0] : utilisateur obligatoire |
* uid[1] : criteres de filtrage de la forme critere1=valeur1&critere2=valeur2 |
* |
*/ |
function getElement($uid) |
{ |
// Controle detournement utilisateur |
$this->controleUtilisateur($uid[0]); |
$chercheur_observations = new RechercheObservation($this->config); |
$criteres = array(); |
if(isset($uid[1])) |
{ |
$criteres = $chercheur_observations->parserRequeteCriteres($uid[1]) ; |
} |
$retour = $chercheur_observations->compterObservations($uid[0], $criteres); |
$retour_encode = json_encode($retour) ; |
header("content-type: application/json") ; |
print $retour_encode ; |
exit() ; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/SelfRefList.php |
---|
New file |
0,0 → 1,92 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
// in utf8 |
// out utf8 |
// Fournit un référentiel relatif à l'utilisateur sur l'un des champs demandes |
class SelfRefList extends Cel { |
private $referentiels = array('station', 'lieudit', 'milieu'); |
/** |
* Suivant le type de référentiel donné en paramètre, renvoie les liste de ses éléments |
* |
* uid[0] : utilisateur obligatoire |
* uid[1] : referentiel demandé (obligatoire) |
* $_GET["start"] et $GET_["limit"] : selection intervalle |
* $_GET["recherche"] : cherche les nom qui commmencent selon la valeur |
* |
*/ |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!$this->paramObligatoiresSontPresents($uid)) { |
return; |
} |
if($_GET['recherche'] == '*') { |
$_GET['recherche'] = '%'; |
} |
$referentiel_demande = $uid[1]; |
$value=array(); |
$requete_referentiel = "SELECT DISTINCT ".$referentiel_demande." " . |
"FROM cel_obs WHERE ce_utilisateur = '".$uid[0]."' "; |
if($this->filtreRechercheEstDemande()) { |
$requete_referentiel .= " AND ".$referentiel_demande." LIKE '".$_GET["recherche"]."%'"; |
} |
if ($this->limiteEstDemandee()) { |
$requete_referentiel .= " ORDER BY '.$referentiel_demande.' LIMIT ".$_GET["start"].",".$_GET["limit"]; |
} |
$referentiel_resultat = $this->executerRequete($requete_referentiel); |
$referentiel = array(); |
foreach($referentiel_resultat as $cle => $valeur) { |
if($this->estUneValeurValide($valeur[$referentiel_demande])) { |
$referentiel[] = $valeur[$referentiel_demande]; |
} |
} |
$output = json_encode($referentiel); |
print($output); |
} |
function paramObligatoiresSontPresents($uid) { |
return (isset($uid[1]) && in_array($uid[1],$this->referentiels) && (isset($uid[0]) && $uid[0] != "")); |
} |
function filtreRechercheEstDemande() { |
return (isset($_GET["recherche"]) && trim($_GET["recherche"]) != ""); |
} |
function limiteEstDemandee() { |
return isset($_GET["start"]) && is_numeric($_GET["start"]) && isset($_GET["limit"]) && is_numeric($_GET["limit"]); |
} |
function estUneValeurValide($chaine) { |
return ($chaine != null && $chaine != "000null" && trim($chaine) != ""); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.3 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.2 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/NameImage.php |
---|
New file |
0,0 → 1,147 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* NameImage.php |
* |
* in : utf8 |
* out : 8859 |
* |
* Cas d'utilisation : |
* Service recherche d'image a partir d'un numero nomenclatural |
* |
* 1: Le service recoit un numero nomenclatural |
* 2: Le service calcul le numero taxonomique associe |
* 3: Le service recherche une image disponible pour ce numero taxonomique |
* 4: Le service redimensionne l'image et la renvoie |
*/ |
/** Constante stockant l'URL de la page d'accueil de Photoflora.*/ |
define('EF_URL_PHOTOFLORA', 'http://photoflora.free.fr/'); |
/** Constante stockant l'URL de la page de Photoflora affichant toutes les images d'un taxon donné.*/ |
define('EF_URL_PHOTOFLORA_TAXON', EF_URL_PHOTOFLORA.'FiTax.php?NumTaxon=%s'); |
/** Constante stockant l'URL du dossier de photoflora contenant les images miniatures.*/ |
define('EF_URL_PHOTOFLORA_IMG_MIN', 'http://photoflora.free.fr/photos/%s/min/%s'); |
/** Constante stockant l'URL du service XML de Photoflora.*/ |
define('EF_URL_PHOTOFLORA_SERVICE', EF_URL_PHOTOFLORA.'ef_photoflora.php?nt=%s'); |
define('EF_URL_PHOTOFLORA_REGEXP_01', '/\/photos\/([^\/]+)\/max\/(.+)$/'); |
define('EF_URL_PHOTOFLORA_REGEXP_02', '/photoflora([^.]+)\.free\.fr\/max\/(.+)$/'); |
class NameImage extends Cel { |
function getElement($uid){ |
$nt = null; |
if(isset($uid[0])) { |
$recherche_infos_taxon = new RechercheInfosTaxon($this->config); |
$nt = $recherche_infos_taxon->rechercherNumTaxSurNumNom($uid[0]); |
} |
$projet_photo = 'photoflora'; |
$tab_retour[$projet_photo]=chercherIllustrationsServiceXml(sprintf(EF_URL_PHOTOFLORA_SERVICE, $nt)); |
$value=array('null','null'); |
foreach ($tab_retour[$projet_photo] as $cle => $illustration) { |
if (preg_match(EF_URL_PHOTOFLORA_REGEXP_01, $illustration['about'], $match)) { |
$abreviation = $match[1]; |
$fichier = $match[2]; |
} |
else { |
if (preg_match(EF_URL_PHOTOFLORA_REGEXP_02, $illustration['about'], $match)) { |
$abreviation = $match[1]; |
$fichier = $match[2]; |
} |
} |
if (isset($abreviation)) { |
$url_miniature = sprintf(EF_URL_PHOTOFLORA_IMG_MIN, $abreviation, $fichier);; |
$url_max = $illustration['about']; |
$value=array($url_miniature,$url_max); |
// Priorite aux images en png |
if (strstr($fichier, '.png')) { |
break; |
} |
} |
} |
$output = json_encode($value); |
header("content-type: application/json"); |
print($output); |
return true; |
} |
} |
function chercherIllustrationsServiceXml($url) |
{ |
return analyserFichierRdf($url); |
} |
function analyserFichierRdf($chemin) |
{ |
$aso_info = array(); |
$dom = new DOMDocument(); |
$dom->validateOnParse = true; |
if (preg_match('/^http:\/\//', $chemin)) { |
@$dom->loadXML(file_get_contents($chemin)); |
} else { |
@$dom->load($chemin); |
} |
$tab_infos = array(); |
foreach ($dom->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'Description') as $rdf_description) { |
$aso_info['about'] = $rdf_description->getAttribute('about'); |
$aso_info['dc:identifier'] = $rdf_description->getAttribute('identifier'); |
$aso_info['dc:title'] = utf8_decode($rdf_description->getAttribute('title')); |
$aso_info['dc:creator'] = utf8_decode($rdf_description->getAttribute('creator')); |
$aso_info['dc:contributor'] = utf8_decode($rdf_description->getAttribute('contributor')); |
$aso_info['dc:publisher'] = utf8_decode($rdf_description->getAttribute('publisher')); |
$aso_info['dc:type'] = utf8_decode($rdf_description->getAttribute('type')); |
$aso_info['dc:format'] = utf8_decode($rdf_description->getAttribute('format')); |
if (function_exists('date_default_timezone_set')) { |
date_default_timezone_set('Europe/Paris'); |
} |
if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $rdf_description->getAttribute('created'))) { |
$aso_info['dcterms:created'] = date('j-m-Y à H:i:s', strtotime($rdf_description->getAttribute('created'))); |
} else { |
$aso_info['dcterms:created'] = $rdf_description->getAttribute('created'); |
} |
$aso_info['dcterms:dateSubmitted'] = utf8_decode($rdf_description->getAttribute('dateSubmitted')); |
$aso_info['dcterms:spatial'] = utf8_decode($rdf_description->getAttribute('spatial')); |
$aso_info['dcterms:licence'] = utf8_decode($rdf_description->getAttribute('licence')); |
$tab_infos[$rdf_description->getAttribute('identifier')] = $aso_info; |
} |
return $tab_infos; |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.4 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.2 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.1 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/InventoryDateList.php |
---|
New file |
0,0 → 1,105 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* Liste les date de releves par utilisateur |
* |
* in=utf8 |
* out=utf8 |
* |
**/ |
class InventoryDateList extends Cel { |
private $correspondance_fonction = array(1 => 'year', 2 => 'month', 3 => 'day'); |
/** |
* @param int uid[0] : utilisateur obligatoire |
* @param int uid[1] : si absent : valeur 'all' (annee) |
* @param int uid[2] : si absent : valeur 'all' (mois) |
* @param int uid[3] : si absent : valeur 'all' (jour) |
*/ |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$condition_requete = $this->traiterParametresEtConstruireRequete($uid); |
$requete_liste_dates = 'SELECT DISTINCT '. |
'date_observation AS id '. |
'FROM cel_obs WHERE '.$condition_requete.' '. |
'ORDER BY date_observation'; |
$liste_dates = $this->executerRequete($requete_liste_dates); |
$liste_dates = $this->formaterListeResultats($liste_dates); |
$output = json_encode($liste_dates); |
print($output); |
return true; |
} |
private function formaterListeResultats($liste_dates) { |
if (!$liste_dates) { |
$liste_dates = array(); |
} |
foreach($liste_dates as &$date) { |
$date_heures = split(' ',$date['id']); |
if(count($date_heures) > 1) { |
$date = $date_heures[0]; |
} |
$date = $date; |
} |
return $liste_dates; |
} |
private function traiterParametresEtConstruireRequete($params) { |
$requete_condition = ' ce_utilisateur = '.$this->proteger($params[0]); |
$taille_tableau_parametres = count($params); |
for($i=1; $i <= $taille_tableau_parametres; $i++) { |
if($this->estUnParametreDate($params[$i])) { |
$fonction_date = $this->correspondance_fonction[$i]; |
$requete_condition .= ' AND '.$fonction_date.'(date_observation) = '.$this->proteger($params[$i]); |
} |
} |
return $requete_condition; |
} |
private function estUnParametreDate($valeur) { |
return is_numeric($valeur) && $valeur != "all"; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.4 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/InventoryPDF.php |
---|
New file |
0,0 → 1,249 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david.delon@clapas.net> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** Constante stockant l'URL de la page d'accueil de Photoflora.*/ |
define('EF_URL_PHOTOFLORA', 'http://photoflora.free.fr/'); |
/** Constante stockant l'URL de la page de Photoflora affichant toutes les images d'un taxon donn.es.*/ |
define('EF_URL_PHOTOFLORA_TAXON', EF_URL_PHOTOFLORA.'FiTax.php?NumTaxon=%s'); |
/** Constante stockant l'URL du dossier de photoflora contenant les images miniatures.*/ |
define('EF_URL_PHOTOFLORA_IMG_MIN', 'http://www.tela-botanica.org/~photoflo/photos/%s/min/%s'); |
/** Constante stockant l'URL du dossier de photoflora contenant les images normale.*/ |
define('EF_URL_PHOTOFLORA_IMG_MAX', 'http://www.tela-botanica.org/~photoflo/photos/%s/max/%s'); |
/** Constante stockant l'expression r.guli.re r.cup.rant l'abr.viation du photographe et le nom du fichier.*/ |
define('EF_URL_PHOTOFLORA_REGEXP', '/\/photos\/([^\/]+)\/max\/(.+)$/'); |
/** Constante stockant l'URL du service XML de Photoflora.*/ |
define('EF_URL_PHOTOFLORA_SERVICE', EF_URL_PHOTOFLORA.'ef_photoflora.php?nt=%s'); |
/** |
* InventoryPDF.php |
* |
* in : utf8 |
* out : iso8859 |
* |
* Formatage pdf d'un releve (a revoir) |
*/ |
class InventoryPDF extends Cel { |
var $extendPDFProductor; |
function InventoryPDF($config) { |
parent::__construct($config); |
$this->config=$config; |
// Pas d'heritage multiple en php :( |
$this->extendPDFProductor = new PDFProductor(); |
$this->extendPDFProductor->initPDF(); |
} |
/** |
* uid[0] : utilisateur obligatoire |
* uid[1] : si absent : valeur 'all' (commune) |
* uid[2] : si absent : valeur 'all' (date) |
* uid[3] : si absent : valeur 'all' (recherche libre) |
* uid[4] : si absent : valeur 'all' (station) |
*/ |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[1]) || $uid[1]=="" || $uid[1]=="all" ) { |
$uid[1]="all"; |
$requete_location=""; |
} |
else { |
$requete_location=" AND location= ".$this->proteger($uid[1])." "; |
} |
if (!isset($uid[2]) || $uid[2]=="" || $uid[2]=="all") { |
$uid[2]="all"; |
$requete_date=""; |
} |
else { |
$requete_date=" AND date_observation= ".$this->proteger($uid[2])." "; |
} |
if (!isset($uid[3]) || $uid[3]=="" || $uid[3]=="all") { |
$uid[3]="all"; |
$requete_libre=""; |
} |
else { |
$requete_libre=" AND (nom_sel LIKE ".$this->proteger('%'.$uid[3].'%'). |
" OR nom_ret LIKE ".$this->proteger('%'.$uid[3].'%'). |
" OR station LIKE ".$this->proteger('%'.$uid[3].'%'). |
" OR commentaire LIKE ".$this->proteger('%'.$uid[3].'%'); |
} |
if (!isset($uid[4]) || $uid[4]=="" || $uid[4]=="all") { |
$uid[4]="all"; |
$requete_station=""; |
} |
else { |
$requete_station=" AND station= ".$this->proteger($uid[4])." "; |
} |
$value=array(); |
$requete="SELECT ce_utilisateur, ordre, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, zone_geo, date_observation," . |
" station, commentaire, transmission FROM cel_obs WHERE ce_utilisateur = ".$this->proteger($uid[0])." " . |
$requete_location. |
$requete_date. |
$requete_libre. |
$requete_station. |
" ORDER BY ordre "; |
$resultat_requete = $this->requeter($requete); |
$observations = array();; |
if(is_array($resultat_requete)) { |
$observations = $resultat_requete; |
} |
// Set up the pdf object. |
$pdf = &File_PDF::factory(array('orientation' => 'P', 'format' => 'A4')); |
// DesActivate compression. |
$pdf->setCompression(false); |
$pdf->setMargins(0, 0); |
// Enable automatic page breaks. |
$pdf->setAutoPageBreak(true); |
// Start the document. |
$pdf->open(); |
// Start a page. |
$pdf->addPage(); |
$pdf->setFont('Times', '' , 12); |
$i=1; |
$tempfn = tempnam("",""); |
foreach ($observations as $obs) { |
// Denullifiage |
foreach($obs as $k=>$v) { |
if (($v=="null") || ($v=="000null")) { |
$obs[$k]=""; |
} |
else { |
$obs[$k]=utf8_decode($v); |
} |
} |
if ($obs['date_observation']!="0000-00-00 00:00:00") { |
list($year,$month,$day)= split ('-',$obs['date_observation']); |
list($day)= split (' ',$day); |
$obs['date_observation']=$day."/".$month."/".$year; |
} |
else { |
$obs['date_observation']="00/00/0000"; |
} |
$text= $obs['nom_sel']." ".$obs['nom_sel_nn']." ".$obs['nom_ret']." ".$obs['nom_ret_nn']." ".$obs['nt']." ". |
$obs['famille']." ".$obs['zone_geo']." ".$obs['ce_zone_geo']." ".$obs['date_observation']." ".$obs['station']; |
$obs['commentaire']; |
$pdf->write(10, $text."\n"); |
$projet_photo = 'photoflora'; |
$tab_retour[$projet_photo]=chercherIllustrationsServiceXml(sprintf(EF_URL_PHOTOFLORA_SERVICE, $obs['nt'])); |
$url_miniature =''; |
foreach ($tab_retour[$projet_photo] as $cle => $illustration) { |
if (preg_match(EF_URL_PHOTOFLORA_REGEXP, $illustration['about'], $match)) { |
$abreviation = $match[1]; |
$fichier = $match[2]; |
$url_miniature = sprintf(EF_URL_PHOTOFLORA_IMG_MIN, $abreviation, $fichier);; |
// Priorite aux images en png |
if (strstr($fichier, '.png')) { |
break; |
} |
} |
} |
if ($url_miniature!='') { |
list($debut,$ext)=split("\.",basename($url_miniature)); |
$temp = fopen($tempfn, "w"); |
$buf=file_get_contents($url_miniature); |
fwrite($temp,$buf); |
fclose($temp); |
$pdf->image($tempfn,10,($i*10),0,0,$ext); |
} |
$i++; |
} |
echo $pdf->output("Rapport"); |
} |
} |
function chercherIllustrationsServiceXml($url) |
{ |
return analyserFichierRdf($url); |
} |
function analyserFichierRdf($chemin) |
{ |
$aso_info = array(); |
$dom = new DOMDocument(); |
$dom->validateOnParse = true; |
if (preg_match('/^http:\/\//', $chemin)) { |
$dom->loadXML(file_get_contents($chemin)); |
} else { |
$dom->load($chemin); |
} |
$tab_infos = array(); |
foreach ($dom->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'Description') as $rdf_description) { |
$aso_info['about'] = $rdf_description->getAttribute('about'); |
$aso_info['dc:identifier'] = $rdf_description->getAttribute('identifier'); |
$aso_info['dc:title'] = utf8_decode($rdf_description->getAttribute('title')); |
$aso_info['dc:creator'] = utf8_decode($rdf_description->getAttribute('creator')); |
$aso_info['dc:contributor'] = utf8_decode($rdf_description->getAttribute('contributor')); |
$aso_info['dc:publisher'] = utf8_decode($rdf_description->getAttribute('publisher')); |
$aso_info['dc:type'] = utf8_decode($rdf_description->getAttribute('type')); |
$aso_info['dc:format'] = utf8_decode($rdf_description->getAttribute('format')); |
if (function_exists('date_default_timezone_set')) { |
date_default_timezone_set('Europe/Paris'); |
} |
if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $rdf_description->getAttribute('created'))) { |
$aso_info['dcterms:created'] = date('j-m-Y � H:i:s', strtotime($rdf_description->getAttribute('created'))); |
} else { |
$aso_info['dcterms:created'] = $rdf_description->getAttribute('created'); |
} |
$aso_info['dcterms:dateSubmitted'] = utf8_decode($rdf_description->getAttribute('dateSubmitted')); |
$aso_info['dcterms:spatial'] = utf8_decode($rdf_description->getAttribute('spatial')); |
$aso_info['dcterms:licence'] = utf8_decode($rdf_description->getAttribute('licence')); |
$tab_infos[$rdf_description->getAttribute('identifier')] = $aso_info; |
} |
return $tab_infos; |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.2 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.1 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.4 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
*/ |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/celw-v1.1/jrest/services/InventoryContributionList.php |
---|
New file |
0,0 → 1,76 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package papyrus_bp |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/ |
*/ |
/** |
* Classe renvoyant fragment html constitué à partir d'une liste très succinte des contributions de l'utilisateur |
* |
*/ |
class InventoryContributionList extends Cel { |
function getRessource() { |
echo ''; |
} |
function getElement($uid){ |
if(!isset($uid[0])) { |
echo ''; |
} |
$requete_contributions = "SELECT * FROM cel_obs ". |
"WHERE ce_utilisateur = ".$this->proteger($uid[0])." ". |
"ORDER BY date_modification DESC LIMIT 0,5"; |
$resultat_contributions = $this->requeter($requete_contributions); |
$resume = ''; |
if (is_array($resultat_contributions)) { |
foreach ($resultat_contributions as $ligne) { |
$ligne['nom_sel'] = htmlspecialchars($ligne['nom_sel']); |
$ligne['ce_utilisateur'] = htmlspecialchars($ligne['ce_utilisateur']); |
$ligne['zone_geo'] = htmlspecialchars($ligne['zone_geo']); |
$ligne['id_zone_geo'] = htmlspecialchars($this->convertirCodeZoneGeoVersDepartement($ligne['ce_zone_geo'])); |
$ligne['station'] = htmlspecialchars($ligne['station']); |
$ligne['milieu'] = htmlspecialchars($ligne['milieu']); |
$ligne['commentaire'] = htmlspecialchars($ligne['commentaire']); |
$ligne['transmission'] = htmlspecialchars($ligne['transmission']); |
$resume.= '<p>'.$ligne['nom_sel'] ." (".$ligne['nom_sel_nn'].") ". |
'Location : '. $ligne['zone_geo']." (".$ligne['id_zone_geo']."),". $ligne['station'] . "," . |
$ligne['milieu'] . "," . $ligne['commentaire'] . "," . $ligne['transmission'] . |
'</p>'; |
} |
} |
header("Content-Type: text/html; charset=ISO-8859-1"); |
print $resume; |
exit; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.5 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.4 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/InventoryImageListPublic.php |
---|
New file |
0,0 → 1,66 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botania.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* in : utf8 |
* out : utf8 |
* |
* Service recherche d'images publique a partir de divers critères |
* |
*/ |
class InventoryImageListPublic extends Cel { |
const start_defaut = 0; |
const limit_defaut = 100; |
function getRessource() { |
} |
function getElement($uid) |
{ |
$criteres = array('transmission' => '1'); |
if($uid[0] != '*' && empty($_GET)) { |
header("content-type: application/json"); |
$images_json = json_encode(array()); |
print $images_json; |
exit() ; |
} |
$this->start = isset($_GET['start']) ? $_GET['start'] : self::start_defaut; |
$this->limit = isset($_GET['limit']) ? $_GET['limit'] : self::limit_defaut; |
$criteres['mots_cles'] = isset($_GET['tag']) ? $_GET['tag'] : null; |
$criteres['ce_utilisateur'] = isset($_GET['auteur']) ? $_GET['auteur'] : null; |
$criteres['zone_geo'] = isset($_GET['commune']) ? $_GET['commune'] : null; |
$criteres['taxon'] = isset($_GET['taxon']) ? $_GET['taxon'] : null; |
$criteres['ce_zone_geo'] = isset($_GET['dept']) ? $_GET['dept'] : null; |
$chercheur_images = new RechercheImage($this->config); |
$total = $chercheur_images->compterImages($criteres['ce_utilisateur'], $criteres); |
$images = $chercheur_images->rechercherImages($criteres['ce_utilisateur'], $criteres, $this->start, $this->limit); |
$resultat = array('total' => $total,'images' => $images); |
$images_json = json_encode($resultat) ; |
$images_json = str_replace('\u0000','',$images_json); |
header("content-type: application/json") ; |
print $images_json ; |
exit() ; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryImageList.php |
---|
New file |
0,0 → 1,104 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* InventoryImageList.php |
* |
* in : utf8 |
* out : utf8 |
* |
* Service recherche, et de suppression multiple d'images a partir de divers critères |
* |
*/ |
class InventoryImageList extends Cel { |
/** |
* Recherche les images correspondant aux critères passés en paramètres |
* uid[0] : utilisateur obligatoire |
* uid[1] : critères de filtrage de la forme critère1=valeur1;critère2=valeur2 |
*/ |
function getElement($uid) |
{ |
//TODO : remplacer le contenu du $uid[1] par le tableau $_GET; |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$chercheur_images = new RechercheImage($this->config); |
$numero_page = 0; |
$taille_page = 50; |
$criteres = array(); |
if(isset($uid[1])) |
{ |
$criteres = $chercheur_images->parserRequeteCriteres($uid[1]) ; |
if(isset($criteres['numero_page']) && isset($criteres['limite'])) { |
$numero_page = $criteres['numero_page']; |
$taille_page = $criteres['limite']; |
} |
} |
$retour = $chercheur_images->rechercherImagesEtObservationAssociees($uid[0], $criteres, $numero_page, $taille_page); |
$retour_encode = json_encode($retour) ; |
$retour_encode = $this->nettoyerCaracteresNuls($retour_encode); |
header("content-type: application/json") ; |
print $retour_encode ; |
exit() ; |
} |
private function nettoyerCaracteresNuls($chaine) { |
return str_replace('\u0000','',$chaine); |
} |
/** |
* Méthode appelée avec une requête de type DELETE. |
* Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre |
* Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules |
* |
* @param int uid[0] id utilisateur |
* @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules |
* |
*/ |
function deleteElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) { |
return; |
} |
$ordres_images = explode(',',$uid[1]); |
$gestionnaire_image = new GestionImage($this->config); |
$suppression_image = $gestionnaire_image->supprimerImage($uid[0], $ordres_images); |
$this->envoyer('OK'); |
exit; |
} |
private function estUneSuiteIdentifiantsImage($chaine) { |
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules |
// sans virgule terminale |
$reg_exp = "/^(([0-9])+,)*([0-9])+$/"; |
return preg_match($reg_exp, $chaine); |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/Inventory.php |
---|
New file |
0,0 → 1,154 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <david@tela-botanica.org> |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* CRUD observation |
* |
* in=utf8 |
* out=utf8 |
* |
**/ |
class Inventory extends Cel { |
// TODO;: faire un descriptif du service |
function getRessource(){ |
} |
function getElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
$value=array(); |
if(!isset($uid[0])) { |
return; |
} |
$parametres_recherche = array(array('ce_utilisateur',$uid[0]),array('ordre',$uid[1])); |
$chercheur_observations = new RechercheObservation($this->config); |
$retour_recherche = $chercheur_observations->rechercherObservations($uid[0], $parametres_recherche, 0, 1); |
$observation = array(); |
if(is_array($retour_recherche) && count($retour_recherche) > 0) { |
$observation = $retour_recherche[0]; |
} |
$observation = $this->formaterObservationVersTableauSequentiel(&$observation); |
$output = json_encode($observation); |
header("Content-type: application/json"); |
print($output); |
return true; |
} |
private function formaterObservationVersTableauSequentiel($observation) { |
if ($observation['date_observation']!="0000-00-00 00:00:00") { |
list($year,$month,$day)= split ('-',$observation['date_observation']); |
list($day)= split (' ',$day); |
$observation['date_observation']=$day."/".$month."/".$year; |
} |
$observation = array($observation['nom_sel'], $observation['nom_sel_nn'], |
$observation['nom_ret'], $observation['nom_ret_nn'], |
$observation['nt'], $observation['famille'], $observation['zone_geo'], |
$observation['ce_zone_geo'], $observation['ordre'], |
$observation['date_observation'], $observation['lieudit'], |
$observation['station'], $observation['milieu'], |
$observation['commentaire'], $observation['latitude'], |
$observation['longitude']); |
return $observation; |
} |
function updateElement($uid,$pairs) { |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[1])) { |
//TODO: envoyer un message d'erreur |
return; |
} |
$uid[1] = rtrim($uid[1],','); |
$gestionnaire_observation = new GestionObservation($this->config); |
$modification_observation = $gestionnaire_observation->modifierObservation($uid[0],$uid[1],$pairs); |
return true; |
} |
function createElement($pairs){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
$gestionnaire_observation = new GestionObservation($this->config); |
$gestionnaire_observation->ajouterObservation($pairs['ce_utilisateur'], $pairs); |
return true; |
} |
/** |
* Supprime une observation |
* |
* uid[0] : utilisateur obligatoire |
* uid[1] : ordres de l'observation à supprimer |
*/ |
function deleteElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[1])) { |
//TODO: envoyer un message d'erreur |
return; |
} |
$uid[1] = rtrim($uid[1],','); |
$gestionnaire_observation = new GestionObservation($this->config); |
$suppression_observation = $gestionnaire_observation->supprimerObservation($uid[0],$uid[1]); |
if ($suppression_observation) { |
echo "OK"; |
} |
exit() ; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.11 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.10 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.9 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/LicenceUtilisateur.php |
---|
New file |
0,0 → 1,53 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Classe gérant l'acceptation de la licence utilisateur |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2010, Aurélien Peronnet |
*/ |
class LicenceUtilisateur extends Cel { |
/** |
* Fonction appelée sur un POST |
* |
* Accepte ou refuse la licence utilisateur, en mettant à jour la base de données pour |
* l'utilisateur indiqué |
* |
* @param array $uid |
* @param array $pairs |
*/ |
function updateElement($uid,$pairs) { |
if(!isset($uid[0]) && is_numeric($uid[0])) { |
return; |
} |
if(!isset($pairs['licence'])) { |
return; |
} |
$requete_acceptation_licence = 'UPDATE cel_utilisateurs '. |
'SET licence_acceptee = '.$this->proteger($pairs['licence']). |
'WHERE id_utilisateur = '.$this->proteger($uid[0]); |
$resultat_acceptation_licence = $this->executer($requete_acceptation_licence); |
$resultat = false; |
if($resultat_acceptation_licence) { |
$resultat = "OK"; |
} |
echo $resultat; |
exit; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/TestCreationDossier.php |
---|
New file |
0,0 → 1,20 |
<?php |
class TestCreationDossier { |
var $config; |
public function __construct($config) { |
$this->config = $config; |
} |
public function getRessource() { |
$id_nouvelle_image = 95001; |
$format = 'XL'; |
$manipulateurImage = new ImageRecreation($this->config); |
$fichier_stocke = $manipulateurImage->creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id_nouvelle_image, $format); |
echo $fichier_stocke; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/include/extract_metadonnee.php |
---|
New file |
0,0 → 1,481 |
<?php |
/** |
Aurelien Peronnet aurelienperonnet@gmail.com 2008 |
Ce logiciel est r?gi par la licence CeCILL soumise au droit fran?ais et |
respectant les principes de diffusion des logiciels libres. Vous pouvez |
utiliser, modifier et/ou redistribuer ce programme sous les conditions |
de la licence CeCILL telle que diffus?e par le CEA, le CNRS et l'INRIA |
sur le site "http://www.cecill.info". |
En contrepartie de l'accessibilit? au code source et des droits de copie, |
de modification et de redistribution accord?s par cette licence, il n'est |
offert aux utilisateurs qu'une garantie limit?e. Pour les m?mes raisons, |
seule une responsabilit? restreinte p?se sur l'auteur du programme, le |
titulaire des droits patrimoniaux et les conc?dants successifs. |
A cet ?gard l'attention de l'utilisateur est attir?e sur les risques |
associ?s au chargement, ? l'utilisation, ? la modification et/ou au |
d?veloppement et ? la reproduction du logiciel par l'utilisateur ?tant |
donn? sa sp?cificit? de logiciel libre, qui peut le rendre complexe ? |
manipuler et qui le r?serve donc ? des d?veloppeurs et des professionnels |
avertis poss?dant des connaissances informatiques approfondies. Les |
utilisateurs sont donc invit?s ? charger et tester l'ad?quation du |
logiciel ? leurs besoins dans des conditions permettant d'assurer la |
s?curit? de leurs syst?mes et ou de leurs donn?es et, plus g?n?ralement, |
? l'utiliser et l'exploiter dans les m?mes conditions de s?curit?. |
Le fait que vous puissiez acc?der ? cet en-t?te signifie que vous avez |
pris connaissance de la licence CeCILL, et que vous en avez accept? les |
termes. |
*/ |
// in : utf8 |
// out : utf8 |
/* |
* extractmetadonnee.php |
* |
* Cas d'utilisation : |
* exitraire des metadonnees exif et iptc d'une image |
* |
*/ |
function extraire_metadonnees($url) |
{ |
$iptc = extraire_iptc($url) ; |
$exif = extraire_exif($url) ; |
$meta = array_merge($exif,$iptc); |
fin_tableau_meta(&$meta) ; |
return $meta ; |
} |
/** |
* Extraction des metadonnées exif |
**/ |
function extraire_exif($url) |
{ |
$exif_tab = preparer_tableau_exif() ; |
$exif = exif_read_data($url,"EXIF,COMPUTED,IFD0,FILE,COMMENT",true,false); |
foreach ($exif as $key => $section) |
{ |
foreach ($section as $name => $val) |
{ |
if($name != "MakerNote") |
{ |
construire_tableau_insertion_exif($name, $val ,&$exif_tab) ; |
} |
} |
} |
return $exif_tab ; |
} |
/** |
* Extraction des metadonnées iptc |
**/ |
function extraire_iptc($url) |
{ |
$iptc_tab = preparer_tableau_iptc() ; |
// geimagesize renvoie le infos iptc dans le tableau info |
$size = getimagesize($url, $info); |
// s'il existe |
if (isset($info["APP13"])) |
{ |
// on parse les donnees |
$iptc = iptcparse($info["APP13"]); |
// et on les analyse |
foreach($iptc as $marker => $section) |
{ |
foreach($section as $nom => $val) |
{ |
// pour remplir le tableau de donnees |
construire_tableau_insertion_iptc($marker, $val ,&$iptc_tab) ; |
} |
} |
} |
return $iptc_tab ; |
} |
// construit le tableau pour la requete avec les metadonnees exif |
function construire_tableau_insertion_exif($nom, $val ,$data_tab) |
{ |
switch($nom) |
{ |
case "Height" : |
$data_tab['ci_meta_height'] = $val ; |
break ; |
case "Width" : |
$data_tab['ci_meta_width'] = $val ; |
break ; |
case "Make" : |
$data_tab['ci_meta_make'] = $val ; |
break ; |
case "Model" : |
$data_tab['ci_meta_model'] = $val ; |
break ; |
case "XResolution" : |
$data_tab['ci_meta_x_resolution'] = $val ; |
break ; |
case "YResolution" : |
$data_tab['ci_meta_y_resolution'] = $val ; |
break ; |
case "DateTimeOriginal" : |
$data_tab['ci_meta_date_time'] = $val ; |
break ; |
case "GPS" : |
$data_tab['ci_meta_gps'] = $val ; |
break ; |
case "UserComment" : |
$data_tab['ci_meta_user_comment'] = '"'.$val.'"' ; |
break ; |
case "ExposureTime" : |
$data_tab['ci_meta_exif_exposure_time'] = $val ; |
break ; |
case "FNumber" : |
$data_tab['ci_meta_exif_f_number'] = $val ; |
break ; |
case "ExifVersion" : |
$data_tab['ci_meta_exif_exif_version'] = $val ; |
break ; |
case "CompressedBitsPerPixel" : |
$data_tab['ci_meta_exif_compressed_bits_per_pixel'] = $val ; |
break ; |
case "ShutterSpeedValue" : |
$data_tab['ci_meta_exif_shutter_speed_value'] = $val ; |
break ; |
case "ApertureValue" : |
$data_tab['ci_meta_exif_aperture_value'] = $val ; |
break ; |
case "ExposureBiasValue" : |
$data_tab['ci_meta_exif_exposure_bias_value'] = $val ; |
break ; |
case "MaxApertureValue" : |
$data_tab['ci_meta_exif_max_aperture_value'] = $val ; |
break ; |
case "MeteringMode" : |
$data_tab['ci_meta_exif_metering_mode'] = $val ; |
break ; |
case "LightSource" : |
$data_tab['ci_meta_exif_light_source'] = $val ; |
break ; |
case "Flash" : |
$data_tab['ci_meta_exif_flash'] = $val ; |
break ; |
case "FocalLength" : |
$data_tab['ci_meta_exif_focal_length'] = $val ; |
break ; |
case "FlashpixVersion" : |
$data_tab['ci_meta_exif_flash_pix_version'] = $val ; |
break ; |
case "ColorSpace" : |
$data_tab['ci_meta_exif_color_space'] = $val ; |
break ; |
case "InteroperabilityOffset" : |
$data_tab['ci_meta_exif_interoperability_offset'] = $val ; |
break ; |
case "FocalPlaneXResolution" : |
$data_tab['ci_meta_exif_focal_plane_x_resolution'] = $val ; |
break ; |
case "FocalPlaneYResolution" : |
$data_tab['ci_meta_exif_focal_plane_y_resolution'] = $val ; |
break ; |
case "FocalPlaneResolutionUnit" : |
$data_tab['ci_meta_exif_focal_plane_resolution_unit'] = $val ; |
break ; |
case "SensingMethod" : |
$data_tab['ci_meta_exif_sensing_method'] = $val ; |
break ; |
case "FileSource" : |
$data_tab['ci_meta_exif_file_source'] = $val ; |
break ; |
case "CustomRendered" : |
$data_tab['ci_meta_exif_custom_rendered'] = $val ; |
break ; |
case "ExposureMode" : |
$data_tab['ci_meta_exif_exposure_mode'] = $val ; |
break ; |
case "WhiteBalance" : |
$data_tab['ci_meta_exif_white_balance'] = $val ; |
break ; |
case "DigitalZoomRatio" : |
$data_tab['ci_meta_exif_digital_zoom_ratio'] = $val ; |
break ; |
case "SceneCaptureType" : |
$data_tab['ci_meta_exif_scene_capture_type'] = $val ; |
break ; |
case "GainControl" : |
$data_tab['ci_meta_exif_gain_control'] = $val ; |
break ; |
case "Contrast" : |
$data_tab['ci_meta_exif_contrast'] = $val ; |
break ; |
case "Saturation" : |
$data_tab['ci_meta_exif_saturation'] = $val ; |
break ; |
case "Sharpness" : |
$data_tab['ci_meta_exif_sharpness'] = $val ; |
break ; |
case "SubjectDistanceRange" : |
$data_tab['ci_meta_exif_subject_distance_range'] = $val ; |
break ; |
default : |
$data_tab['ci_meta_exif_autres'] .= $nom.":".$val.";" ; |
} |
} |
// construit le tableau pour la requete avec les metadonnees iptc |
function construire_tableau_insertion_iptc($nom, $val ,$data_tab) |
{ |
switch($nom) |
{ |
// mots cles iptc |
case "2#005" : |
$data_tab['ci_meta_iptc_category'] = $val ; |
break; |
case "2#025" : |
$data_tab['ci_meta_iptc_mots_cles'] = $val ; |
break; |
// champ by line |
case "2#080" : |
$data_tab['ci_meta_iptc_by_line'] = $val ; |
break ; |
// cahmp by line titre |
case "2#085" : |
$data_tab['ci_meta_iptc_by_line_title'] = $val ; |
break ; |
// ville |
case "2#090" : |
$data_tab['ci_meta_iptc_city'] = $val ; |
break ; |
// sous location |
case "2#092" : |
$data_tab['ci_meta_iptc_sub_location'] = $val ; |
break ; |
// etat (pour les us) |
case "2#095" : |
$data_tab['ci_meta_iptc_province_state'] = $val ; |
break ; |
// code pays |
case "2#100" : |
$data_tab['ci_meta_iptc_country_primary_location_code'] = $val ; |
break ; |
// code pays |
case "2#101" : |
$data_tab['ci_meta_iptc_country_name'] = $val ; |
break ; |
// titre principal |
case "2#105" : |
$data_tab['ci_meta_iptc_headline'] = $val ; |
break ; |
// credit |
case "2#110" : |
$data_tab['ci_meta_iptc_credit'] = $val ; |
break ; |
// copyright |
case "2#116" : |
$data_tab['ci_meta_iptc_copyright_notice'] = $val ; |
break ; |
// contact |
case "2#118" : |
$data_tab['ci_meta_iptc_contact'] = $val ; |
break ; |
// autres (pour les champs qu'on ne prend pas en compte) |
default : |
$data_tab['ci_meta_iptc_autres'] .= $nom.":".$val.";" ; |
} |
} |
function preparer_tableau_iptc() |
{ |
$data_tab = array() ; |
$data_tab['ci_meta_iptc_category'] = NULL ; |
$data_tab['ci_meta_iptc_mots_cles'] = NULL ; |
$data_tab['ci_meta_iptc_by_line'] = NULL ; |
$data_tab['ci_meta_iptc_by_line_title'] = NULL ; |
$data_tab['ci_meta_iptc_city'] = NULL ; |
$data_tab['ci_meta_iptc_sub_location'] = NULL ; |
$data_tab['ci_meta_iptc_province_state'] = NULL ; |
$data_tab['ci_meta_iptc_country_primary_location_code'] = NULL ; |
$data_tab['ci_meta_iptc_country_name'] = NULL ; |
$data_tab['ci_meta_iptc_headline'] = NULL ; |
$data_tab['ci_meta_iptc_credit'] = NULL ; |
$data_tab['ci_meta_iptc_copyright_notice'] = NULL ; |
$data_tab['ci_meta_iptc_contact'] = NULL ; |
$data_tab['ci_meta_iptc_autres'] .= " " ; |
return $data_tab ; |
} |
function preparer_tableau_exif() |
{ |
$data_tab = array() ; |
$data_tab['ci_meta_height'] = 0 ; |
$data_tab['ci_meta_width'] = 0 ; |
$data_tab['ci_meta_make'] = NULL ; |
$data_tab['ci_meta_model'] = NULL ; |
$data_tab['ci_meta_x_resolution'] = NULL ; |
$data_tab['ci_meta_y_resolution'] = NULL ; |
$data_tab['ci_meta_date_time'] = NULL ; |
$data_tab['ci_meta_gps'] = NULL ; |
$data_tab['ci_meta_user_comment'] = NULL ; |
$data_tab['ci_meta_exif_exposure_time'] = NULL ; |
$data_tab['ci_meta_exif_f_number'] = NULL ; |
$data_tab['ci_meta_exif_exif_version'] = NULL ; |
$data_tab['ci_meta_exif_compressed_bits_per_pixel'] = NULL ; |
$data_tab['ci_meta_exif_shutter_speed_value'] = NULL ; |
$data_tab['ci_meta_exif_aperture_value'] = NULL ; |
$data_tab['ci_meta_exif_exposure_bias_value'] = NULL ; |
$data_tab['ci_meta_exif_max_aperture_value'] = NULL ; |
$data_tab['ci_meta_exif_metering_mode'] = NULL ; |
$data_tab['ci_meta_exif_flash'] = NULL ; |
$data_tab['ci_meta_exif_light_source'] = NULL ; |
$data_tab['ci_meta_exif_focal_length'] = NULL ; |
$data_tab['ci_meta_exif_flash_pix_version'] = NULL ; |
$data_tab['ci_meta_exif_color_space'] = NULL ; |
$data_tab['ci_meta_exif_interoperability_offset'] = NULL ; |
$data_tab['ci_meta_exif_focal_plane_x_resolution'] = NULL ; |
$data_tab['ci_meta_exif_focal_plane_y_resolution'] = NULL ; |
$data_tab['ci_meta_exif_focal_plane_resolution_unit'] = NULL ; |
$data_tab['ci_meta_exif_sensing_method'] = NULL ; |
$data_tab['ci_meta_exif_file_source'] = NULL ; |
$data_tab['ci_meta_exif_custom_rendered'] = NULL ; |
$data_tab['ci_meta_exif_exposure_mode'] = NULL ; |
$data_tab['ci_meta_exif_white_balance'] = NULL ; |
$data_tab['ci_meta_exif_digital_zoom_ratio'] = NULL ; |
$data_tab['ci_meta_exif_scene_capture_type'] = NULL ; |
$data_tab['ci_meta_exif_gain_control'] = NULL ; |
$data_tab['ci_meta_exif_contrast'] = NULL ; |
$data_tab['ci_meta_exif_saturation'] = NULL ; |
$data_tab['ci_meta_exif_sharpness'] = NULL ; |
$data_tab['ci_meta_exif_subject_distance_range'] = NULL ; |
$data_tab['ci_meta_exif_autres'] .= " " ; |
return $data_tab ; |
} |
function fin_tableau_meta($tab) |
{ |
$tab['ci_meta_exif_autres'] .= " " ; |
$tab['ci_meta_iptc_autres'] .= " " ; |
$tab['ci_nom_original'] = NULL ; |
$tab['ci_md5'] = NULL ; |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryImage.php |
---|
New file |
0,0 → 1,152 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
/** |
* Service recherche et ajout d'image a partir de divers critères |
* in=utf8 |
* out=utf8 |
* |
*/ |
class InventoryImage extends Cel { |
/** |
* Méthode appelée avec une requête de type GET. |
* Renvoie les infos sur l'image correspondant à l'id passé en parametre |
* @param int uid[0] : utilisateur obligatoire |
* @param int uid[1] : identifiant image obligatoire |
*/ |
public function getElement($uid) |
{ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if(!isset($uid[0]) || !isset($uid[1])) { |
return; |
} |
$chercheur_image = new RechercheImage($this->config); |
$parametres = array('ordre' => $uid[1]); |
$retour = null; |
$image_recherchee = $chercheur_image->rechercherImages($uid[0], $parametres, 0, 1); |
if(count($image_recherchee) > 0) { |
$retour = $image_recherchee[0]; |
} |
$this->envoyer($retour,'application/json','utf-8',true); |
} |
/** |
* Méthode appelée avec une requête de type POST avec un identifiant d'image. |
* Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post |
* |
* @param int $uid[0] identifiant utilisateur |
* @param int $uid[1] ordre de l'image relatif à l'utilisateur |
* @param pairs array tableau contenant les valeurs de metadonnées à modifier |
*/ |
public function updateElement($uid,$pairs) |
{ |
// Controle detournement utilisateur |
$this->controleUtilisateur($uid[0]); |
if(count($pairs) == 0 || !isset($uid[1])) { |
return; |
} |
$gestionnaire_image = new GestionImage($this->config); |
$resultat_mise_a_jour = $gestionnaire_image->modifierImage($uid[0],$uid[1],$pairs); |
$retour = false; |
if ($resultat_mise_a_jour) { |
$retour = 'OK'; |
} |
$this->envoyer($retour); |
} |
/** |
* Méthode appelée avec une requête de type PUT. |
* Stocke une image, crée ses miniatures et enregistre ses informations |
* Renvoie l'identifiant d'image nouvellement crée en cas de succès |
* |
* @param $pairs array tableau contenant les valeurs de metadonnées à ajouter |
*/ |
function createElement($pairs) |
{ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
foreach ($_FILES as $file) { |
$infos_fichier = $file ; |
} |
$gestionnaire_image = new GestionImage($this->config); |
$id_utilisateur = $pairs['ce_utilisateur']; |
if ($this->ajouterImage($id_utilisateur, $infos_fichier)) { |
// l'upload demande de court-circuiter le fonctionnement normal de JREST |
// en quittant directement après l'envoi |
$this->envoyerMessageCreationEffectuee(); |
exit; |
} |
} |
private function envoyerMessageCreationEffectuee() { |
header('HTTP/1.0 200 Created'); |
echo 'OK'; |
exit() ; |
} |
/** |
* Méthode appelée avec une requête de type DELETE. |
* Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre |
* Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules |
* |
* @param int uid[0] id utilisateur |
* @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules |
* |
*/ |
function deleteElement($uid){ |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($uid[0]); |
if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) { |
return; |
} |
$ordres_images = explode(',',$uid[1]); |
$gestionnaire_image = new GestionImage($this->config); |
$suppression_image = $gestionnaire_image->supprimerImage($uid[0], $ordres_images); |
$this->envoyer('OK'); |
} |
private function estUneSuiteIdentifiantsImage($chaine) { |
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules |
// sans virgule terminale |
$reg_exp = "/^(([0-9])+,)*([0-9])+$/"; |
return preg_match($reg_exp, $chaine); |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryMaintenance.php |
---|
New file |
0,0 → 1,268 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2009 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
class InventoryMaintenance extends Cel { |
private $nb_fichiers_orphelins = 0; |
private $espace_libere = 0; |
function getElement($uid) { |
if ($this->authentifierAdmin()) { |
if($uid[0] == "dates_images") { |
$this->reparerDatesImages(); |
} |
if($uid[0] == "suppression_images_orphelines") { |
$this->suppressionFichiersImagesOrphelins(); |
} |
} |
} |
private function reparerDatesImages() { |
// TODO : effectuer une réexctraction de la date grâce au metadonnées |
// pas urgent |
/*$query = 'UPDATE cel_images SET date_prise_de_vue = ci_meta_date_time '; |
'WHERE ci_meta_date IS NULL AND ci_meta_date_time IS NOT NULL' ; |
$DB = $this->connectDB($this->config,'cel_db'); |
$res =& $DB->query($query); |
if (PEAR::isError($res)) { |
logger('InventoryMaintenance','Erreur lors de la réparation des dates '.$query); |
die($res->getMessage()); |
} |
header('content-type: text/html charset=utf-8'); |
print "Réparation des dates effectuées"; |
exit() ;*/ |
} |
private function suppressionFichiersImagesOrphelins() { |
header("content-type: text/html") ; |
$header_html = ' |
<head> |
<title>Maintenance</title> |
<style type="text/css"> |
h1 { |
color: blue; |
} |
h2 { |
color: green; |
} |
.titre_dossier { |
cursor: pointer; |
} |
li { |
list-style-type: none; |
} |
.liste_profondeur_1 { |
border: 1px solid blue; |
background-color: #DFDFFF; |
} |
.liste_profondeur_2 { |
border: 1px solid green; |
background-color: #E1FFDF; |
width: 1500px; |
} |
.liste_profondeur_3 { |
border: 1px solid yellow; |
background-color: #FFFCDF; |
width: 1200px; |
} |
.attention { |
border: 1px solid red; |
background-color: white; |
width: 600px; |
} |
</style> |
<script src="http://162.38.234.9/cel_consultation/squelettes/js/jquery-1.4.2.min.js" type="text/javascript"></script> |
<script type="text/javascript" language="javascript"> |
//<![CDATA[ |
function initialiserElementsPliables() { |
$(\'.titre_dossier\').bind(\'click\', function() { |
$(this).siblings(\'li\').toggle(); |
return false; |
}); |
} |
$(document).ready(function() { |
initialiserElementsPliables(); |
}); |
//]]> |
</script> ';' |
</head>'; |
echo $header_html; |
$chemin_base_images = $this->config['cel_db']['chemin_images']; |
$profondeur = 1; |
echo '<ul id="liste_profondeur_0">'; |
$this->itererRecursivement($chemin_base_images, $profondeur); |
echo '</ul>'; |
print '<p class="resultat">Suppression des images orphelines effectuées </p><br />' ; |
print '<p class="resultat">'.$this->nb_fichiers_orphelins.' fichiers orphelins ont été détectés et supprimés</p>'; |
print '<p class="resultat">'.$this->convertir_poid($this->espace_libere).' d\'espace disque ont été économisé </p>'; |
exit() ; |
} |
private function itererRecursivement($dossier, $profondeur) { |
foreach (new DirectoryIterator($dossier) as $fichier_ou_dossier) { |
if ($fichier_ou_dossier->isDot()) { |
continue; |
} |
$dossiers_autorises = array('L','M','S'); |
if ($fichier_ou_dossier->getBasename() == 'export') { |
continue; |
} |
echo '<li>'; |
if ($fichier_ou_dossier->isDir()) { |
$profondeur_dossier_fils = $profondeur + 1; |
echo '<ul class="liste_profondeur_'.$profondeur.'"> <h'.$profondeur.' class="titre_dossier"> analyse du dossier '.$fichier_ou_dossier->getPathname().'</h'.$profondeur.'>' ; |
$this->itererRecursivement($fichier_ou_dossier->getPathname(), $profondeur_dossier_fils); |
echo '</ul><br /><br />'; |
} else { |
$nom_fichier = $fichier_ou_dossier->getFilename(); |
$this->verifierImageSurDDExisteDansBaseDeDonnees($nom_fichier); |
} |
echo '</li>'; |
} |
} |
private function verifierImageSurDDExisteDansBaseDeDonnees($nom_fichier) { |
$nom_fichier_sans_extension = trim($nom_fichier, '.jpg'); |
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_L'); |
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_M'); |
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_S'); |
$id_image = str_replace('_', '', $nom_fichier_sans_extension); |
// suppression des 0 devant |
$id_image += 0; |
$requete_id_image_existe = 'SELECT COUNT(id_image) as image_existe FROM cel_images WHERE id_image = '.$id_image; |
$image_existe = $this->executerRequete($requete_id_image_existe); |
if ($image_existe[0]['image_existe'] < 1) { |
echo $nom_fichier.' Image introuvable dans la base de données'; |
$this->supprimerImage($id_image); |
} |
} |
private function supprimerImage($id) { |
$chemin_sur_serveur = $this->config['cel_db']['chemin_images']; |
$id = sprintf('%09s', $id); |
$id = wordwrap($id, 3 , '_', true); |
$id_fichier = "$id.jpg"; |
$niveauDossier = split('_', $id); |
$dossierNiveau1 = $niveauDossier[0]; |
$dossierNiveau2 = $niveauDossier[1]; |
$fichier_s = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg'; |
$fichier_m = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M/'.$id.'_M.jpg'; |
$fichier_l = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L/'.$id.'_L.jpg'; |
$erreur = false; |
echo '<ul class="liste_suppression">'; |
if(file_exists($fichier_s)) { |
$this->espace_libere += filesize($fichier_s); |
$suppression_s = true; |
//$suppression_s = unlink($fichier_s) ; |
if (!$suppression_s) { |
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_s.' </li>' ; |
echo $erreur; |
} else { |
// $this->nb_fichiers_orphelins++; |
} |
} else { |
$erreur = '<li> probleme : l\'image '.$fichier_s.' n\'existe pas </li>' ; |
echo $erreur; |
}// Si le fichier existe |
if (file_exists($fichier_m)) { |
$this->espace_libere += filesize($fichier_m); |
$suppression_m = true; |
//$suppression_m = unlink($fichier_m) ; |
if (!$suppression_m) { |
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_m.' </li>' ; |
$this->logger('CEL_images_bugs',$erreur); |
} else { |
// $this->nb_fichiers_orphelins++; |
} |
} else { |
$erreur = '<li> probleme : l\'image '.$fichier_m.' n\'existe pas </li>' ; |
echo $erreur; |
} // Si le fichier existe |
if (file_exists($fichier_l)) { |
$this->espace_libere += filesize($fichier_l); |
$suppression_l = true; |
//$suppression_l = unlink($fichier_l) ; |
if(!$suppression_l) { |
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_l.' </li>' ; |
echo $erreur; |
} else { |
// $this->nb_fichiers_orphelins++; |
} |
} else { |
$erreur = '<li> probleme : l\'image '.$fichier_l.' n\'existe pas </li>' ; |
echo $erreur; |
} // Si le fichier existe |
if (!$erreur) { |
echo '<p class="attention">Suppression dans tous les formats de l\'image '.$id.' effectuee </p>'; |
$this->nb_fichiers_orphelins++; |
} |
echo '</ul>'; |
echo '<br />'; |
} |
private function convertir_poid($size) { |
$units = array(' B', ' KB', ' MB', ' GB', ' TB'); |
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024; |
return round($size, 2).$units[$i]; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/Cel.php |
---|
New file |
0,0 → 1,699 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Classe mère abstraite contenant les méthodes génériques des services. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Jean-Pascal MILCENT <jpm@clapas.org> |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2010, Jean-Pascal MILCENT |
*/ |
abstract class Cel { |
const TYPE_OBS = 'observation'; |
const TYPE_IMG = 'image'; |
const SQL_MODE_ASSOC = PDO::FETCH_ASSOC; |
const SQL_MODE_OBJET = PDO::FETCH_OBJ; |
const SQL_RETOUR_COMPLET = 'All'; |
const SQL_RETOUR_LIGNE = 'Row'; |
const SQL_RETOUR_COLONNE = 'Column'; |
const SQL_RETOUR_BRUT = 'Raw'; |
public $config; |
private $ressources; |
protected $parametres = array(); |
protected $bdd; |
protected $messages = array(); |
protected $debug = array(); |
public function __construct($config) { |
// Tableau contenant la config de Jrest |
$this->config = $config; |
// Réglages de PHP |
setlocale(LC_ALL, $this->config['settings']['locale']); |
date_default_timezone_set($this->config['settings']['fuseauHoraire']); |
// Connection à la base de données |
$this->bdd = $this->connecterPDO($this->config, 'database_cel'); |
// Nettoyage du _GET (sécurité) |
$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres |
$this->recupererParametresUrl();// Vidage de _GET et création d'attribut de la classe |
$this->definirParametresUrlParDefaut(); |
// Définition de variable générale dans la config |
$this->config['settings']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].$this->config['settings']['baseURL'].'%s'; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de la BASE de DONNÉES |
private function connecterPDO($config, $base = 'database') { |
$cfg = $config[$base]; |
// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place. |
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec']; |
try { |
// Création de la connexion en UTF-8 à la BDD |
$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'")); |
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché) |
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
} catch (PDOException $e) { |
echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage(); |
} |
return $PDO; |
} |
/** |
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'. |
* Puis execute la requete. |
* @see protegerRequete() |
* @param unknown_type $requete |
*/ |
protected function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) { |
$requete = $this->protegerRequete($requete); |
return $this->executerRequete($requete, $retour, $mode); |
} |
/** |
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'. |
* @see protegerRequete() |
* @param unknown_type $requete |
*/ |
protected function executer($requete) { |
$requete = $this->protegerRequete($requete); |
return $this->executerRequeteSimple($requete); |
} |
/** |
* Méthode permettant de rechercher dans une requete SQL sous forme de chaine (String) les chaines |
* à protéger. Cela évite de protéger chaque variable avant de l'insérer dans une requete SQL. |
* Par contre, il est important que les chaine à protéger ne contiennent pas le caractère '|'. |
* |
* @param $requete |
*/ |
protected function protegerRequete($requete) { |
if (substr_count($requete, '|') % 2 === 0) { |
if (preg_match_all('/\|([^|]*)\|/', $requete, $correspondances, PREG_SET_ORDER)) { |
foreach ($correspondances as $chaine) { |
$chaine_protegee = $this->bdd->quote($chaine[1]); |
$requete = str_replace($chaine[0], $chaine_protegee, $requete); |
} |
} |
} else { |
$this->messages[] = "La requête a protéger contient un nombre impair de caractère de protection '|'."; |
$requete = false; |
} |
return $requete; |
} |
protected function proteger($chaine) { |
return $this->bdd->quote($chaine); |
} |
protected function protegerTableau(Array $tableau) { |
foreach ($tableau as $id => $val) { |
$tableau[$id] = $this->proteger($val); |
} |
return $tableau; |
} |
/** |
* @deprecated utiliser executer() à la place |
* @see executer() |
*/ |
protected function executerRequeteSimple($requete) { |
$resultat = false; |
try { |
$resultat = $this->bdd->exec($requete); |
if ($resultat === false) { |
$this->debug[] = "La requête a échoué : $requete"; |
} |
} catch (PDOException $e) { |
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete); |
} |
return $resultat; |
} |
/** |
* @deprecated utiliser requeter() à la place |
* @see requeter() |
*/ |
protected function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) { |
$resultat = false; |
try { |
switch ($retour) { |
case self::SQL_RETOUR_COMPLET : |
$resultat = $this->bdd->query($requete)->fetchAll($mode);// Retourne toutes les lignes |
break; |
case self::SQL_RETOUR_LIGNE : |
$resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première ligne |
break; |
case self::SQL_RETOUR_COLONNE : |
$resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne |
break; |
case self::SQL_RETOUR_BRUT : |
$resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach |
break; |
default: |
$this->debug[] = "Le type de retour '$retour' est inconnu."; |
} |
if ($resultat === false) { |
$this->debug[] = "La requête a retourné aucun résultat : $requete"; |
} |
} catch (PDOException $e) { |
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete); |
} |
return $resultat; |
} |
protected function getTxt($id) { |
$sortie = ''; |
switch ($id) { |
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break; |
case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break; |
default : $sortie = $id; |
} |
return $sortie; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// TRAITEMENT des URLs et des PARAMÊTRES |
private function collecterParametres() { |
if (isset($_GET) && $_GET != '') { |
foreach ($_GET as $cle => $valeur) { |
$this->parametres[$cle] = $this->verifierSecuriteParametreUrl($valeur); |
} |
} |
} |
private function recupererParametresUrl() { |
if (isset($_GET)) { |
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour'); |
foreach ($get_params as $get) { |
if (isset($_GET[$get])) { |
$_GET[$get] = $this->verifierSecuriteParametreUrl($_GET[$get]); |
if ($_GET[$get] != '') { |
if (!isset($this->$get)) { |
$this->$get = $_GET[$get]; |
} else { |
$e = "Impossible d'ajouter l'attribut $get à la classe du service car elle possède déjà un attribut nommé : $get"; |
trigger_error($e, E_USER_WARNING); |
} |
} else { |
$_GET[$get] = null; |
} |
} |
} |
} |
} |
protected function verifierSecuriteParametreUrl($param) { |
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';'); |
$param = strip_tags(str_replace($verifier, '', $param)); |
return $param; |
} |
private function definirParametresUrlParDefaut() { |
if (!isset($this->start)) { |
$this->start = 0; |
} |
if (!isset($this->limit)) { |
$this->limit = 150; |
} |
} |
protected function traiterParametres($params_attendu, $params, $pourBDD = true) { |
$sortie = array(); |
foreach ($params_attendu as $num => $nom) { |
if (isset($params[$num]) && $params[$num] != '*') { |
if ($pourBDD) { |
$params[$num] = $this->bdd->quote($params[$num]); |
} |
$sortie[$nom] = $params[$num]; |
} |
} |
return $sortie; |
} |
protected function traiterNomMethodeGet($nom) { |
$methode = 'get'; |
$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom)))); |
return $methode; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de l'ENVOIE au NAVIGATEUR |
protected function envoyerJson($donnees, $encodage = 'utf-8') { |
$encodage_json = true; |
$this->envoyer($donnees, 'application/json', $encodage, $encodage_json); |
} |
protected function envoyerJsonVar($variable, $donnees = null, $encodage = 'utf-8') { |
$contenu = "var $variable = ".json_encode($donnees); |
$this->envoyer($contenu, 'text/html', $encodage); |
} |
protected function envoyerJsonp($donnees = null, $encodage = 'utf-8') { |
$contenu = $this->parametres['callback'].'('.json_encode($donnees).');'; |
$this->envoyer($contenu, 'text/html', $encodage); |
} |
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = false) { |
// Traitements des messages d'erreurs et données |
if (count($this->messages) != 0) { |
header('HTTP/1.1 500 Internal Server Error'); |
$json = true; |
$sortie = $this->messages; |
} else { |
$sortie = $donnees; |
if (is_null($donnees)) { |
$sortie = 'OK'; |
} |
} |
// Gestion de l'envoie du déboguage |
$this->envoyerDebogage(); |
// Encodage au format et JSON et envoie sur la sortie standard |
$contenu = $json ? json_encode($sortie) : $sortie; |
$this->envoyerContenu($encodage, $mime, $contenu); |
} |
private function envoyerDebogage() { |
if (!is_array($this->debug)) { |
$this->debug[] = $this->debug; |
} |
if (count($this->debug) != 0) { |
foreach ($this->debug as $cle => $val) { |
if (is_array($val)) { |
$this->debug[$cle] = print_r($val, true); |
} |
} |
header('X-DebugJrest-Data:'.json_encode($this->debug)); |
} |
} |
private function envoyerContenu($encodage, $mime, $contenu) { |
if (!is_null($mime) && !is_null($encodage)) { |
header("Content-Type: $mime; charset=$encodage"); |
} else if (!is_null($mime) && is_null($encodage)) { |
header("Content-Type: $mime"); |
} |
print $contenu; |
} |
private function envoyerAuth($message_accueil, $message_echec) { |
header('HTTP/1.0 401 Unauthorized'); |
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"'); |
header('Content-type: text/plain; charset=UTF-8'); |
print $message_echec; |
exit(0); |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DES CLASSES CHARGÉES À LA DEMANDE |
protected function getRestClient() { |
if (!isset($this->restClient)) { |
$this->restClient = new CelRestClient(); |
} |
return $this->restClient; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE L'IDENTIFICATION |
protected function getAuthIdentifiant() { |
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null; |
return $id; |
} |
protected function getAuthMotDePasse() { |
$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null; |
return $mdp; |
} |
public function authentifierAdmin() { |
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica."; |
$message_echec = "Accès limité aux administrateurs du CEL.\n". |
"Votre tentative d'identification a échoué.\n". |
"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur."; |
return $this->authentifier($message_accueil, $message_echec, 'Admin'); |
} |
public function authentifierUtilisateur() { |
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica."; |
$message_echec = "Accès limité aux utilisateur du CEL.\n". |
"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n". |
"Votre tentative d'identification a échoué.\n". |
"Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'."; |
return $this->authentifier($message_accueil, $message_echec, 'Utilisateur'); |
} |
public function isAdmin($id) { |
$admins = $this->config['jrest_admin']['admin']; |
$admin_tab = split(',',$admins); |
if (in_array($id,$admin_tab)) { |
return true; |
} else { |
return false; |
} |
} |
public function controleUtilisateur($id) { |
if ($_SESSION['user']['name'] == '') { |
//cas de la session temporaire, on ne fait rien de particulier |
} else { |
if (!$this->isAdmin($_SESSION['user']['name']) && $_SESSION['user']['name'] != $id) { |
// cas d'usurpation d'identité |
print 'Accès interdit'; |
exit(); |
} |
} |
} |
public function logger($index,$chaine) { |
if(!class_exists('Log')) { |
Log::getInstance(); |
} |
Log::setCheminLog($this->config['log']['cheminlog']); |
Log::setTimeZone($this->config['log']['timezone']); |
Log::setTailleMax($this->config['log']['taillemax']); |
Log::ajouterEntree($index,$chaine); |
} |
private function authentifier($message_accueil, $message_echec, $type) { |
$id = $this->getAuthIdentifiant(); |
if (!isset($id)) { |
$this->envoyerAuth($message_accueil, $message_echec); |
} else { |
if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') { |
$autorisation = true; |
} else { |
$methodeAutorisation = "etre{$type}Autorise"; |
$autorisation = $this->$methodeAutorisation(); |
} |
if ($autorisation == false) { |
$this->envoyerAuth($message_accueil, $message_echec); |
} |
} |
return true; |
} |
public function etreUtilisateurAutorise() { |
$identifiant = $this->getAuthIdentifiant(); |
$mdp = md5($this->getAuthMotDePasse()); |
$service = "TestLoginMdp/$identifiant/$mdp"; |
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service); |
$json = $this->getRestClient()->consulter($url); |
$existe = json_decode($json); |
$autorisation = (isset($existe) && $existe) ? true :false; |
return $autorisation; |
} |
public function etreAdminAutorise() { |
$identifiant = $this->getAuthIdentifiant(); |
$autorisation = ($this->etreUtilisateurAutorise() && $this->etreAdminCel($identifiant)) ? true : false; |
return $autorisation; |
} |
public function etreAdminCel($courriel) { |
$admins = $this->config['jrest_admin']['admin']; |
$courriels_autorises = explode(',', $admins); |
$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ; |
return $autorisation; |
} |
public function getInfosComplementairesUtilisateur($id_utilisateur) { |
$infos_utilisateur = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur); |
if(is_numeric($id_utilisateur)) { |
$requete_infos_utilisateur = 'SELECT prenom, nom, courriel FROM cel_utilisateurs '. |
'WHERE id_utilisateur = '.$this->proteger($id_utilisateur); |
$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur); |
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) { |
$infos_utilisateur = $resultat_infos_utilisateur; |
} |
} |
return $infos_utilisateur; |
} |
public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) { |
$infos_utilisateur = array('prenom' => $mail_utilisateur, 'nom' => $mail_utilisateur, 'courriel' => $mail_utilisateur); |
$requete_infos_utilisateur = 'SELECT id, prenom, nom FROM cel_utilisateurs '. |
'WHERE courriel = '.$this->proteger($mail_utilisateur); |
$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur); |
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) { |
$infos_utilisateur = $resultat_infos_utilisateur; |
} |
return $infos_utilisateur; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE MÉTHODES COMMUNES ENTRE LES SERVICES |
protected function getUrlImage($id, $format = 'L') { |
$url_tpl = $this->config['settings']['celImgUrlTpl']; |
$id = sprintf('%09s', $id).$format; |
$url = sprintf($url_tpl, $id); |
return $url; |
} |
/** |
* Prend en paramêtre un tableau de courriels et retourne après avoir interrogé un service de l'annuaire |
* une tableau avec en clé le courriel et en valeur l'intitulé de la personne à afficher. |
* |
* @param array $courriels un tableau de courriels pour lesquels il faut rechercher les infos d'identité |
*/ |
protected function creerAuteurs(Array $courriels) { |
$auteurs = array(); |
if ($identites = $this->recupererUtilisateursIdentite($courriels)) { |
foreach ($identites as $courriel => $infos) { |
$auteurs[$courriel] = $info['identite']; |
} |
} |
return $auteurs; |
} |
protected function recupererUtilisateursIdentite(Array $courriels) { |
// Récupération des données au format Json |
$service = "utilisateur/identite-par-courriel/".implode(',', $courriels); |
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service); |
$json = file_get_contents($url); |
$utilisateurs = json_decode($json); |
foreach ($courriels as $courriel) { |
$info = array('id' => null, 'identite' => ''); |
if (isset($utilisateurs->$courriel)) { |
$info['intitule'] = $utilisateurs->$courriel->intitule; |
$info['id'] = $utilisateurs->$courriel->id; |
} else { |
$info['intitule'] = $this->tronquerCourriel($courriel); |
} |
$noms[$courriel] = $info; |
} |
return $noms; |
} |
protected function tronquerCourriel($courriel) { |
$courriel = preg_replace('/[^@]+$/i', '...', $courriel); |
return $courriel; |
} |
protected function nettoyerTableau(Array $tableau) { |
foreach ($tableau as $cle => $valeur) { |
if (is_array($valeur)) { |
$valeur = $this->nettoyerTableau($valeur); |
} else { |
$valeur = $this->nettoyerTexte($valeur); |
} |
$tableau[$cle] = $valeur; |
} |
return $tableau; |
} |
/** |
* Fonction nettoyant les caractères spéciaux (&,<) et les valeurs nulles du CEL dans un texte comprenant du HTML. |
*/ |
protected function nettoyerTexte($txt) { |
$txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9][a-f]+);)/i', '&', $txt); |
// TODO : trouver une regexp qui permet de remplacer les symboles < et > isolés |
//$txt = preg_replace('/<(?!([a-z][a-z0-9]*)\b[^>]*>(.*?)<\/\1>|\/\s*([a-z][a-z0-9]*)\s*>)/i', '<', $txt); |
//$txt = preg_replace('/(?!<([a-z][a-z0-9]*)\b[^>]*)>(?!(.*?)<\/\1>)/i', '>', $txt); |
$txt = preg_replace('/(?:000null|null)/i', '', $txt); |
return $txt; |
} |
/** |
* Fonction nettoyant les caractères spéciaux HTML pour les champs de saisie libre du CEL. |
*/ |
protected function protegerCaracteresHtmlDansChamps($donnees) { |
$champs = array('mots_cles_texte', 'commentaire', |
'zone_geo', 'lieudit', 'station', 'milieu', 'commentaire', 'nom_sel'); |
foreach ($champs as $champ) { |
if (isset($donnees[$champ])) { |
$donnees[$champ] = htmlspecialchars($donnees[$champ]); |
} |
} |
return $donnees; |
} |
protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){ |
$val = explode(' ', $date_heure_mysql); |
$date = explode('-', $val[0]); |
$heure = explode(':', $val[1]); |
return mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]); |
} |
protected function etreNull($valeur) { |
$etre_null = false; |
if ($valeur == '' || $valeur == null || $valeur == '000null' || $valeur == 'null' || $valeur == '*') { |
$etre_null = true; |
} |
return $etre_null; |
} |
protected function formaterDate($date_heure_mysql, $format = '%A %d %B %Y à %H:%M') { |
$date_formatee = ''; |
if (!$this->etreNull($date_heure_mysql)) { |
$timestamp = $this->convertirDateHeureMysqlEnTimestamp($date_heure_mysql); |
$date_formatee = strftime($format, $timestamp); |
} |
return $date_formatee; |
} |
protected function encoderMotCle($mot_cle) { |
return md5(mb_strtolower(trim($mot_cle))); |
} |
protected function decoderMotsClesObs($utilisateur_id, $mots_cles) { |
return $this->decoderMotsCles($utilisateur_id, $mots_cles, self::TYPE_OBS); |
} |
protected function decoderMotsClesImg($utilisateur_id, $mots_cles) { |
return $this->decoderMotsCles($utilisateur_id, $mots_cles, self::TYPE_IMG); |
} |
private function decoderMotsCles($utilisateur_id, $mots_cles, $type) { |
$mots = array(); |
if (! $this->etreNull($mots_cles)) { |
$utilisateur_id = $this->bdd->quote($utilisateur_id); |
$mots_cles = $this->protegerMotsCles($mots_cles, $type); |
if (! $this->etreNull($mots_cles)) { |
$table = ($type == self::TYPE_IMG) ? 'cel_mots_cles_images' : 'cel_mots_cles_obs' ; |
$requete = 'SELECT cmc_mot_cle '. |
"FROM $table ". |
"WHERE cmc_id_mot_cle_utilisateur IN ($mots_cles) ". |
"AND cmc_id_proprietaire = $utilisateur_id "; |
$elements = $this->executerRequete($requete); |
if (is_array($elements)) { |
foreach ($elements as $mot) { |
$mots[] = $mot['mot_cle']; |
} |
} |
} |
} |
return $mots; |
} |
private function protegerMotsCles($mots_cles, $type) { |
$separateur = ($type == self::TYPE_IMG) ? ',' : ';' ; |
$mots_cles = $this->traiterValeursMultiples($mots_cles, $separateur); |
return $mots_cles; |
} |
protected function traiterValeursMultiples($valeurs, $separateur_entree = ',' , $separateur_sortie = ',') { |
if (! $this->etreNull($valeurs)) { |
$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree)); |
foreach ($valeurs_a_proteger as $valeur) { |
$valeurs_protegees[] = $this->bdd->quote($valeur); |
} |
$valeurs = implode($separateur_sortie, $valeurs_protegees); |
} |
return ($this->etreNull($valeurs)) ? null : $valeurs; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DES SQUELETTES PHP |
/** |
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données, |
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés. |
* |
* @param String $fichier le chemin du fichier du squelette |
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette. |
* |
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat. |
*/ |
public static function traiterSquelettePhp($fichier, Array $donnees = array()) { |
$sortie = false; |
if (file_exists($fichier)) { |
// Extraction des variables du tableau de données |
extract($donnees); |
// Démarage de la bufferisation de sortie |
ob_start(); |
// Si les tags courts sont activés |
if ((bool) @ini_get('short_open_tag') === true) { |
// Simple inclusion du squelette |
include $fichier; |
} else { |
// Sinon, remplacement des tags courts par la syntaxe classique avec echo |
$html_et_code_php = self::traiterTagsCourts($fichier); |
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval |
$html_et_code_php = '?>'.$html_et_code_php; |
// Interprétation du html et du php dans le buffer |
echo eval($html_et_code_php); |
} |
// Récupèration du contenu du buffer |
$sortie = ob_get_contents(); |
// Suppression du buffer |
@ob_end_clean(); |
} else { |
$msg = "Le fichier du squelette '$fichier' n'existe pas."; |
trigger_error($msg, E_USER_WARNING); |
} |
// Retourne le contenu |
return $sortie; |
} |
/** |
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo. |
* |
* @param String $chemin_squelette le chemin du fichier du squelette |
* |
* @return string le contenu du fichier du squelette php avec les tags courts remplacés. |
*/ |
private static function traiterTagsCourts($chemin_squelette) { |
$contenu = file_get_contents($chemin_squelette); |
// Remplacement de tags courts par un tag long avec echo |
$contenu = str_replace('<?=', '<?php echo ', $contenu); |
// Ajout systématique d'un point virgule avant la fermeture php |
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu); |
return $contenu; |
} |
} |
/tags/celw-v1.1/jrest/services/CelStatistiqueTxt.php |
---|
New file |
0,0 → 1,406 |
<?php |
/** |
* Service fournissant des statistiques de l'application CEL au format texte (JSON). |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* /CelStatistiqueTxt/TypeDeStat : retourne les statistiques demandées |
* Paramêtres : |
* utilisateur=courriel : retourne les statistiques d'un utilisateur donné. |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org) |
*/ |
class CelStatistiqueTxt extends Cel { |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($ressources) { |
$graph = null; |
$serveur = ''; |
if (isset($ressources[0])) { |
$this->analyserParametresUrl(); |
$stat_demande = array_shift($ressources); |
$methode = 'get'.$stat_demande; |
if (method_exists($this, $methode)) { |
$this->ressources = $ressources; |
$stats = $this->$methode($ressources); |
} else { |
$this->messages[] = "Ce type de statistiques '$stat_demande' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "La ressource du service CEL StatistiqueTxt doit indiquer le type de statistique. Ex. : .../CelStatistiqueTxt/Nombres"; |
} |
if (!is_null($stats)) { |
$this->envoyerJson($stats); |
} |
} |
private function analyserParametresUrl() { |
$this->parametres['utilisateur'] = isset($_GET['utilisateur']) ? $this->bdd->quote($this->verifierSecuriteParametreUrl($_GET['utilisateur'])) : null; |
$this->parametres['num_taxon'] = isset($_GET['num_taxon']) ? $this->bdd->quote($this->verifierSecuriteParametreUrl($_GET['num_taxon'])) : null; |
$this->parametres['taxon'] = isset($_GET['taxon']) ? $this->bdd->quote($this->verifierSecuriteParametreUrl($_GET['taxon'].'%')) : null; |
$this->parametres['tag'] = isset($_GET['tag']) ? $this->verifierSecuriteParametreUrl($_GET['tag']) : null; |
$this->parametres['start'] = isset($_GET['start']) ? $this->verifierSecuriteParametreUrl($_GET['start']) : null; |
$this->parametres['limit'] = isset($_GET['limit']) ? $this->verifierSecuriteParametreUrl($_GET['limit']) : null; |
} |
private function getListeUtilisateursNbrePhotos() { |
$liste = array(); |
$requete = $this->construireRequeteListeUtilisateurNbrePhoto(); |
if ($requete != null) { |
$resultats = $this->executerRequete($requete); |
if ($resultats != false) { |
foreach ($resultats as $resultat) { |
$liste[$resultat['identifiant']] = $resultat['nbre']; |
} |
} |
} |
return $liste; |
} |
private function construireRequeteListeUtilisateurNbrePhoto() { |
$select = 'SELECT identifiant, COUNT(DISTINCT ci_id_image) AS nbre '; |
$from = 'FROM cel_inventory '. |
' LEFT JOIN cel_obs_images ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) '. |
' LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) '; |
$where = 'WHERE transmission = 1 '; |
$groupBy = 'GROUP BY identifiant '; |
$orderBy = 'ORDER BY nbre DESC '; |
$limitSql = 'LIMIT 0,150 '; |
$zero_images = false; |
if (count($this->parametres) != 0) { |
extract($this->parametres); |
$filtres = array(); |
if (isset($utilisateur)) { |
$filtres[] = "identifiant = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
if (isset($tag)) { |
$limitation = $this->construireWhereTags(); |
if ($limitation != null) { |
$filtres[] = $limitation; |
} else { |
$zero_images = true; |
} |
} |
$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : ''); |
if (isset($start)) { |
$limitSql = str_replace('0,', "$start,", $limitSql); |
} |
if (isset($limit)) { |
$limitSql = str_replace('150', $limit, $limitSql); |
} |
} |
if ($zero_images) { |
$requete = null; |
} else { |
$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql; |
//echo $requete; |
} |
return $requete; |
} |
private function construireWhereTags() { |
$where = null; |
if (isset($this->parametres['tag'])) { |
$tag = $this->parametres['tag']; |
$tag_encode = $this->bdd->quote($this->encoderMotCle(trim($tag))); |
// Construction de la requête |
$requete = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire '. |
'FROM cel_mots_cles_images '. |
"WHERE cmc_id_mot_cle_general = $tag_encode "; |
$elements = $this->executerRequete($requete); |
if ($elements != false && count($elements) > 0) { |
// Pré-construction du where de la requête |
$tpl_where = '(ci_meta_mots_cles LIKE "%%%s%%" AND ci_ce_utilisateur = %s )'; |
$requete_where = array(); |
foreach ($elements as $occurence) { |
$requete_where[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire'])); |
} |
$where = ' ('.implode(" \nOR ", $requete_where).') '; |
} else { |
$this->debug[] = "Aucune image ne correspond à ce mot clé."; |
} |
} |
return $where; |
} |
private function getListeTaxonsNbrePhotos() { |
$requete = $this->construireRequeteListeTaxonNbrePhoto(); |
$resultats = $this->executerRequete($requete); |
$liste = array(); |
if ($resultats != false) { |
foreach ($resultats as $resultat) { |
$liste[$resultat['nom_ret']] = $resultat['nbre']; |
} |
} |
return $liste; |
} |
private function construireRequeteListeTaxonNbrePhoto() { |
$select = 'SELECT nom_ret, COUNT(DISTINCT ci_id_image) AS nbre '; |
$from = 'FROM cel_inventory '. |
' LEFT JOIN cel_obs_images ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) '. |
' LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) '; |
$where = 'WHERE transmission = 1 '. |
" AND nom_ret != '' "; |
$groupBy = 'GROUP BY nom_ret '; |
$orderBy = 'ORDER BY nbre DESC '; |
$limitSql = 'LIMIT 0,150 '; |
if (count($this->parametres) != 0) { |
extract($this->parametres); |
$filtres = array(); |
if (isset($utilisateur)) { |
$filtres[] = "identifiant = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
$where .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : ''); |
if (isset($start)) { |
$limitSql = str_replace('0,', "$start,", $limitSql); |
} |
if (isset($limit)) { |
$limitSql = str_replace('150', $limit, $limitSql); |
} |
} |
$requete = $select.$from.$where.$groupBy.$orderBy.$limitSql; |
return $requete; |
} |
private function getNombres() { |
$requete = $this->construireRequeteNbreObs(); |
$info['observations'] = (int) $this->executerRequete($requete, 'Column'); |
$requete = $this->construireRequeteNbreObsPubliques(); |
$info['observationsPubliques'] = (int) $this->executerRequete($requete, 'Column'); |
$requete = $this->construireRequeteNbreImg(); |
$info['images'] =(int) $this->executerRequete($requete, 'Column'); |
$requete = $this->construireRequeteNbreImgLiees(); |
$info['imagesLiees'] =(int) $this->executerRequete($requete, 'Column'); |
$requete = $this->construireRequeteNbreObsLiees(); |
$info['observationsLiees'] = (int) $this->executerRequete($requete, 'Column'); |
$info['moyImagesParObs'] = ($info['observationsLiees'] > 0 ? round($info['imagesLiees']/$info['observationsLiees'], 2) : ''); |
$requete = $this->construireRequeteNbreObsParCommune(); |
$info['communes'] = ($resultats = $this->executerRequete($requete)) ? count($resultats) : '' ; |
$info['observationsParCommunesMin'] = 1000; |
$info['observationsParCommunesMax'] = 0; |
$info['observationsParCommunesTotal'] = 0; |
foreach ($resultats as $resultat) { |
if ($resultat['nbre'] < $info['observationsParCommunesMin']) { |
$info['observationsParCommunesMin'] = $resultat['nbre']; |
} |
if ($resultat['nbre'] > $info['observationsParCommunesMax']) { |
$info['observationsParCommunesMax'] = $resultat['nbre']; |
} |
$info['observationsParCommunesTotal'] += $resultat['nbre']; |
} |
$info['observationsParCommunesMoyenne'] = ($info['communes'] > 0 ) ? round($info['observationsParCommunesTotal'] / $info['communes'], 2) : 0; |
return $info; |
} |
private function construireRequeteNbreObs() { |
$requete = 'SELECT COUNT(id) AS nbre '. |
'FROM cel_inventory '; |
if (count($this->parametres) != 0) { |
$filtres = array(); |
extract($this->parametres); |
if (isset($utilisateur)) { |
$filtres[] = "identifiant = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
$requete .= ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : ''); |
} |
return $requete; |
} |
private function construireRequeteNbreObsPubliques() { |
$requete = 'SELECT COUNT(id) AS nbre '. |
'FROM cel_inventory '. |
"WHERE transmission = 1 "; |
if (count($this->parametres) != 0) { |
$filtres = array(); |
extract($this->parametres); |
if (isset($utilisateur)) { |
$filtres[] = "identifiant = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : ''); |
} |
return $requete; |
} |
private function construireRequeteNbreObsParCommune() { |
$requete = 'SELECT COUNT(id) AS nbre '. |
'FROM cel_inventory '. |
"WHERE location != '000null' ". |
" AND id_location != '000null' "; |
$groupBy = 'GROUP BY location, id_location'; |
if (count($this->parametres) != 0) { |
$filtres = array(); |
extract($this->parametres); |
if (isset($utilisateur)) { |
$filtres[] = "identifiant = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
$requete .= ((count($filtres) > 0) ? 'AND '.implode(' AND ', $filtres) : ''); |
} |
$requete .= $groupBy; |
return $requete; |
} |
private function construireRequeteNbreImg() { |
$select = 'SELECT COUNT(DISTINCT ci_id_image) AS nbre '; |
$from = 'FROM cel_images '; |
if (count($this->parametres) != 0) { |
$filtres = array(); |
extract($this->parametres); |
if (isset($utilisateur)) { |
$filtres[] = "ci_ce_utilisateur = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
if (isset($num_taxon) || isset($taxon)) { |
$from .= 'LEFT JOIN cel_obs_images ON (coi_ce_image = ci_id_image) '. |
'LEFT JOIN cel_inventory ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) '; |
} |
$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : ''); |
} |
$requete = $select.$from.$where; |
return $requete; |
} |
private function construireRequeteNbreImgLiees() { |
$select = 'SELECT COUNT(DISTINCT ci_id_image) AS nbre '; |
$from = 'FROM cel_obs_images '. |
' LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) '; |
if (count($this->parametres) != 0) { |
$filtres = array(); |
extract($this->parametres); |
if (isset($utilisateur)) { |
$filtres[] = "coi_ce_utilisateur = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
if (isset($num_taxon) || isset($taxon)) { |
$from .= 'LEFT JOIN cel_inventory ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) '; |
} |
$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : ''); |
} |
$requete = $select.$from.$where; |
return $requete; |
} |
private function construireRequeteNbreObsLiees() { |
$select = 'SELECT COUNT(DISTINCT coi_ce_observation) AS nbre '; |
$from = 'FROM cel_obs_images '. |
' LEFT JOIN cel_inventory ON (coi_ce_observation = ordre AND coi_ce_utilisateur = identifiant) '; |
if (count($this->parametres) != 0) { |
$filtres = array(); |
extract($this->parametres); |
if (isset($utilisateur)) { |
$filtres[] = "identifiant = $utilisateur "; |
} |
if (isset($num_taxon)) { |
$filtres[] = "num_taxon = $num_taxon "; |
} |
if (isset($taxon)) { |
$filtres[] = "nom_ret LIKE $taxon "; |
} |
$where = ((count($filtres) > 0) ? 'WHERE '.implode(' AND ', $filtres) : ''); |
} |
$requete = $select.$from.$where; |
return $requete; |
} |
} |
?> |
/tags/celw-v1.1/jrest/services/InventoryByDept.php |
---|
New file |
0,0 → 1,146 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author David Delon <delon@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/ |
*/ |
/** |
* |
* in=utf8 |
* out=iso3859 |
* |
* Liste des Nouvelles observations par departement |
* A voir avec David mais ne devrait plus être utilisé |
* ou fait autrement |
* |
*/ |
class InventoryByDept extends Cel { |
var $extendSpreadsheetProductor; |
function InventoryByDept($config) { |
parent::__construct($config); |
// Pas d'heritage multiple en php :( |
$this->extendSpreadsheetProductor = new SpreadsheetProductor(); |
$this->extendSpreadsheetProductor->initSpreadsheet(); |
} |
//TODO : faire une fonction qui prend en paramètre un departement |
function getRessource(){ |
$requete_obs = "SELECT ce_zone_geo, ce_utilisateur, courriel_utilisateur, ordre, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, zone_geo, date_observation," . |
" lieudit, station, milieu, commentaire, transmission FROM cel_obs ". |
"WHERE ce_zone_geo != '000null' AND ce_zone_geo != '' AND transmission = 1 AND nt!=0 ORDER BY ce_zone_geo, nom_ret LIMIT 50"; |
$resultat_obs = $this->executerRequete($requete_obs); |
// Creating a workbook |
$workbook = new Spreadsheet_Excel_Writer(); |
// Creating a worksheet |
$worksheet = $workbook->addWorksheet('Liste'); |
$worksheet->write(0,0,'Departement'); |
$worksheet->write(0,1,'Nom saisi'); |
$worksheet->write(0,2,'Numero nomenclatural'); |
$worksheet->write(0,3,'Nom retenu'); |
$worksheet->write(0,4,'Numero nomenclatural nom retenu'); |
$worksheet->write(0,5,'Numero taxonomique'); |
$worksheet->write(0,6,'Famille'); |
$worksheet->write(0,7,'Commune'); |
$worksheet->write(0,8,'Date Observation'); |
$worksheet->write(0,9,'Lieu dit'); |
$worksheet->write(0,10,'Station'); |
$worksheet->write(0,11,'Milieu'); |
$worksheet->write(0,12,'Commentaire'); |
$worksheet->write(0,13,'Observateur'); |
$i=1; |
$observations = array(); |
$chercheur_infos_taxon = null; |
if (is_array($resultat_obs)) { |
$observations = &$resultat_obs; |
$chercheur_infos_taxon = new RechercheInfosTaxon($this->config); |
} |
foreach ($observations as $obs) { |
$code_departement = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']); |
$taxon_deja_vu = $chercheur_infos_taxon->taxonEstPresentDansDepartement($obs['nt'], $code_departement); |
if (!$taxon_deja_vu) { |
// Denullifiage |
foreach($obs as $k=>$v) { |
if (($v=="null") || ($v=="000null")) { |
$obs[$k]=""; |
} |
else { |
$obs[$k]=utf8_decode($v); |
} |
} |
if ($obs['date_observation']!="0000-00-00 00:00:00") { |
list($year,$month,$day)= split ('-',$obs['date_observation']); |
list($day)= split (' ',$day); |
$obs['date_observation']=$day."/".$month."/".$year; |
} |
else { |
$obs['date_observation']="00/00/0000"; |
} |
$worksheet->write($i,0,$code_departement); |
$worksheet->write($i,1,$obs['nom_sel']); |
$worksheet->write($i,2,$obs['nom_sel_nn']); |
$worksheet->write($i,3,$obs['nom_ret']); |
$worksheet->write($i,4,$obs['nom_ret_nn']); |
$worksheet->write($i,5,$obs['nt']); |
$worksheet->write($i,6,$obs['famille']); |
$worksheet->write($i,7,$obs['zone_geo']); |
$worksheet->write($i,8,$obs['date_observation']); |
$worksheet->write($i,9,$obs['lieudit']); |
$worksheet->write($i,10,$obs['station']); |
$worksheet->write($i,11,$obs['milieu']); |
$worksheet->write($i,12,$obs['commentaire']); |
$worksheet->write($i,13,$obs['courriel_utilisateur']); |
$i++; |
} |
} |
// sending HTTP headers |
$workbook->send('liste.xls'); |
$workbook->close(); |
exit(); |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.1 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.2 2008-01-30 08:57:28 ddelon |
* fin mise en place mygwt |
* |
* Revision 1.1 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/CelWidgetMap.php |
---|
New file |
0,0 → 1,879 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service fournissant une carte dynamique des obsertions publiques du CEL. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* /CelWidgetMap/Carte/Utilisateur : carte des observations publiques d'un utilisateur. |
* /CelWidgetMap/Carte/Utilisateur/Projet : carte des observations publiques d'un utilisateur pour un projet. |
* /CelWidgetMap/Carte/Utilisateur/Projet/dept : carte des observations publiques d'un utilisateur pour un projet sur un département. |
* /CelWidgetMap/Carte/Utilisateur/Projet/dept/num_taxon : carte des observations publiques d'un utilisateur pour un projet sur un département pour un taxon. |
* |
* Carte = Type de carte. Valeurs possible : defaut, |
* Utilisateur = identifiant (= courriel) de l'utilisateur ou * pour tous les utilisateurs. |
* Projet = mot-clé du projet |
* |
* @author Jean-Pascal MILCENT <jpm@clapas.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2010, Jean-Pascal MILCENT |
*/ |
// TODO : supprimer le TRIM quand les obs seront reliées correctements aux localisations (sur le code INSEE par exemple) |
class CelWidgetMap extends Cel { |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($ressources) { |
$retour = null; |
extract($this->parametres); |
$action = array_shift($ressources); |
if (isset($action)) { |
$methode = $this->traiterNomMethodeGet($action); |
if (method_exists($this, $methode)) { |
$retour = $this->$methode($ressources); |
} else { |
$this->messages[] = "Ce type de ressource '$methode' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Vous devez indiquer le type de ressource."; |
} |
if (is_null($retour)) { |
$info = 'Un problème est survenu : '.print_r($this->messages, true); |
$this->envoyer($info); |
} else if ($retour['type'] == 'jsonVar') { |
$this->envoyerJsonVar($retour['variable_js'], $retour['donnees']); |
} else if ($retour['type'] == 'jsonP') { |
$this->envoyerJsonp($retour['donnees']); |
} else { |
$this->envoyerJson($retour); |
} |
} |
/** |
* Les stations de la carte par défaut |
*/ |
public function getStations($params) { |
$json = null; |
$requete = 'SELECT sector, x_utm, y_utm, wgs84_latitude AS coord_x, wgs84_longitude AS coord_y '. |
'FROM cel_inventory AS i '. |
' LEFT JOIN locations AS l '. |
' ON (l.name = i.location AND l.code = i.id_location) '. |
"WHERE transmission = '1' ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(); |
//die($requete); |
$resultats = $this->requeter($requete); |
// Traitement des résultats |
$obs_nbre = $this->traiterNbreObs($resultats); |
$stations = $this->traiterStations($resultats); |
// Création des infos du widget |
$json['donnees']['points'] = $stations; |
$json['donnees']['stats']['communes'] = count($stations); |
$json['donnees']['stats']['observations'] = $obs_nbre; |
$json['type'] = (isset($this->formatRetour)) ? $this->formatRetour : 'jsonVar'; |
$json['variable_js'] = 'stations'; |
return $json; |
} |
private function traiterNbreObs($resultats) { |
$obs_nbre = 0; |
if ($resultats !== false) { |
$obs_nbre = count($resultats); |
} |
return $obs_nbre; |
} |
private function traiterStations($resultats) { |
$stations = array(); |
if ($resultats !== false) { |
foreach ($resultats as $enrg) { |
if ($enrg['coord_x'] != null && $enrg['coord_y'] != null) { |
$id = $enrg['coord_x'].'-'.$enrg['coord_y']; |
if (!isset($stations[$id])) { |
$enrg['id'] = 'UTM:'.$enrg['x_utm'].'-'.$enrg['y_utm'].'-'.$enrg['sector']; |
unset($enrg['x_utm']); |
unset($enrg['y_utm']); |
unset($enrg['sector']); |
$stations[$id] = $enrg; |
$stations[$id]['nbre'] = 1; |
} else { |
$stations[$id]['nbre']++; |
} |
} |
} |
$stations = array_values($stations); |
} |
return $stations; |
} |
/** |
* Données pour l'affichage des obs d'une station |
*/ |
public function getObservations($params) { |
$resultats = array(); |
$total = 0; |
if (!$this->etreNull($this->parametres['station'])) { |
$requete = 'SELECT SQL_CALC_FOUND_ROWS id, identifiant, nom_sel, nom_ret, num_nom_sel, num_nom_ret, num_taxon, famille, '. |
' lieudit, location, date_observation, milieu, commentaire, '. |
' sector, x_utm, y_utm, insee_code, date_transmission '. |
'FROM cel_inventory AS i '. |
' LEFT JOIN locations AS l '. |
" ON (l.name = i.location AND l.code = i.id_location) ". |
"WHERE transmission = '1' ". |
$this->construireWhereCoordonnees(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
'ORDER BY nom_sel ASC '. |
"LIMIT {$this->start},{$this->limit} "; |
//die($requete); |
$resultats = $this->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET); |
$requete = 'SELECT FOUND_ROWS()'; |
$total = (int) $this->requeter($requete, self::SQL_RETOUR_COLONNE); |
} |
// Post-traitement |
$observations = $this->traiterObservations($resultats, $total); |
$observations = $this->ajouterImagesAuxObs($observations); |
$observations = $this->ajouterAuteursAuxObs($observations); |
$observations = $this->supprimerIdDesObs($observations); |
return $observations; |
} |
private function traiterObservations($donnees, $total) { |
$observations = array('commune' => '', 'observations' => array(), 'observateurs' => array()); |
$observations['total'] = (isset($total)) ? $total : 0; |
if (is_array($donnees) && count($donnees) > 0) { |
foreach ($donnees as $donnee) { |
$observation = array(); |
$observation['idObs'] = $donnee->id; |
$observation['nn'] = $this->etreNull($donnee->num_nom_sel) ? null : $donnee->num_nom_sel; |
$observation['nomSci'] = $this->nettoyerTexte($donnee->nom_sel); |
$observation['date'] = $this->formaterDate($donnee->date_observation, '%d/%m/%Y'); |
$observation['datePubli'] = $this->formaterDate($donnee->date_transmission); |
$observation['lieu'] = $this->traiterLieu($donnee); |
$observation['observateur'] = $donnee->identifiant; |
$observation['urlEflore'] = $this->getUrlEflore($donnee->num_nom_sel); |
if (isset($donnee->location)) { |
$observations['commune'] = $this->nettoyerTexte($donnee->location); |
} |
$observations['observations'][$donnee->id] = $observation; |
if (! array_key_exists($donnee->identifiant, $observations['observateurs'])) { |
$observations['observateurs'][$donnee->identifiant] = $donnee->identifiant; |
} |
} |
} |
return $observations; |
} |
private function getUrlEflore($nn) { |
$urlEflore = null; |
if (! $this->etreNull($nn)) { |
$urlEflore = sprintf($this->config['settings']['efloreUrlTpl'], $nn, 'illustration'); |
} |
return $urlEflore; |
} |
private function traiterLieu($donnee) { |
$lieu = array(); |
if (!$this->etreNull($donnee->lieudit)) { |
$lieu[] = $donnee->lieudit; |
} |
if (!$this->etreNull($donnee->milieu)) { |
$lieu[] = $donnee->milieu; |
} |
return implode(', ', $lieu); |
} |
private function chargerImages(Array $obs_ids) { |
// Récupération des données au format Json |
$service = 'CelImage/liste-ids?obsId='.implode(',', $obs_ids); |
$url = sprintf($this->config['settings']['baseURLServicesCelTpl'], $service); |
$json = $this->getRestClient()->consulter($url); |
$donnees = json_decode($json); |
// Post-traitement des données |
$images = $this->traiterImages($donnees); |
return $images; |
} |
private function traiterImages($donnees) { |
$images = array(); |
if (count($donnees) > 0) { |
foreach ($donnees as $id_obs => $id_images) { |
foreach ($id_images as $id_img) { |
$urls['idImg'] = $id_img; |
$urls['guid'] = sprintf($this->config['settings']['guidImgTpl'], $id_img); |
$urls['miniature'] = $this->getUrlImage($id_img, 'CXS'); |
$urls['normale'] = $this->getUrlImage($id_img, 'XL'); |
$images[$id_obs][] = $urls; |
} |
} |
} |
return $images; |
} |
private function ajouterImagesAuxObs($observations) { |
$images = $this->chargerImages(array_keys($observations['observations'])); |
foreach ($observations['observations'] as $id => $infos) { |
$infos['images'] = $images[$id]; |
$observations['observations'][$id] = $infos; |
} |
return $observations; |
} |
private function ajouterAuteursAuxObs($observations) { |
$observateurs = $this->recupererUtilisateursIdentite(array_keys($observations['observateurs'])); |
unset($observations['observateurs']); |
foreach ($observations['observations'] as $id => $infos) { |
$courriel = $infos['observateur']; |
$infos['observateur'] = $observateurs[$courriel]['intitule']; |
$infos['observateurId'] = $observateurs[$courriel]['id']; |
$observations['observations'][$id] = $infos; |
} |
return $observations; |
} |
private function supprimerIdDesObs($observations) { |
// Le tableau de sortie ne doit pas avoir les id des obs en clé car sinon Jquery Template ne fonctionne pas |
$observationSansId = $observations; |
unset($observationSansId['observations']); |
foreach ($observations['observations'] as $id => $infos) { |
$observationSansId['observations'][] = $infos; |
} |
return $observationSansId; |
} |
/** |
* Liste des taxons présents sur la carte |
*/ |
public function getTaxons($params) { |
$json = null; |
$requete = 'SELECT SQL_CALC_FOUND_ROWS DISTINCT nom_ret, num_nom_ret, num_taxon, famille '. |
'FROM cel_inventory AS i '. |
' LEFT JOIN locations AS l '. |
' ON (l.name = i.location AND l.code = i.id_location) '. |
"WHERE transmission = '1' ". |
" AND nom_ret != '' ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(); |
'ORDER BY nom_ret ASC '. |
"LIMIT {$this->start},{$this->limit} "; |
//$this->debug[] = $requete; |
$resultats = $this->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET); |
$requete = 'SELECT FOUND_ROWS()'; |
$taxons['total'] = (int) $this->requeter($requete, self::SQL_RETOUR_COLONNE); |
// Post-traitement |
$taxons['taxons'] = $this->traiterTaxons($resultats); |
return $taxons; |
} |
private function traiterTaxons($donnees) { |
$taxons = array(); |
if (is_array($donnees) && count($donnees) > 0) { |
foreach ($donnees as $donnee) { |
if (!isset($taxons[$donnee->num_taxon]) && ! $this->etreNull($donnee->nom_ret)) { |
$taxon = array(); |
$taxon['nn'] = $donnee->num_nom_ret; |
$taxon['nt'] = $donnee->num_taxon; |
$taxon['nom'] = $this->nettoyerTexte($donnee->nom_ret); |
$taxon['famille'] = $this->nettoyerTexte($donnee->famille); |
$taxons[$donnee->num_taxon] = $taxon; |
} |
} |
} |
$taxons = array_values($taxons); |
return $taxons; |
} |
private function construireWhereCoordonnees() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->decomposerParametreStation()); |
if (isset($type)) { |
if ($type == 'UTM') { |
$secteur = $this->proteger($secteur); |
$x_utm = $this->proteger($x_utm); |
$y_utm = $this->proteger($y_utm); |
$sql = " AND (sector = $secteur AND x_utm = $x_utm AND y_utm = $y_utm ) "; |
} else if ($type == 'LngLat') { |
$coord_x = $this->proteger($coord_x); |
$coord_y = $this->proteger($coord_y); |
$sql = " AND (coord_x = $coord_x AND coord_y = $coord_y ) "; |
} |
} |
return $sql; |
} |
private function construireWhereCommentaire() { |
$sql = ''; |
list($type, $commentaire) = $this->decomposerParametreCommentaire(); |
if (!$this->etreNull($commentaire)) { |
$commentaire = $this->proteger('%'.$commentaire.'%'); |
switch ($type) { |
case '*' : |
$sql = $this->obtenirConditionPourCommentaires($commentaire); |
$sql = " AND (commentaire LIKE $commentaire OR ($sql)) "; |
break; |
case 'observation' : |
$sql = " AND commentaire LIKE $commentaire "; |
break; |
case 'photo' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaires($commentaire).' '; |
break; |
case 'photo.meta' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaireMeta($commentaire).' '; |
break; |
case 'photo.utilisateur' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaireUtilisateur($commentaire).' '; |
break; |
default: |
$sql = " AND commentaire LIKE $commentaire "; |
} |
} |
return $sql; |
} |
private function construireWhereNomTaxon() { |
$sql = ''; |
list($type, $nom) = $this->decomposerParametreTaxon(); |
if (!$this->etreNull($nom)) { |
$nom = $this->proteger($nom.'%'); |
switch ($type) { |
case '*' : |
$sql = " AND (nom_ret LIKE $nom OR nom_sel LIKE $nom OR famille LIKE $nom) "; |
break; |
case 'retenu' : |
$sql = " AND nom_ret LIKE $nom "; |
break; |
case 'selectionne' : |
$sql = " AND nom_sel LIKE $nom "; |
break; |
case 'famille' : |
$sql = " AND famille LIKE $nom "; |
break; |
default: |
$sql = " AND nom_ret LIKE $nom "; |
} |
} |
return $sql; |
} |
private function construireWhereDate() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
list($type, $date) = $this->decomposerParametreDate(); |
if (!$this->etreNull($date)) { |
$date = $this->proteger($date.'%'); |
switch ($type) { |
case '*' : |
$sql = " AND ( |
date_observation LIKE $date |
OR date_creation LIKE $date |
OR date_modification LIKE $date |
OR date_transmission LIKE $date) "; |
break; |
case 'observation' : |
$sql = " AND date_observation LIKE $date "; |
break; |
case 'creation' : |
$sql = " AND date_creation LIKE $date "; |
break; |
case 'modification' : |
$sql = " AND date_modification LIKE $date "; |
break; |
case 'transmission' : |
$sql = " AND date_transmission LIKE $date "; |
break; |
case 'photo' : |
$sql = $this->obtenirConditionPourDatePhoto($date); |
break; |
case 'ajout' : |
$sql = $this->obtenirConditionPourDateAjout($date); |
break; |
case 'liaison' : |
$sql = $this->obtenirConditionPourDateLiaison($date); |
break; |
default: |
$sql = " AND date_observation LIKE $date "; |
} |
} |
return $sql; |
} |
private function obtenirConditionPourDatePhoto($date) { |
$observations = $this->obtenirObsLieesImg('date.photo', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une photo prise à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourDateLiaison($date) { |
$observations = $this->obtenirObsLieesImg('date.liaison', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'a été liée à une image à à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourDateAjout($date) { |
$observations = $this->obtenirObsLieesImg('date.ajout', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image ajoutée à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourCommentaireMeta($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.meta', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des méta-données correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
private function obtenirConditionPourCommentaireUtilisateur($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.utilisateur', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des utilisateur correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
private function obtenirConditionPourCommentaires($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.*', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont un des commentaires correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
/** |
* Récupération des identifiant d'utilisateur et des ordres des observations correspondant à une date. |
* Retour sous forme de tableau : array[identifiant] = array(ordre, ordre...); |
*/ |
private function obtenirObsLieesImg($type, $param) { |
// Construction de la requête |
$requete = 'SELECT DISTINCT coi_ce_observation AS ordre, coi_ce_utilisateur AS utilisateur '. |
'FROM cel_images '. |
' LEFT JOIN cel_obs_images '. |
' ON (ci_id_image = coi_ce_image) '. |
' LEFT JOIN cel_inventory AS i '. |
' ON (coi_ce_utilisateur = i.identifiant AND coi_ce_observation = i.ordre) '. |
' LEFT JOIN locations AS l '. |
' ON (l.name = i.location AND l.code = i.id_location) '. |
"WHERE transmission = '1' ". |
($type == 'date.photo' ? " AND (ci_meta_date_time LIKE ".str_replace('-', ':', $param)." OR ci_meta_date LIKE $param) " : ''). |
($type == 'date.ajout' ? " AND ci_meta_date_ajout LIKE $param " : ''). |
($type == 'date.liaison' ? " AND coi_date_liaison LIKE $param " : ''). |
($type == 'commentaire.meta' ? " AND ci_meta_comment LIKE $param " : ''). |
($type == 'commentaire.utilisateur' ? " AND ci_meta_user_comment LIKE $param " : ''). |
($type == 'commentaire.*' ? " AND (ci_meta_comment LIKE $param OR ci_meta_user_comment LIKE $param) " : ''). |
$this->construireWhereCoordonnees(). |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
'ORDER BY utilisateur ASC, ordre ASC'; |
//$this->debug[] = $requete; |
//die($requete); |
$resultats = $this->executerRequete($requete); |
$observations = null; |
if ($resultats != false) { |
$observations = array(); |
foreach ($resultats as $occurence) { |
$utilisateur = $occurence['utilisateur']; |
$ordre = $occurence['ordre']; |
if (!array_key_exists($utilisateur, $observations)) { |
$observations[$utilisateur] = array(); |
} |
if (!array_key_exists($ordre, $observations[$utilisateur])) { |
$observations[$utilisateur][$ordre] = $ordre; |
} |
} |
} |
return $observations; |
} |
private function assemblerObsEnConditionSql($observations, $operateur = 'AND') { |
$sql = ''; |
if ($observations != null) { |
// Pré-construction du where de la requête |
$tpl_where = "(identifiant = '%s' AND ordre IN (%s))"; |
foreach ($observations as $utilisateur => $ordres) { |
$morceaux_requete[] = sprintf($tpl_where, $utilisateur, implode(',', $ordres)); |
} |
if (count($morceaux_requete) > 0) { |
$sql = implode(" \nOR ", $morceaux_requete); |
} |
} else { |
// Nous voulons que la requête ne retourne rien |
$sql = "identifiant = '' AND ordre = ''"; |
} |
$sql = " $operateur ($sql) "; |
return $sql; |
} |
private function construireWhereDept() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (!$this->etreNull($dept)) { |
$dept = $this->traiterValeursMultiples($dept); |
$sql = " AND code IN ($dept) "; |
} |
return $sql; |
} |
private function construireWhereCommune() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (!$this->etreNull($commune)) { |
$commune = $this->proteger($commune); |
$sql = " AND location LIKE $commune "; |
} |
return $sql; |
} |
private function construireWhereUtilisateur() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (!$this->etreNull($utilisateur)) { |
$utilisateur = $this->proteger($utilisateur); |
$sql = " AND identifiant = $utilisateur "; |
} |
return $sql; |
} |
private function construireWhereNumTaxon() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (!$this->etreNull($num_taxon)) { |
$num_taxon = $this->proteger($num_taxon); |
$sql = " AND num_taxon = $num_taxon "; |
} |
return $sql; |
} |
private function construireWhereProjet() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
$projet_sql = $this->getSqlWhereProjet($projet); |
if (!$this->etreNull($projet_sql)) { |
$sql = " AND ($projet_sql) "; |
} |
return $sql; |
} |
/** |
* Traitement de $projet pour construction du filtre dans la requête |
*/ |
private function getSqlWhereProjet($projet) { |
$sql = null; |
if (! $this->etreNull($projet)) { |
$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($projet)); |
// Construction de la requête |
$requete = 'SELECT * '. |
'FROM cel_mots_cles_obs '. |
"WHERE cmc_id_mot_cle_general = $mot_cle_encode "; |
$elements_projet = $this->executerRequete($requete); |
$requete_projet = array(); |
if ($elements_projet != false && count($elements_projet) > 0) { |
// Pré-construction du where de la requête |
$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %s )'; |
foreach ($elements_projet as $occurence) { |
$requete_projet[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire'])); |
} |
} else { |
$this->messages[] = "Aucune observation ne correspond à ce mot clé."; |
} |
if (count($requete_projet) > 0) { |
$sql = implode(" \nOR ", $requete_projet); |
} |
} |
return $sql; |
} |
private function construireWhereTag() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
$tag_sql = $this->getSqlWhereObsAvecImagesTaguees($tag); |
if (!$this->etreNull($tag_sql)) { |
$sql = " AND ($tag_sql) "; |
} |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereObsAvecImagesTaguees($tag) { |
$sql = null; |
if (! $this->etreNull($tag)) { |
$tag_sql = $this->getSqlWhereMotsCles($tag); |
// Construction de la requête |
$requete = 'SELECT DISTINCT coi_ce_observation AS ordre, coi_ce_utilisateur AS utilisateur '. |
'FROM cel_images '. |
' LEFT JOIN cel_obs_images '. |
' ON (ci_id_image = coi_ce_image) '. |
' LEFT JOIN cel_inventory AS i '. |
' ON (coi_ce_utilisateur = i.identifiant AND coi_ce_observation = i.ordre) '. |
' LEFT JOIN locations AS l '. |
" ON (l.name = i.location AND l.code = i.id_location) ". |
"WHERE transmission = '1' ". |
$this->construireWhereCoordonnees(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereProjet(). |
(!$this->etreNull($tag_sql) ? "AND ($tag_sql) " : ''). |
'ORDER BY utilisateur ASC, ordre ASC'; |
//$this->debug[] = $requete; |
//die($requete); |
$elements_tag = $this->executerRequete($requete); |
$requete_tag = array(); |
if ($elements_tag != false && count($elements_tag) > 0) { |
$filtres = array(); |
foreach ($elements_tag as $occurence) { |
$utilisateur = $occurence['utilisateur']; |
$ordre = $occurence['ordre']; |
if (!array_key_exists($utilisateur, $filtres)) { |
$filtres[$utilisateur] = array(); |
} |
if (!array_key_exists($ordre, $filtres[$utilisateur])) { |
$filtres[$utilisateur][$ordre] = $ordre; |
} |
} |
// Pré-construction du where de la requête |
$tpl_where = "(identifiant = '%s' AND ordre IN (%s))"; |
foreach ($filtres as $utilisateur => $ordres) { |
$requete_tag[] = sprintf($tpl_where, $utilisateur, implode(',', $ordres)); |
} |
} else { |
$this->messages[] = "Aucune observation ne possède d'images avec ce mot-clé."; |
} |
if (count($requete_tag) > 0) { |
$sql = implode(" \nOR ", $requete_tag); |
} |
} |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereMotsCles($tag) { |
$sql = null; |
$mots_cles = $this->decomposerParametreTag($tag); |
// Construction de la requête |
$requete = 'SELECT cmc_id_proprietaire AS utilisateur, cmc_id_mot_cle_general AS mot_cle_general, '. |
' cmc_id_mot_cle_utilisateur AS mot_cle_utilisateur '. |
'FROM cel_mots_cles_images '. |
'WHERE '.$this->getSqlWhereMotsClesImages($mots_cles['motsClesEncodesProteges']); |
$elements_projet = $this->executerRequete($requete); |
//$this->debug[] = $requete; |
$requete_projet = array(); |
if ($elements_projet != false && count($elements_projet) > 0) { |
// Pré-construction du where de la requête |
if ($mots_cles['type'] == 'OR') { |
$tpl_where = '(ci_meta_mots_cles LIKE "%%%s,%%" AND ci_ce_utilisateur = %s )'; |
foreach ($elements_projet as $occurence) { |
$requete_projet[] = sprintf($tpl_where, $occurence['mot_cle_utilisateur'], $this->bdd->quote($occurence['utilisateur'])); |
} |
} else { |
$tpl_where_mc = "ci_meta_mots_cles LIKE '%%%s,%%'"; |
$tpl_where = '((%s) AND ci_ce_utilisateur = %s)'; |
$utilisateur_mc = array(); |
foreach ($elements_projet as $occurence) { |
if (!isset($utilisateur_mc[$occurence['utilisateur']][$occurence['mot_cle_general']])) { |
$utilisateur_mc[$occurence['utilisateur']][$occurence['mot_cle_general']] = $occurence['mot_cle_utilisateur']; |
} |
} |
foreach ($utilisateur_mc as $utilisateur => $mots_cles_utilisateur) { |
if (count($mots_cles_utilisateur) == count($mots_cles['motsCles'])) { |
$where_mots_cles_utilisateur = array(); |
foreach ($mots_cles_utilisateur as $mot_cle) { |
$where_mots_cles_utilisateur[] = sprintf($tpl_where_mc, $mot_cle); |
} |
$where_mots_cles_utilisateur = implode(' AND ', $where_mots_cles_utilisateur); |
$utilisateur = $this->bdd->quote($utilisateur); |
$requete_projet[] = sprintf($tpl_where, $where_mots_cles_utilisateur, $utilisateur); |
} |
} |
} |
} else { |
$this->messages[] = "Aucune observation ne correspond à ce mot clé."; |
} |
$sql = implode(" \nOR ", $requete_projet); |
//$this->debug[] = $sql; |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereMotsClesImages($mots_cles_encodes) { |
$where_mots_cles_images = array(); |
foreach ($mots_cles_encodes as $mot_cle_encode) { |
$where_mots_cles_images[] = "cmc_id_mot_cle_general = $mot_cle_encode"; |
} |
$where_mots_cles_images = implode(' OR ', $where_mots_cles_images); |
return $where_mots_cles_images; |
} |
private function decomposerParametreTag($tags) { |
$mots_cles = array('type' => null, 'motsCles' => null, 'motsClesEncodesProteges' => null); |
if (preg_match('/.+OU.+/', $tags)) { |
$mots_cles['type'] = 'OR'; |
$mots_cles['motsCles'] = explode('OU', $tags); |
} else if (preg_match('/.+ET.+/', $tags)) { |
$mots_cles['type'] = 'AND'; |
$mots_cles['motsCles'] = explode('ET', $tags); |
} else { |
$mots_cles['motsCles'][] = $tags; |
} |
foreach ($mots_cles['motsCles'] as $mot) { |
$mots_cles['motsClesEncodesProteges'][] = $this->bdd->quote($this->encoderMotCle($mot)); |
} |
$this->debug[] = $mots_cles; |
return $mots_cles; |
} |
private function decomposerParametreStation() { |
$station_infos = array(); |
if (isset($this->parametres['station'])) { |
$station = $this->parametres['station']; |
$this->debug[] = $station; |
list($type, $coord) = explode(':', $station); |
if ($type == 'UTM') { |
list($x_utm, $y_utm, $secteur) = explode('-', $coord); |
$station_infos = array('x_utm' => $x_utm, 'y_utm' => $y_utm, 'secteur' => $secteur); |
} else if ($type == 'LngLat') { |
list($coord_y, $coord_x) = explode('-', $coord); |
$station_infos = array('coord_y' => $coord_y, 'coord_x' => $coord_x); |
} |
$station_infos['type'] = $type; |
} |
return $station_infos; |
} |
private function decomposerParametreDate() { |
$date_infos = array(); |
if (isset($this->parametres['date'])) { |
$date = $this->parametres['date']; |
if (strpos($date, ':')) { |
list($type, $date) = explode(':', $date); |
} else { |
$type = 'observation'; |
} |
$date = str_replace('/', '-', $date); |
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $date, $matches)) { |
$date = $matches[3].'-'.$matches[2].'-'.$matches[1]; |
} |
$date_infos = array($type, $date); |
} |
return $date_infos; |
} |
private function decomposerParametreTaxon() { |
$nom_infos = array(); |
if (isset($this->parametres['taxon'])) { |
$taxon = $this->parametres['taxon']; |
if (strpos($taxon, ':')) { |
$nom_infos = explode(':', $taxon); |
} else { |
$nom_infos = array('retenu', $taxon); |
} |
} |
return $nom_infos; |
} |
private function decomposerParametreCommentaire() { |
$commentaire_infos = array(); |
if (isset($this->parametres['commentaire'])) { |
$commentaire = $this->parametres['commentaire']; |
if (strpos($commentaire, ':')) { |
$commentaire_infos = explode(':', $commentaire); |
} else { |
$commentaire_infos = array('observation', $commentaire); |
} |
} |
return $commentaire_infos; |
} |
} |
/tags/celw-v1.1/jrest/services/PlantNetRssParEspece.php |
---|
New file |
0,0 → 1,173 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2009 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
class PlantNetRssParEspece extends DBAccessor { |
var $config; |
function PlantNetRss($config) { |
$this->config=$config; |
} |
function getElement($uid){ |
$rss = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n"; |
$rss .= "<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n"; |
$rss .=' |
<channel> |
<title>Carnet en ligne</title> |
<link>http://www.tela-botanica.org/cel/jrest/PlantnetRss</link> |
<description>Derniers scans de feuilles</description> |
<language>fr</language>'; |
$motcle = 'plantnet' ; |
$DB=$this->connectDB($this->config,'cel_db'); |
$query_id_id_img = 'SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles WHERE cmc_id_mot_cle_general = md5("'.$motcle.'")' ; |
$res =& $DB->query($query_id_id_img); |
if (DB::isError($res)) { |
echo $res->getMessage(); |
} |
$query='SELECT * FROM cel_images'; |
$premier_item = true ; |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
if($premier_item) { |
$query .= ' WHERE '; |
$premier_item = false ; |
} |
else{ |
$query .= ' OR '; |
} |
$query .= '(ci_meta_mots_cles LIKE "%'.$row['cmc_id_mot_cle_utilisateur'].'%" AND ci_ce_utilisateur ="'.$row['cmc_id_proprietaire'].'")' ; |
} |
$query .= ' ORDER BY ci_meta_date_ajout DESC LIMIT 0,100' ; |
$res =& $DB->query($query); |
if (DB::isError($res)) { |
print("req partie 2"); |
die($res->getMessage()); |
} |
while ($row =& $res->fetchrow(DB_FETCHMODE_ASSOC)) { |
$row['ci_nom_original'] = htmlspecialchars($row['ci_nom_original']); |
$row['ci_id_image'] = htmlspecialchars($row['ci_id_image']); |
$row['ci_meta_date_ajout'] = htmlspecialchars($row['ci_meta_date_ajout']); |
$row['ci_ce_utilisateur'] = htmlspecialchars($row['ci_ce_utilisateur']); |
$row['ci_meta_user_comment'] = htmlspecialchars($row['ci_meta_user_comment']); |
$row['ci_note_image'] = htmlspecialchars($row['ci_note_image']); |
$tailleXY = $this->calculerDimensions(array($row['ci_meta_width'], $row['ci_meta_height'])); |
$id = $row['ci_id_image']; |
$chemin_sur_serveur = $this->config['cel_db']['url_images']; |
$id = sprintf('%09s', $id) ; |
$id = wordwrap($id, 3 , '_', true) ; |
$id_fichier = $id.".jpg" ; |
$niveauDossier = split("_", $id) ; |
$dossierNiveau1 = $niveauDossier[0] ; |
$dossierNiveau2 = $niveauDossier[1] ; |
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2 ; |
$chemin_fichier = $chemin_sur_serveur_final.'/L/'.$id."_L.jpg" ; |
$chemin_fichier_m = $chemin_sur_serveur_final.'/M/'.$id."_M.jpg" ; |
$rss.= ' <item> |
<title>'.$row['ci_nom_original']." (".$row['ci_id_image'].") ". ' par ' . $row['ci_ce_utilisateur'].'</title> |
<author>'.$row['ci_ce_utilisateur'].'</author> |
<link>'.$chemin_fichier.'</link> |
<description>'. |
' <![CDATA[<img src="'.$chemin_fichier_m.'" alt="'.$row['ci_nom_original'].'" height="'.$tailleXY[1].'px" width="'.$tailleXY[0].'px"></img><br/>]]>'. |
$row['ci_nom_original']. ' ajouté le ' .$row['ci_meta_date_ajout'] . ' par ' . $row['ci_ce_utilisateur'].' |
</description> |
<dc:format>text/html</dc:format> |
</item>'; |
} |
$rss.= '</channel> </rss>'; |
header("Content-Type: text/xml; charset=UTF-8"); |
print $rss; |
exit; |
} |
function getRessource(){ |
$uid[] = array() ; |
$this->getElement($uid); |
} |
function calculerDimensions($tailleXY) { |
$tailleOr = 300 ; |
if($tailleXY[1] == 0) { |
$tailleXY[1] = $tailleOr; |
} |
if($tailleXY[0] == 0) { |
$tailleXY[0] = $tailleOr; |
} |
$maxTaille = max($tailleXY[1],$tailleXY[0]) ; |
if($maxTaille == $tailleXY[1]) { |
$rapport = $tailleXY[1]/$tailleXY[0] ; |
$tailleXY[1] = 300 ; |
$tailleXY[0] = round($tailleXY[1]/$rapport,0) ; |
}else { |
$rapport = $tailleXY[0]/$tailleXY[1] ; |
$tailleXY[0] = 300 ; |
$tailleXY[1] = round($tailleXY[0]/$rapport,0) ; |
} |
return $tailleXY ; |
} |
} |
/* +--Fin du code ---------------------------------------------------------------------------------------+ |
* $Log$ |
* Revision 1.5 2008-11-13 11:29:12 ddelon |
* Reecriture gwt-ext |
* |
* Revision 1.4 2007-06-06 13:31:16 ddelon |
* v0.09 |
* |
* Revision 1.3 2007-05-22 12:54:09 ddelon |
* Securisation acces utilisateur |
* |
* |
* |
*/ |
?> |
/tags/celw-v1.1/jrest/services/. |
---|
New file |
Property changes: |
Added: svn:ignore |
+MigrationImages.php |
+MigrationMotsCles.php |
+MigrationObs.php |