Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2460 → Rev 2461

/trunk/jrest/services/InventoryImage.php
53,13 → 53,12
public function updateElement($uid,$pairs) {
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
 
if (count($pairs) == 0 || !isset($uid[1])) {
return false;
}
 
$gestionnaireImage = new GestionImage($this->config);
$resultat_mise_a_jour = $gestionnaireImage->modifierImage($uid[0],$uid[1],$pairs);
$resultat_mise_a_jour = $gestionnaireImage->modifierImage($uid[0], $uid[1], $pairs);
 
$retour = false;
$ok = false;
67,7 → 66,6
$retour = 'OK';
$ok = true;
}
 
$this->envoyer($retour);
return $ok;
}
/trunk/jrest/services/CelWidgetSaisie.php
8,11 → 8,17
* 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
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Bibliothèques
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CelWidgetSaisie extends Cel {
 
371,17 → 377,14
}
 
private function getMaxOrdre($id_utilisateur) {
$ordre = null;
$identifiant = Cel::db()->quote($id_utilisateur);
$requete = "SELECT MAX(ordre) AS ordre ".
"FROM cel_obs ".
"WHERE ce_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";
$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
$requete = 'SELECT MAX(ordre) AS ordre '.
'FROM cel_obs '.
"WHERE ce_utilisateur = $idUtilisateurP ".
' -- '.__FILE__.':'.__LINE__;
$ordre_max = Cel::db()->requeterValeurUnique($requete);
 
$ordre_max = Cel::db()->requeterValeurUnique($requete);
if ($ordre_max !== false) {
$ordre = $ordre_max + 1;
}
return $ordre;
return ($ordre_max !== false) ? $ordre_max + 1 : null;
}
 
/**
412,7 → 415,7
}
 
private function lierObsAMotsCles($observations_ids, $tags) {
$chemin_parent = "/";
$chemin_parent = '/';
$listeIdsTags = array();
foreach ($tags as $tag) {
$tag = $this->nettoyerTag($tag);
/trunk/jrest/services/CelImage.php
1,7 → 1,7
<?php
// declare(encoding='UTF-8');
/**
* Service fournissant la liste des ids des images liées à une observation.
* Service générique permettant de manipuler les Images.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
13,11 → 13,17
* 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$
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Images
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CelImage extends Cel {
 
/trunk/jrest/services/CelObs.php
1,18 → 1,28
<?php
// declare(encoding='UTF-8');
/**
* Service permettant de récupérer toutes les informations d'une observation publique.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
* Service générique de modification des observations.
*
* Cas d'utilisation :
* GET /CelObs/[id] : oû id est l'identifiant d'une observation publique
* POST /CelObs/[id] : oû id est l'identifiant d'une observation publique
* si les data du POST contienent :
* - 1 données :
* - 'transmission' : publier ou dépublier une obs
* - 3 données :
* - 'id_observation', 'nom_sel_nn', 'nom_referentiel' : permet d'accepter une proposition (DEL)
*
* @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 © 2013, Jean-Pascal MILCENT
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Observations
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CelObs extends Cel {
private $rechercheObs = null;
34,7 → 44,7
}
}
 
function getElement($ressources){
public function getElement($ressources){
$retour = false;
$idObs = $ressources[0];
if (isset($idObs) && preg_match('/^[0-9]+$/', $idObs)) {
127,6 → 137,7
$donneesObligatoires = array('transmission');
if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
$this->depublierObs($idObs);
$this->depublierImg($idObs);
}
} else if (count($this->donnees) == 3) {
$donneesObligatoires = array('id_observation', 'nom_sel_nn', 'nom_referentiel');
167,11 → 178,20
$gestionnaireObs = new GestionObservation($this->config);
$depublication = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
if ($depublication === false) {
$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
$msg = "Un problème est survenu (voir log). L'observation « $idObs » n'a pas pu être dépubliée.";
$this->envoyerMessageErreur(304, $msg);
}
}
 
private function depublierImg($idObs) {
$gestionnaireImg = new GestionImage($this->config);
$depublication = $gestionnaireImg->modifierTransmissionParObs($idObs, false);
if ($depublication === false) {
$msg = "Un problème est survenu (voir log). Les images liées à l'obs « $idObs » n'ont pas pu être dépubliées.";
$this->envoyerMessageErreur(304, $msg);
}
}
 
/**
* Modifie une observation aveec les infos d'une proposition :
* Nous complétons les données de la proposition acceptée ici car:
196,9 → 216,9
 
if ($modification) {
// TODO: en modifiant bien la classe de gestion mots clés, on aurait peut être pas besoin de l'id
// utilisateur (car l'id de l'obs est déjà sans ambiguité)
// utilisateur (car l'id de l'obs est déjà sans ambiguité)
$idUtilisateur = $this->rechercheObs->obtenirIdUtilisateurPourIdObs($idObs);
 
// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
$gestionMotsClesObs = new GestionMotsClesChemin($this->config, 'obs');
$supp_liaison_mot_cle = $gestionMotsClesObs->supprimerLiaisonPourMotCleEtIdElementLie('aDeterminer', $idObs, $idUtilisateur);
/trunk/jrest/services/CelRadiusPoints.php
1,77 → 1,88
<?php
// declare(encoding='UTF-8');
/**
* Service renvoyant les observations présentent au sein d'un cercle de rayon donné.
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Bibliothèques
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CelRadiusPoints extends Cel {
private $champs = array("id_observation", "nom_sel", "latitude", "longitude", "COUNT(id_observation) as nb_obs");
private $champs_min = array("latitude", "longitude");
 
private $champs = array('id_observation', 'nom_sel', 'latitude', 'longitude', 'COUNT(id_observation) AS nb_obs');
private $champs_min = array('latitude', 'longitude');
 
private $champs_mode = null;
/**
* Méthode appelée avec une requête de type GET.
*/
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getRessource() {
$this->champs_mode = $this->champs_min;
return $this->getElement(array());
$this->champs_mode = $this->champs_min;
return $this->getElement(array());
}
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params) {
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params) {
$lat_centre = str_replace(',', '.', round(floatval($_GET['lat']), 3));
$lon_centre = str_replace(',', '.', round(floatval($_GET['lon']), 3));
$radius = str_replace(',', '.', floatval($_GET['radius']/1000));
 
$retour = array();
 
$retour['points'] = $this->obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius);
if(empty($retour['points'])) {
if (empty($retour['points'])) {
$retour['plus_proche'] = $this->obtenirPointPlusProche($lat_centre, $lon_centre);
}
 
$this->envoyerJson($retour);
$this->envoyerJson($retour);
}
 
public function obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius) {
$requete = "SELECT ".
implode(", ", $this->champs_mode)." ".
"FROM cel_obs ".
"WHERE latitude != 0 AND longitude != 0 ".
"AND ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." < ".$radius." ".
"GROUP BY latitude, longitude ";
 
$requete = 'SELECT '.implode(', ', $this->champs_mode).' '.
'FROM cel_obs '.
'WHERE latitude != 0 AND longitude != 0 '.
'AND '.$this->renvoyerDistanceSql($lat_centre, $lon_centre)." < $radius ".
'GROUP BY latitude, longitude '.
' -- '.__FILE__.':'.__LINE__;
$points = Cel::db()->requeter($requete);
return $points;
}
 
private function renvoyerDistanceSql($lat_centre, $lon_centre) {
$sous_requete =
"( ".
"6371 * acos ( ".
"cos ( radians(".$lat_centre.") ) ".
"* cos( radians( latitude ) ) ".
"* cos( radians( longitude ) - radians(".$lon_centre.") ) ".
"+ sin ( radians(".$lat_centre.") ) ".
"* sin( radians( latitude ) ) ".
") ".
") ";
$sous_requete =
"( ".
"6371 * acos ( ".
"cos ( radians($lat_centre) ) ".
"* cos( radians( latitude ) ) ".
"* cos( radians( longitude ) - radians($lon_centre) ) ".
"+ sin ( radians($lat_centre) ) ".
"* sin( radians( latitude ) ) ".
") ".
") ";
return $sous_requete;
}
 
public function obtenirPointPlusProche($lat_centre, $lon_centre) {
// TODO: faire moins moche et plus efficace
$requete = "SELECT ".
implode(", ", $this->champs_mode).", ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." AS distance ".
"FROM cel_obs ".
"WHERE latitude != 0 AND longitude != 0 ".
"GROUP BY latitude, longitude ".
"ORDER BY distance ".
"LIMIT 1";
 
$point = Cel::db()->requeterLigne($requete);
$requete = 'SELECT '.
implode(", ", $this->champs_mode).", ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." AS distance ".
'FROM cel_obs '.
'WHERE latitude != 0 AND longitude != 0 '.
'GROUP BY latitude, longitude '.
'ORDER BY distance '.
'LIMIT 1 '.
' -- '.__FILE__.':'.__LINE__;
$point = Cel::db()->requeterLigne($requete);
return $point;
}
}
/trunk/jrest/services/CelMessage.php
1,8 → 1,24
<?php
// declare(encoding='UTF-8');
/**
* Service encapsulant l'envoie de courriel via le web service de l'annuaire.
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Encapsulation
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CelMessage extends Cel {
 
private $mode = 'obs';
 
/**
* Méthode appelée avec une requête de type POST avec un identifiant d'obs.
* Envoi un message à l'utilisateur ayant saisi l'observation
12,14 → 28,13
* @param pairs array tableau contenant les valeurs du formulaire de messagerie
* (même format que le web service messagerie utilisateur de l'annuaire)
*/
public function updateElement($uid,$pairs)
{
public function updateElement($uid,$pairs) {
$this->verifierParametresObligatoires($uid, $pairs);
if(isset($pairs['type_envoi'])) {
if (isset($pairs['type_envoi'])) {
unset($pairs['type_envoi']);
}
if($uid[0] != 'obs' && $uid[0] != 'image') {
 
if ($uid[0] != 'obs' && $uid[0] != 'image') {
$info = array();
$info = 'Aucun mode n\'a été indiqué ';
$this->envoyer($info, 'text/html', 'utf-8', false);
27,11 → 42,11
} else {
$this->mode = $uid[0];
$id = $uid[1];
 
$methode = 'obtenirCourrielUtilisateurPourId'.ucwords($this->mode);
$courriel_utilisateur = $this->$methode($id);
if($courriel_utilisateur !== false) {
 
if ($courriel_utilisateur !== false) {
$resultat = $this->envoyerRequeteMessage($courriel_utilisateur, $pairs);
$this->envoyerJson($resultat);
exit;
43,44 → 58,43
}
}
}
 
private function envoyerRequeteMessage($courriel_utilisateur, $pairs) {
$base_url = $this->config['settings']['baseURLServicesAnnuaireTpl'];
$rest_client = $this->getRestClient();
$url_messagerie = str_replace('%s', "utilisateur/".urlencode($courriel_utilisateur)."/message", $base_url);
$resultat_json = $rest_client->modifier($url_messagerie, $pairs);
$resultat_json = $rest_client->modifier($url_messagerie, $pairs);
$resultat = json_decode($resultat_json);
return $resultat;
}
 
private function verifierParametresObligatoires($uid ,$params) {
$params_obligatoires = array('sujet', 'message', 'utilisateur_courriel', 'destinataire_id');
$info = array();
 
if(!isset($uid[1]) || !is_numeric($uid[1])) {
$info .= 'l\' identifiant doit être un entier ';
}
 
foreach($params_obligatoires as $param) {
if(!isset($params[$param]) || trim($params[$param]) == "") {
$info = 'le paramètre '.$param.' doit exister et ne peut pas être vide ';
}
}
 
if(!empty($info)) {
$this->envoyer($info, 'text/html', 'utf-8', false);
exit;
}
}
 
private function obtenirCourrielUtilisateurPourIdObs($id_obs) {
$rechercheObservation = new RechercheObservation($this->config);
return $rechercheObservation->obtenirCourrielUtilisateurPourIdObs($id_obs);
}
 
private function obtenirCourrielUtilisateurPourIdImage($id_image) {
$rechercheImage = new RechercheImage($this->config);
return $rechercheImage->obtenirCourrielUtilisateurPourIdImage($id_image);
}
}
?>
}
/trunk/jrest/services/InventoryImageCount.php
1,9 → 1,9
<?php
// declare(encoding='UTF-8');
/**
* Service recherche du nombre d'images à partir de divers critères.
*
* 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é
*
29,9 → 29,8
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
 
$criteres = $_GET;
$chercheurImages = new RechercheImage($this->config);
$retour = $chercheurImages->compterImages($uid[0], $criteres);
$retour = $chercheurImages->compterImages($uid[0], $_GET);
 
$retour_encode = json_encode($retour);
$retour_encode = $this->nettoyerCaracteresNuls($retour_encode);
/trunk/jrest/services/InventoryImageLink.php
37,7 → 37,8
}
// filtrage des entiers à partir des ids existant réellement en DB
$ids_images_filtrees = $this->filtrerImgUtilisateur($ids_images, $id_utilisateur);
$ids_observations_filtrees = $this->filtrerObsUtilisateur($ids_observations, $id_utilisateur);
$infos_observations_filtrees = $this->filtrerObsUtilisateur($ids_observations, $id_utilisateur);
$ids_observations_filtrees = self::extraireValeurs($infos_observations_filtrees, 'id_observation');
if (empty($ids_images_filtrees) || empty($ids_observations_filtrees)) {
die('err');
}
44,14 → 45,21
 
$values = array();
foreach ($ids_images_filtrees as $id_img) {
foreach ($ids_observations_filtrees as $id_obs) {
$values[] = "($id_img, $id_obs, NOW())";
foreach ($infos_observations_filtrees as $infos_obs) {
$id_obs = $infos_obs['id_observation'];
$dateTransmission = $infos_obs['date_transmission'];
$transmission = $infos_obs['transmission'];
$values[] = "($id_img, $id_obs, NOW(), $dateTransmission, $transmission)";
}
}
$clauseValues = implode(',', $values);
$requete = 'INSERT INTO cel_images (id_image, ce_observation, date_liaison) '.
$requete = 'INSERT INTO cel_images (id_image, ce_observation, date_liaison, date_transmission, transmission) '.
"VALUES $clauseValues ".
'ON DUPLICATE KEY UPDATE ce_observation = VALUES(ce_observation), date_liaison = NOW() '.
'ON DUPLICATE KEY UPDATE '.
' ce_observation = VALUES(ce_observation), '.
' date_liaison = NOW(), '.
' date_transmission = VALUES(date_tranmission), '.
' transmission = VALUES(tranmission) '.
' -- ' . __FILE__ . ':' . __LINE__;
$resultat = Cel::db()->executer($requete);
if ($resultat) {
122,8 → 130,8
die('err');
}
$ids_images_filtrees = $this->filtrerImgUtilisateur($ids_images, $id_utilisateur);
$ids_observations_filtrees = $this->filtrerObsUtilisateur($ids_observations, $id_utilisateur);
 
$infos_observations_filtrees = $this->filtrerObsUtilisateur($ids_observations, $id_utilisateur);
$ids_observations_filtrees = self::extraireValeurs($infos_observations_filtrees, 'id_observation');
if (empty($ids_images_filtrees) || empty($ids_observations_filtrees)) {
die('err');
}
131,14 → 139,11
$idsImgConcat = implode(',', $ids_images_filtrees);
$idsObsConcat = implode(',', $ids_observations_filtrees);
$requete = 'UPDATE cel_images '.
'SET ce_observation = NULL '.
'SET ce_observation = NULL, date_liaison = NULL, date_transmission = NULL, transmission = 0 '.
"WHERE id_image IN ($idsImgConcat) AND ce_observation IN ($idsObsConcat)".
' -- '.__FILE__.':'.__LINE__;
$resultats = Cel::db()->executer($requete);
if ($resultats) {
exit('OK');
}
die('err');
($resultats) ? exit('OK') : die('err');
}
 
private function filtrerImgUtilisateur($ids_images, $id_utilisateur) {
149,27 → 154,36
"AND ce_utilisateur = $id_utilisateur ".
' -- '.__FILE__.':'.__LINE__;
$resultats = Cel::db()->requeter($requete);
return array_map(array(__CLASS__, 'getRequeteVal'), $resultats);
return self::extraireValeurs($resultats, 'id_image');
}
 
private function filtrerObsUtilisateur($ids_observations, $id_utilisateur) {
$idsObsConcat = implode(',', $ids_observations);
$requete = 'SELECT id_observation '.
$requete = 'SELECT id_observation, transmission, date_transmission '.
'FROM cel_obs '.
"WHERE id_observation IN ($idsObsConcat) ".
"AND ce_utilisateur = $id_utilisateur ".
' -- '.__FILE__.':'.__LINE__;
$resultats = Cel::db()->requeter($requete);
return array_map(array(__CLASS__, 'getRequeteVal'), $resultats);
$valeurs = (is_array($resultats) && count($resultats) > 0) ? $resultats : array();
return $valeurs;
}
 
static function filterInt($str_liste) {
private static function filterInt($str_liste) {
return array_filter(array_map('intval', explode(',', $str_liste)));
}
 
// extrait la première valeur d'un tableau, utile pour renvoyer un tableau de simple valeur
// à partir d'une requête effectuée sur un seul champ.
static function getRequeteVal($arr) {
return array_shift($arr);
/**
* Extrait les valeurs d'un champ donné. Utile pour renvoyer un tableau de simples valeurs
* à partir des résultats d'une requête effectuée sur un seul champ.
*/
private static function extraireValeurs($resultats, $champNom) {
$valeurs = array();
if (is_array($resultats) && count($resultats) > 0) {
foreach ($resultats as $infos) {
$valeurs = $infos[$champNom];
}
}
return $valeurs;
}
}
/trunk/jrest/services/InventoryTransmit.php
17,28 → 17,83
*/
class InventoryTransmit extends Cel {
 
public function updateElement($uid, $pairs) {
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[1])) {
private $idUtilisateur = null;
private $ordres = null;
 
public function updateElement($ressources, $data) {
$this->verifierRessources($ressources);
$this->verifierData($data);
 
$transmission = intval($data['transmission']);
$date = ($transmission == 1) ? 'NOW()' : 'NULL';
 
$idsObsConcat = implode(',', $this->getIdsObs());
 
$requete = 'UPDATE cel_obs '.
"SET transmission = $transmission, date_transmission = $date, date_modification = NOW() ".
"WHERE id_observation IN ($idsObsConcat) ".
' -- '.__FILE__.':'.__LINE__;
$resultatObs = Cel::db()->executer($requete);
 
$requete = 'UPDATE cel_images '.
"SET transmission = $transmission, date_transmission = $date, date_modification = NOW() ".
"WHERE ce_observation IN ($idsObsConcat) ".
' -- '.__FILE__.':'.__LINE__;
$resultatImg = Cel::db()->executer($requete);
 
return ($resultatObs != 0 && $resultatImg != 0);
}
 
private function verifierRessources($ressources) {
if (!isset($ressources[0])) {
return false;
} else {
$this->controleUtilisateur($ressources[0]);
$this->idUtilisateur = $ressources[0];
}
$transmission = intval($pairs['transmission']);
if (!isset($ressources[1])) {
return false;
} else {
$this->ordres = $ressources[1];
}
}
 
private function verifierData($data) {
$transmission = (int) $data['transmission'];
if ($transmission != 0 && $transmission != 1) {
return false;
}
}
 
$ids = array_filter(array_map(create_function('$v','return intval($v);'), explode(',', $uid[1])), 'strlen');
private function getIdsObs() {
$idUtilisateurP = Cel::db()->proteger($this->idUtilisateur);
$ordres = $this->nettoyerOrdres();
$ordreConcat = implode(',', $ordres);
 
$date = ($transmission == 1) ? 'now()' : 'NULL';
//TODO: modification pour passer ceci dans la classe gestion observation
$requete = 'UPDATE cel_obs '.
'SET transmission = '.$pairs['transmission'].', '.
'date_modification = now(), date_transmission = '.$date.' '.
'WHERE ce_utilisateur = '.Cel::db()->proteger($uid[0]).' '.
'AND ordre in ('.implode(',', $ids).') '.
$requete = 'SELECT id_observation '.
'FROM cel_obs '.
"WHERE ce_utilisateur = $idUtilisateurP ".
"AND ordre IN ($ordreConcat) ".
' -- '.__FILE__.':'.__LINE__;
$resultat = Cel::db()->executer($requete);
return ($resultat != 0);
$resultats = Cel::db()->executer($requete);
 
$idsObs = array();
if ($idsObs && is_array($idsObs)) {
foreach ($resultats as $infos) {
$idsObs[] = $infos['id_observation'];
}
}
return $idsObs;
}
 
private function nettoyerOrdres() {
$ordres = explode(',', $this->ordres);
$ordresNettoyes = array();
foreach ($ordres as $ordre) {
if (preg_match('/^\d+$/', $ordre)) {
$ordresNettoyes[] = $ordre;
}
}
return $ordresNettoyes;
}
}
/trunk/jrest/services/CelImageFormat.php
1,12 → 1,28
<?php
// declare(encoding='UTF-8');
/**
* Service fournissant permettant de visualiser ou télécharger des images du CEL.
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Images
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CelImageFormat {
 
private $config;
private $formats = array('CRX2S','CRXS','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L','O');
const METHODE_TELECHARGEMENT = "telecharger";
const METHODE_AFFICHAGE = "afficher";
// Pas besoin d'étendre Cel ici, surtout que le constructeur
private $formats = array('CRX2S', 'CRXS', 'CXS', 'CS', 'CRS', 'XS', 'S', 'M', 'L', 'XL', 'X2L', 'X3L', 'O');
const METHODE_TELECHARGEMENT = 'telecharger';
const METHODE_AFFICHAGE = 'afficher';
 
// Pas besoin d'étendre Cel ici, surtout que le constructeur
// de la classe Cel instancie toujours une connexion à la bdd
// dont on a pas besoin ici. Ceci évite de planter le service
// quand la bdd est surchargée.
13,26 → 29,25
public function __construct($config) {
$this->config = $config;
}
 
public function getRessource() {
header('Content-Type: application/json');
echo json_encode($this->obtenirDescriptionService());
echo json_encode($this->obtenirDescriptionService());
}
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params) {
// suppression des 0 non significatifs à gauche
$id = ltrim($params[0],'0');
$format = isset($_GET['format']) ? $_GET['format'] : 'M';
$id = ltrim($params[0], '0');
$format = isset($_GET['format']) ? $_GET['format'] : 'M';
$methode_livraison = isset($_GET['methode']) ? $_GET['methode'] : self::METHODE_AFFICHAGE;
 
if($this->verifierParametres($id, $format, $methode_livraison)) {
$gestion_formats_images = new ImageRecreation($this->config);
$image_binaire = $gestion_formats_images->creerOuRenvoyerImage($params[0], $format);
 
if($image_binaire) {
$this->envoyerImage($id, $image_binaire, $format, $methode_livraison);
} else {
41,7 → 56,7
}
}
}
 
private function verifierParametres($id, $format, $methode_livraison) {
$ok = true;
$message = '';
49,17 → 64,17
$message .= "L'identifiant de format doit être un entier. ";
$ok = false;
}
 
if(!in_array($format, $this->formats)) {
$message .= "Le format d'image est inconnu, les formats acceptés sont ".implode(',', $this->formats).". ";
$ok = false;
}
 
$types_methode_livraison = array(self::METHODE_AFFICHAGE, self::METHODE_TELECHARGEMENT);
if (!in_array($methode_livraison, $types_methode_livraison)) {
$message .= "Le format de methode de livraison ".$methode_livraison." n'est pas acceptée par le service. ".
$types_methode_livraison = array(self::METHODE_AFFICHAGE, self::METHODE_TELECHARGEMENT);
if (!in_array($methode_livraison, $types_methode_livraison)) {
$message .= "Le format de methode de livraison ".$methode_livraison." n'est pas acceptée par le service. ".
" Seuls les methodes suivantes sont gérés : ".implode(',', $types_methode_livraison);
$ok = false;
$ok = false;
}
 
if(!empty($message)) {
66,84 → 81,82
header("HTTP/1.0 400 Bad Request");
echo $message;
}
 
return $ok;
}
 
private function envoyerImage($id, $image_binaire, $format, $methode) {
if($methode == self::METHODE_AFFICHAGE) {
header('Content-Type: image/jpeg');
} else {
$this->envoyerHeadersTelechargement($id, $image_binaire, $format);
if ($methode == self::METHODE_AFFICHAGE) {
header('Content-Type: image/jpeg');
} else {
$this->envoyerHeadersTelechargement($id, $image_binaire, $format);
}
 
echo $image_binaire;
exit;
exit();
}
 
private function envoyerHeadersTelechargement($id, $image_binaire, $format) {
if (function_exists('mb_strlen')) {
$taille = mb_strlen($image_binaire, '8bit');
} else {
$taille = strlen($image_binaire);
if (function_exists('mb_strlen')) {
$taille = mb_strlen($image_binaire, '8bit');
} else {
$taille = strlen($image_binaire);
}
// creation du format original
$id_avec_zeros = sprintf('%09s', $id) ;
$id_avec_zeros_underscores = wordwrap($id_avec_zeros, 3 , '_', true) ;
$nom_fichier = $id_avec_zeros_underscores.'_'.$format.'.jpg';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$nom_fichier.'"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: '.$taille);
 
// creation du format original
$id_avec_zeros = sprintf('%09s', $id) ;
$id_avec_zeros_underscores = wordwrap($id_avec_zeros, 3 , '_', true) ;
$nom_fichier = $id_avec_zeros_underscores.'_'.$format.'.jpg';
 
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$nom_fichier.'"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: '.$taille);
}
 
private function obtenirDescriptionService() {
$retour = array('description' => 'Ce service peut être appelé afin de visualiser ou bien télécharger les images du cel',
'formats' => $this->formats,
'utilisation' => "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']."/{id} où {id} est l'identifiant numérique de l'image désirée",
'parametres' => array("methode" => "Valeurs : afficher, telecharger. Permet de préciser si l'image doit être affichée ou téléchargée",
"format" => "Valeurs : voir la liste ci dessous. Permet de demander un format précis de l'image parmi ceux disponibles ")
);
// ^^ c'est marrant non ?
$format_formates = array();
foreach ($this->formats as $format) {
if($format == "O") {
$format_formates["O"] = array("hauteur" => "dépend de l'image originale",
"largeur" => "dépend de l'image originale",
"notes" => "Image dans son ratio et sa résolution originale (elle peut éventuellement avoir été compressée en qualité)"
);
} else {
$description = array();
if(strpos($format, 'R') !== false) {
$description[] = "Format carré, rogné pour ne garder que le centre de l'image.";
}
if(strpos($format, 'C') !== false) {
$description[] = "Format carré, si le format contient R, il est rogné, sinon des bandes blanches sont ajoutées pour conserver le ratio.";
}
if(empty($description)) {
$description[] = "Format standard, le ratio original de l'image est conservé";
}
$resolution = $this->config['cel']['format_'.$format];
$resolution = explode("_", $resolution);
$format_formates[$format] = array("hauteur" => $resolution[0],
"largeur" => $resolution[1],
"notes" => implode(' ', $description)
);
}
}
$retour = array('description' => 'Ce service peut être appelé afin de visualiser ou bien télécharger les images du cel',
'formats' => $this->formats,
'utilisation' => 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']."/{id} où {id} est l'identifiant numérique de l'image désirée",
'parametres' => array(
'methode' => "Valeurs : afficher, telecharger. Permet de préciser si l'image doit être affichée ou téléchargée",
'format' => "Valeurs : voir la liste ci dessous. Permet de demander un format précis de l'image parmi ceux disponibles ")
);
 
// ^^ c'est marrant non ?
$format_formates = array();
foreach ($this->formats as $format) {
if ($format == "O") {
$format_formates["O"] = array("hauteur" => "dépend de l'image originale",
"largeur" => "dépend de l'image originale",
"notes" => "Image dans son ratio et sa résolution originale (elle peut éventuellement avoir été compressée en qualité)"
);
} else {
$description = array();
if (strpos($format, 'R') !== false) {
$description[] = "Format carré, rogné pour ne garder que le centre de l'image.";
}
if (strpos($format, 'C') !== false) {
$description[] = "Format carré, si le format contient R, il est rogné, sinon des bandes blanches sont ajoutées pour conserver le ratio.";
}
 
if (empty($description)) {
$description[] = "Format standard, le ratio original de l'image est conservé";
}
 
$resolution = $this->config['cel']['format_'.$format];
$resolution = explode("_", $resolution);
$format_formates[$format] = array("hauteur" => $resolution[0],
"largeur" => $resolution[1],
"notes" => implode(' ', $description)
);
}
}
 
$retour['resolutions'] = $format_formates;
return $retour;
}
/trunk/jrest/services/ImportXLS.php
30,11 → 30,9
error_reporting(-1);
ini_set('html_errors', 0);
ini_set('xdebug.cli_color', 2);
date_default_timezone_set('Europe/Paris');
require_once 'lib/PHPExcel/Classes/PHPExcel.php';
require_once 'FormateurGroupeColonne.php';
 
date_default_timezone_set('Europe/Paris');
 
// nombre d'INSERT à cumuler par requête SQL
// (= nombre de lignes XLS à bufferiser)
//define('NB_LIRE_LIGNE_SIMUL', 30);
82,37 → 80,37
static function __anonyme_4(&$item, $key) { $item = self::quoteNonNull(trim($item)); }
 
static $ordre_BDD = Array(
"ce_utilisateur",
"prenom_utilisateur",
"nom_utilisateur",
"courriel_utilisateur",
"ordre",
"nom_sel",
"nom_sel_nn",
"nom_ret",
"nom_ret_nn",
"nt",
"famille",
"nom_referentiel",
"zone_geo",
"ce_zone_geo",
"date_observation",
"lieudit",
"station",
"milieu",
"mots_cles_texte",
"commentaire",
"transmission",
"date_creation",
"date_modification",
"date_transmission",
"latitude",
"longitude",
"altitude",
"abondance",
"certitude",
"phenologie",
"code_insee_calcule"
'ce_utilisateur',
'prenom_utilisateur',
'nom_utilisateur',
'courriel_utilisateur',
'ordre',
'nom_sel',
'nom_sel_nn',
'nom_ret',
'nom_ret_nn',
'nt',
'famille',
'nom_referentiel',
'zone_geo',
'ce_zone_geo',
'date_observation',
'lieudit',
'station',
'milieu',
'mots_cles_texte',
'commentaire',
'transmission',
'date_creation',
'date_modification',
'date_transmission',
'latitude',
'longitude',
'altitude',
'abondance',
'certitude',
'phenologie',
'code_insee_calcule'
);
 
// cf: initialiser_pdo_ordered_statements()
141,16 → 139,16
initialiser_colonnes_statiques() y merge les données d'identification utilisateur
*/
public $colonnes_statiques = array(
"ce_utilisateur" => NULL,
"prenom_utilisateur" => NULL,
"nom_utilisateur" => NULL,
"courriel_utilisateur" => NULL,
'ce_utilisateur' => NULL,
'prenom_utilisateur' => NULL,
'nom_utilisateur' => NULL,
'courriel_utilisateur' => NULL,
 
// fixes (fonction SQL)
// XXX future: mais pourraient varier dans le futur si la mise-à-jour
// d'observation est implémentée
"date_creation" => "now()",
"date_modification" => "now()",
'date_creation' => 'now()',
'date_modification' => 'now()',
);
 
public static $prefixe_colonnes_etendues = 'ext:';
165,11 → 163,7
// cache (pour traiterLocalisation() pour l'instant)
static $cache = Array('geo' => array());
 
function ImportXLS($config) {
parent::__construct($config);
}
 
function createElement($pairs) {
public function createElement($pairs) {
if (!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
exit('0');
}
507,25 → 501,33
}
 
static function stockerImages($enregistrements, $toutes_images, $ordre_ids) {
$idsImagesObs = array();
$valuesSql = array();
foreach ($toutes_images as $images_pour_obs) {
$obs = $enregistrements[$images_pour_obs['obs_pos']];
$id_obs = $ordre_ids[$obs['ordre']]; // id réel de l'observation correspondant à l'ordre
$transmission = $obs['transmission'];
$date_transmission = $obs['date_transmission'];
foreach ($images_pour_obs['images'] as $image) {
$idsImagesObs[] = sprintf('(%d,%d, NOW())', $image['id_image'], $id_obs);
$id_img = $image['id_image'];
$valuesSql[] = "($id_img, $id_obs, NOW(), $transmission, $date_transmission)";
}
}
 
if ($idsImagesObs) {
$clauseValues = implode(', ', $idsImagesObs);
// Utilisation de INSET pour faire des UPDATE multiples en une seule requête
$requete = 'INSERT INTO cel_images (id_image, ce_observation, date_liaison) '.
if ($valuesSql) {
$clauseValues = implode(', ', $valuesSql);
// Utilisation de INSERT pour faire des UPDATE multiples en une seule requête
$requete = 'INSERT INTO cel_images '.
'(id_image, ce_observation, date_liaison, transmission, date_transmission) '.
"VALUES $clauseValues ".
'ON DUPLICATE KEY UPDATE ce_observation = VALUES(ce_observation), date_liaison = NOW() '.
'ON DUPLICATE KEY UPDATE '.
'ce_observation = VALUES(ce_observation), '.
'date_liaison = NOW(), '.
'transmission = VALUES(transmission), '.
'date_transmission = VALUES(date_transmission) '.
' -- '.__FILE__.':'.__LINE__;
Cel::db()->requeter($requete);
Cel::db()->executer($requete);
}
return count($idsImagesObs);
return count($valuesSql);
}
 
/*
571,7 → 573,7
 
// Dans ce tableau, seules devraient apparaître les données variable pour chaque ligne.
// Dans ce tableau, l'ordre des clefs n'importe pas (cf: self::sortArrayByArray())
$enregistrement = Array(
$enregistrement = array(
"ordre" => $dernier_ordre,
 
"nom_sel" => $espece[C_NOM_SEL],
587,23 → 589,23
"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
 
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : NULL,
"date_observation" => isset($ligne[C_DATE_OBSERVATION]) ? self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ref_ligne) : null,
 
"lieudit" => isset($ligne[C_LIEUDIT]) ? trim($ligne[C_LIEUDIT]) : NULL,
"station" => isset($ligne[C_STATION]) ? trim($ligne[C_STATION]) : NULL,
"milieu" => isset($ligne[C_MILIEU]) ? trim($ligne[C_MILIEU]) : NULL,
"lieudit" => isset($ligne[C_LIEUDIT]) ? trim($ligne[C_LIEUDIT]) : null,
"station" => isset($ligne[C_STATION]) ? trim($ligne[C_STATION]) : null,
"milieu" => isset($ligne[C_MILIEU]) ? trim($ligne[C_MILIEU]) : null,
 
"mots_cles_texte" => NULL, // TODO: foreign-key
// XXX: @ contre "Undefined index"
"commentaire" => isset($ligne[C_COMMENTAIRE]) ? trim($ligne[C_COMMENTAIRE]) : NULL,
"commentaire" => isset($ligne[C_COMMENTAIRE]) ? trim($ligne[C_COMMENTAIRE]) : null,
 
"transmission" => $transmission,
"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
"date_transmission" => $transmission ? date('Y-m-d H:i:s') : null, // pas de fonction SQL dans un PDO statement, <=> now()
 
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : NULL,
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ref_ligne) : NULL,
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : NULL, // TODO: guess alt from lon/lat
"latitude" => isset($ligne[C_LATITUDE]) ? self::traiterLonLat(null, $ligne[C_LATITUDE], $referentiel, $ref_ligne) : null,
"longitude" => isset($ligne[C_LONGITUDE]) ? self::traiterLonLat($ligne[C_LONGITUDE], null, $referentiel, $ref_ligne) : null,
"altitude" => isset($ligne[C_ALTITUDE]) ? intval($ligne[C_ALTITUDE]) : null, // TODO: guess alt from lon/lat
 
// @ car potentiellement optionnelles ou toutes vides => pas d'index dans PHPExcel (tableau optimisé)
"abondance" => @$ligne[C_ABONDANCE],
1079,7 → 1081,7
);
}
 
// équivalent à Bdd2->proteger() (qui wrap PDO::quote),
// équivalent à Bdd->proteger() (qui wrap PDO::quote),
// sans transformer NULL en ""
static function quoteNonNull($chaine) {
if (is_null($chaine)) {
/trunk/jrest/services/CatalogueChampsEtendus.php
1,33 → 1,40
<?php
// declare(encoding='UTF-8');
/**
*
* Service fournissant la liste des groupes de champs etendus.
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Champs-étendus
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CatalogueChampsEtendus extends Cel {
 
// in utf8
// out utf8
 
// Fournit la liste des groupes de champs etendus
class CatalogueChampsEtendus extends Cel {
function getElement($uid){
public function getElement($ressources){
$referentiel = array();
// TODO : meilleure vérification si ce service vient à être utilisé par autre chose
// TODO : meilleure vérification si ce service vient à être utilisé par autre chose
// que le cel
if($uid[0] == "groupes") {
if ($ressources[0] == 'groupes') {
$gestion_champs_etendus = new GestionChampsEtendus($this->config, 'obs');
$referentiel = $gestion_champs_etendus->consulterGroupesChampsEtendusPredefinis();
} else if($uid[0] == "champs") {
} else if($ressources[0] == 'champs') {
$gestion_champs_etendus = new GestionChampsEtendus($this->config, 'obs');
$referentiel = $gestion_champs_etendus->consulterCatalogueChampsEtendusPredefinis();
}
$this->envoyerJson($referentiel);
return true;
}
function getRessource() {
 
public function getRessource() {
$groupes = $gestion_champs_etendus->consulterGroupesChampsEtendusPredefinis();
$this->envoyerJson($groupes);
return true;
}
/trunk/jrest/services/InventoryImport.php
17,22 → 17,16
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class InventoryImport extends Cel {
class InventoryImport extends Cel {
 
public function getElement($uid){
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
 
$id_session_temporaire = session_id();
$gestionnaireObs = new GestionObservation($this->config);
$migration_compte_a_compte = $gestionnaireObs->migrerObservations(session_id(), $uid[0]);
 
$gestionnaire_observation = new GestionObservation($this->config);
$migration_compte_a_compte = $gestionnaire_observation->migrerObservations($id_session_temporaire, $uid[0]);
 
$retour = false;
if($migration_compte_a_compte) {
$retour = 'OK';
}
 
$retour = ($migration_compte_a_compte) ? 'OK' : false;
echo $retour;
exit();
}
/trunk/jrest/services/CelImageDoublon.php
13,11 → 13,17
* 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
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Images
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class CelImageDoublon extends Cel {
 
67,7 → 73,6
* Carte par défaut
*/
private function getDoublonHtml($parametres) {
 
$widget = null;
$utilisateur_mail = Cel::getAuthIdentifiant();
$utilisateur_infos = new User($this->config);
88,13 → 93,13
*/
private function getImagesDoublon($utilisateur) {
$doublons = null;
 
if (isset($utilisateur)) {
// Un utilisateur en particulier
$requete = 'SELECT id_image, ordre, nom_original, md5 '.
'FROM cel_images '.
"WHERE ce_utilisateur = '$utilisateur' ";
 
$idUtilisateurP = Cel::db()->proteger($utilisateur);
$requete = 'SELECT id_image, ordre, nom_original, md5 '.
'FROM cel_images '.
"WHERE ce_utilisateur = $idUtilisateurP ".
' -- '.__FILE__.':'.__LINE__;
$images = Cel::db()->requeter($requete);
 
// Traitement
112,26 → 117,27
if (!isset($doublons[$img['md5']])) {
$id_img = $md5[$img['md5']]['img_id'];
$doublons[$img['md5']][$id_img] = $md5[$img['md5']];
$images_doublons_id[] = Cel::db()->quote($id_img);
$images_doublons_id[] = Cel::db()->proteger($id_img);
}
 
$doublons[$img['md5']][$img['id_image']] = array(
'url' => $this->getUrlImage($img['id_image'], 'CXS'),
'obs_ordre' => array(),
'img_ordre' => $img['ordre'],
'img_id' => $img['id_image']);
'url' => $this->getUrlImage($img['id_image'], 'CXS'),
'obs_ordre' => array(),
'img_ordre' => $img['ordre'],
'img_id' => $img['id_image']);
$images_doublons_id[] = Cel::db()->quote($img['id_image']);
}
}
 
if (count($images_doublons_id) > 0) {
$requete = 'SELECT cim.id_image, nom_original, md5, co.ordre AS ordre_obs '.
'FROM cel_images AS cim '.
' LEFT JOIN cel_obs AS co '.
' ON (cim.ce_observation = co.id_observation) '.
"WHERE cim.ce_utilisateur = '$utilisateur' ".
' AND cim.id_image IN ('.implode(',', $images_doublons_id).')';
 
$idsImgConcat = implode(',', $images_doublons_id);
$requete = 'SELECT cim.id_image, nom_original, md5, co.ordre AS ordre_obs '.
'FROM cel_images AS cim '.
' LEFT JOIN cel_obs AS co '.
' ON (cim.ce_observation = co.id_observation) '.
"WHERE cim.ce_utilisateur = $idUtilisateurP ".
"AND cim.id_image IN ($idsImgConcat) ".
' -- '.__FILE__.':'.__LINE__;
$infos = Cel::db()->requeter($requete);
 
foreach ($infos as $info) {
141,7 → 147,6
}
}
}
 
return $doublons;
}
}
/trunk/jrest/bibliotheque/Bdd2.php
File deleted
\ No newline at end of file
/trunk/jrest/bibliotheque/Bdd.php
New file
0,0 → 1,142
<?php
// declare(encoding='UTF-8');
/**
* Classe de gestion de la base de données.
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Bibliothèques
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Bdd extends PDO {
 
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 function __construct($config, $base = 'database_cel') {
$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
parent::__construct($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ée)
parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'La connexion à la base de donnée via PDO a échoué : ' .$dsn . "\n". $e->getMessage();
}
}
 
/**
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'.
* Puis execute la requete.
* @see protegerRequete()
* @param unknown_type $requete
*/
public function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
return $this->executerRequete($requete, $retour, $mode);
}
 
/**
* Execute la requete retournant une seule ligne de résultat.
* @param String $requete
*/
public function requeterLigne($requete, $mode = PDO::FETCH_ASSOC) {
return $this->executerRequete($requete, self::SQL_RETOUR_LIGNE, $mode);
}
 
/**
* Execute la requete retournant une seule colone de résultat.
* @param String $requete
*/
public function requeterValeurUnique($requete, $mode = PDO::FETCH_ASSOC) {
return $this->executerRequete($requete, self::SQL_RETOUR_COLONNE, $mode);
}
 
public function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) {
$resultat = false;
try {
switch ($retour) {
case self::SQL_RETOUR_COMPLET :
$resultat = $this->query($requete)->fetchAll($mode);// Retourne toutes les lignes
break;
case self::SQL_RETOUR_LIGNE :
$resultat = $this->query($requete)->fetch($mode);// Retourne la première ligne
break;
case self::SQL_RETOUR_COLONNE :
$resultat = $this->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne
break;
case self::SQL_RETOUR_BRUT :
$resultat = $this->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) {
$msgTpl = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s";
$this->debug[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
return $resultat;
}
 
/**
* Execute la requete retournant l'objet brut de résultat pour l'utiliser dans un foreach.
* @param String $requete
*/
public function requeterBrut($requete) {
return $this->executerRequete($requete, self::SQL_RETOUR_BRUT);
}
 
public function executer($requete) {
try {
$resultat = $this->exec($requete);
if ($resultat === false) {
$this->debug[] = "La requête a échoué : $requete";
}
} catch (PDOException $e) {
$message = "Fichier : {$e->getFile()} \nLigne : {$e->getLine()} \nMessage : {$e->getMessage()} \nRequête : $requete";
$code = E_USER_ERROR;
throw new Exception($message, $code);
}
return $resultat;
}
 
public function proteger($donnees) {
if (is_array($donnees)) {
$retour = $this->protegerTableau($donnees);
} else {
$retour = $this->quote($donnees);
}
return $retour;
}
 
private function protegerTableau(Array $tableau) {
foreach ($tableau as $id => $val) {
if (is_array($val)) {
$tableau[$id] = $this->protegerTableau($val);
} else {
$tableau[$id] = $this->proteger($val);
}
}
return $tableau;
}
 
public function obtenirDernierId() {
return $this->lastInsertId();
}
}
Property changes:
Added: svn:mergeinfo
Merged /branches/v1.7-croissant/jrest/lib/Bdd2.php:r1855,1879-1880,1885-1886,1917,1923,1983
Merged /branches/v2.0-elagueuse/jrest/lib/Bdd2.php:r2099-2100
Merged /branches/topic-dbsingleton/jrest/lib/Bdd2.php:r1720-1764
Merged /branches/v1.8-debroussailleuse/jrest/lib/Bdd2.php:r1981,1987,1992
/trunk/jrest/bibliotheque/Cel.php
16,8 → 16,6
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
// TODO : il faudrait déplacer les méthodes des sections de cette classe dans des classes séparées chargées via un Conteneur.
require_once('Bdd2.php');
 
abstract class Cel {
const ARRET_SERVICE = false;
 
25,12 → 23,12
const TYPE_IMG = 'image';
 
// TODO: delete wrappers
const SQL_MODE_ASSOC = Bdd2::SQL_MODE_ASSOC;
const SQL_MODE_OBJET = Bdd2::SQL_MODE_OBJET;
const SQL_RETOUR_COMPLET = Bdd2::SQL_RETOUR_COMPLET;
const SQL_RETOUR_LIGNE = Bdd2::SQL_RETOUR_LIGNE;
const SQL_RETOUR_COLONNE = Bdd2::SQL_RETOUR_COLONNE;
const SQL_RETOUR_BRUT = Bdd2::SQL_RETOUR_BRUT;
const SQL_MODE_ASSOC = Bdd::SQL_MODE_ASSOC;
const SQL_MODE_OBJET = Bdd::SQL_MODE_OBJET;
const SQL_RETOUR_COMPLET = Bdd::SQL_RETOUR_COMPLET;
const SQL_RETOUR_LIGNE = Bdd::SQL_RETOUR_LIGNE;
const SQL_RETOUR_COLONNE = Bdd::SQL_RETOUR_COLONNE;
const SQL_RETOUR_BRUT = Bdd::SQL_RETOUR_BRUT;
 
public $config;
private $ressources;
58,7 → 56,7
 
// Connection à la base de données
if (self::$bdd === null) { // singleton à l'arrache
self::$bdd = new Bdd2($this->config, 'database_cel');
self::$bdd = new Bdd($this->config, 'database_cel');
}
 
// Nettoyage du _GET (sécurité)
72,7 → 70,7
 
//+----------------------------------------------------------------------------------------------------------------+
protected function connecterPDO($config, $base = 'database_cel') {
return new Bdd2($config, $base);
return new Bdd($config, $base);
}
 
public static function db() {
/trunk/jrest/bibliotheque/FormateurGroupeColonne.php
1,19 → 1,27
<?php
 
// declare(encoding='UTF-8');
/**
* @category PHP
* @package jrest
* @author Raphaël Droz <raphael@tela-botania.org>
* @copyright 2013 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
*/
define('SEPARATEUR_IMAGES', " / ");
define('PREFIX_CHAMPS_ETENDUS', "ext:");
* Classe métier de mise en forme des groupes de colonnes pour les exports.
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Bibliothèques
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Raphaël Droz <raphael@tela-botania.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
define('SEPARATEUR_IMAGES', ' / ');
define('PREFIX_CHAMPS_ETENDUS', 'ext:');
// utilisé par formaterUrlUser() [ nécessaire pour le widget d'export)
define('USER_BASEURL', 'http://www.tela-botanica.org/profil:%d');
 
Class FormateurGroupeColonne {
class FormateurGroupeColonne {
 
// cache pour les données des fonctions
static $cache = Array();
33,62 → 41,61
// les données baseflor à récupérer: colonnes présentes dans cel_references
// et intitulés associés
static $baseflor_col = array(
"ve_lumiere" => "Lumière",
"ve_temperature" => "Température",
"ve_continentalite" => "Continentalité",
"ve_humidite_atmos" => "Humidité Atmosphérique",
"ve_humidite_edaph" => "Humidité",
"ve_reaction_sol" => "Réaction (pH)",
"ve_nutriments_sol" => "Nutriments",
"ve_salinite" => "Salinité",
"ve_texture_sol" => "Texture" ,
"ve_mat_org_sol" => "Matière Organique",
"catminat_code" => "Code Catminat",
"syntaxon" => "Syntaxon",
've_lumiere' => 'Lumière',
've_temperature' => 'Température',
've_continentalite' => 'Continentalité',
've_humidite_atmos' => 'Humidité Atmosphérique',
've_humidite_edaph' => 'Humidité',
've_reaction_sol' => 'Réaction (pH)',
've_nutriments_sol' => 'Nutriments',
've_salinite' => 'Salinité',
've_texture_sol' => 'Texture' ,
've_mat_org_sol' => 'Matière Organique',
'catminat_code' => 'Code Catminat',
'syntaxon' => 'Syntaxon',
);
 
// TODO: dirty, ordre des champs étendus... souhaité pour florilèges:
static $ordre_champ_etendus_Florileges = array(
"personneStructure",
"personneService",
"personneFonction",
"adresse",
"latitudeDebutRue",
"longitudeDebutRue",
"latitudeFinRue",
"longitudeFinRue",
"typoUrbaine",
"revetementSol",
"presenceZoneVegetalise",
"hauteurBatimentAvoisinant",
"intensiteGestion",
"periodiciteTraitementPhyto",
"dateArretTraitementPhyto",
"itineraireGestion",
"dateDerniereIntervention",
"hauteurPlante",
"resistanceTraitementPhyto",
"vitesseCroissance",
"perceptionTechnicien",
"perceptionRiverainMauvaise",
'personneStructure',
'personneService',
'personneFonction',
'adresse',
'latitudeDebutRue',
'longitudeDebutRue',
'latitudeFinRue',
'longitudeFinRue',
'typoUrbaine',
'revetementSol',
'presenceZoneVegetalise',
'hauteurBatimentAvoisinant',
'intensiteGestion',
'periodiciteTraitementPhyto',
'dateArretTraitementPhyto',
'itineraireGestion',
'dateDerniereIntervention',
'hauteurPlante',
'resistanceTraitementPhyto',
'vitesseCroissance',
'perceptionTechnicien',
'perceptionRiverainMauvaise',
);
 
static function colGroupsValidation($groupe_de_champs = 'standard,avance') {
if(! $groupe_de_champs) return FALSE;
if(is_string($groupe_de_champs)) {
if (! $groupe_de_champs) return FALSE;
if (is_string($groupe_de_champs)) {
$groupe_de_champs = array_flip(explode(',', $groupe_de_champs));
}
elseif(is_array($groupe_de_champs)) {
} elseif(is_array($groupe_de_champs)) {
$groupe_de_champs = array_flip($groupe_de_champs);
} else {
return null;
}
else {
return NULL;
$groupe_de_champs = array_intersect_key(array_flip(self::$fieldGroups), $groupe_de_champs);
if (!$groupe_de_champs) {
return false;
}
$groupe_de_champs = array_intersect_key(array_flip(self::$fieldGroups),
$groupe_de_champs);
if(!$groupe_de_champs) return FALSE;
// toujours ajouter standard
$groupe_de_champs['standard'] = TRUE;
$groupe_de_champs['standard'] = true;
return implode(',', array_keys($groupe_de_champs));
}
 
104,26 → 111,25
* Si la colonne n'utilise pas de fonction de récupération particulière
* (ie: si le champ exportés [ou importé] correspond exactement au champ dans la base de donnée)
* Alors 'abbrev' doit avoir la même valeur que le nom de la colonne dans la table mysql `cel_obs`.
*
*/
static function nomEnsembleVersListeColonnes($groupe_de_champs = 'standard') {
if(! $groupe_de_champs) $groupe_de_champs = 'standard';
if(is_string($groupe_de_champs)) {
if (! $groupe_de_champs) {
$groupe_de_champs = 'standard';
}
if (is_string($groupe_de_champs)) {
$groupe_de_champs = array_flip(explode(',', $groupe_de_champs));
}
elseif(is_array($groupe_de_champs)) {
} elseif(is_array($groupe_de_champs)) {
$groupe_de_champs = array_flip($groupe_de_champs);
} else {
return null;
}
else {
return NULL;
$groupe_de_champs = array_intersect_key(array_flip(self::$fieldGroups), $groupe_de_champs);
if (!$groupe_de_champs) {
return null;
}
$groupe_de_champs = array_intersect_key(array_flip(self::$fieldGroups),
$groupe_de_champs);
if(!$groupe_de_champs) return NULL;
 
$colonnes = Array();
 
if(isset($groupe_de_champs['standard'])) {
$colonnes = array();
if (isset($groupe_de_champs['standard'])) {
$colonnes += Array(
'nom_sel' => self::GenColInfo(Array('abbrev' => 'nom_sel',
'nom' => 'Espèce')),
249,11 → 255,12
'extra' => 1,
'fonction_data' => 'getNomCommun_v3'),
'importable' => FALSE), */
'nom-commun' => self::GenColInfo(Array('abbrev' => 'nom-commun',
'nom' => 'Nom Commun',
'extra' => 1,
'fonction_data' => NULL /* cas particu 'getNomCommun_v4' */,
'preload' => array(__CLASS__, 'getNomCommun_preload')))
'nom-commun' => self::GenColInfo(array(
'abbrev' => 'nom-commun',
'nom' => 'Nom Commun',
'extra' => 1,
'fonction_data' => null /* cas particu 'getNomCommun_v4' */,
'preload' => array(__CLASS__, 'getNomCommun_preload')))
);
}
 
260,44 → 267,48
if(isset($groupe_de_champs['baseflor'])) {
$colonnes += array(
// champ dynamique
'baseflor' => self::GenColInfo(Array('abbrev' => 'baseflor',
'nom' => '',
'extra' => 1,
'importable' => FALSE,
'preload' => array(__CLASS__, 'baseflor_preload'),
'dyna' => array(__CLASS__, 'baseflor_ligne'))),
'baseflor' => self::GenColInfo(array(
'abbrev' => 'baseflor',
'nom' => '',
'extra' => 1,
'importable' => false,
'preload' => array(__CLASS__, 'baseflor_preload'),
'dyna' => array(__CLASS__, 'baseflor_ligne'))),
);
}
 
if(isset($groupe_de_champs['etendu'])) {
if (isset($groupe_de_champs['etendu'])) {
$colonnes += array(
// champ dynamique
'etendu' => self::GenColInfo(Array('abbrev' => 'etendu',
'nom' => '',
'extra' => 1,
'importable' => FALSE,
'preload' => array(__CLASS__, 'champsEtendus_preload'),
'dyna' => array(__CLASS__, 'champsEtendus_ligne'))),
'etendu' => self::GenColInfo(array(
'abbrev' => 'etendu',
'nom' => '',
'extra' => 1,
'importable' => false,
'preload' => array(__CLASS__, 'champsEtendus_preload'),
'dyna' => array(__CLASS__, 'champsEtendus_ligne'))),
);
}
 
if(isset($groupe_de_champs['auteur'])) {
if (isset($groupe_de_champs['auteur'])) {
$colonnes += array(
'observateur' => self::GenColInfo(Array('abbrev' => 'observateur',
'nom' => 'Observateur',
'extra' => 1,
'fonction_data' => 'formaterUrlUser',
'importable' => FALSE)),
'observateur' => self::GenColInfo(array(
'abbrev' => 'observateur',
'nom' => 'Observateur',
'extra' => 1,
'fonction_data' => 'formaterUrlUser',
'importable' => false)),
);
}
 
return $colonnes;
}
 
static function preload($colonnes, $cel, $ids) {
$result = array();
foreach($colonnes as $abbrev => $colonne) {
if(!$colonne['preload']) continue;
foreach ($colonnes as $abbrev => $colonne) {
if (!$colonne['preload']) {
continue;
}
$result[$abbrev] = call_user_func($colonne['preload'], $cel, $ids);
}
return $result;
316,45 → 327,46
$ligne_formatee = array();
foreach($colonnes as $abbrev => $colonne) {
$valeur = null;
if($colonne['extra'] == 2 || ! is_null($colonne['dyna'])) continue;
if ($colonne['extra'] == 2 || ! is_null($colonne['dyna'])) {
continue;
}
 
// valeur directe depuis cel_obs ?
if(isset($obs[$abbrev])) $valeur = $obs[$abbrev];
if (isset($obs[$abbrev])) {
$valeur = $obs[$abbrev];
}
 
// pré-processeur des champs
if(function_exists($colonne['fonction'])) {
if (function_exists($colonne['fonction'])) {
$valeur = $colonne['fonction']($valeur);
} elseif(method_exists(__CLASS__, $colonne['fonction'])) {
} else if(method_exists(__CLASS__, $colonne['fonction'])) {
$valeur = call_user_func(array(__CLASS__, $colonne['fonction']), $valeur);
} elseif($colonne['fonction']) {
} else if($colonne['fonction']) {
die("méthode {$colonne['fonction']} introuvable");
}
// fonction pour obtenir des champs (étendus)
elseif(function_exists($colonne['fonction_data'])) {
} else if(function_exists($colonne['fonction_data'])) {// fonction pour obtenir des champs (étendus)
$valeur = $colonne['fonction_data']($obs);
}
elseif(method_exists(__CLASS__, $colonne['fonction_data'])) {
} else if(method_exists(__CLASS__, $colonne['fonction_data'])) {
$valeur = call_user_func(array(__CLASS__, $colonne['fonction_data']), $obs);
}
 
// // cette section devrait être vide:
// // cas particuliers ingérable avec l'architecture actuelle:
if(false && $abbrev == 'date_observation' && $valeur == "0000-00-00") {
if (false && $abbrev == 'date_observation' && $valeur == '0000-00-00') {
/* blah */
}
// ici à cause du passage de $cel ($this->utilisateur)
if($abbrev == 'images') {
if ($abbrev == 'images') {
$valeur = FormateurGroupeColonne::getImages($obs, $cel->id_utilisateur);
}
if($abbrev == 'nom-commun') {
if ($abbrev == 'nom-commun') {
$valeur = FormateurGroupeColonne::getNomCommun_v4($obs);
}
 
if($valeur == null) {
$valeur = "";
if ($valeur == null) {
$valeur = '';
}
 
// // fin de section "cas particuliers"
// fin de section "cas particuliers"
$ligne_formatee[] = $valeur;
}
 
361,12 → 373,11
// uniquement les champs dynamiques
foreach($colonnes as $abbrev => $colonne) {
$valeur = null;
if(is_null($colonne['dyna'])) continue;
// XXX: PHP-5.3
call_user_func_array($colonne['dyna'],
array($obs, &$ligne_formatee));
if (is_null($colonne['dyna'])) {
continue;
}
call_user_func_array($colonne['dyna'], array($obs, &$ligne_formatee));
}
 
return $ligne_formatee;
}
 
409,14 → 420,15
* La fonction doit prendre comme arguments ($obs, &$ligne_formatee)
*/
static function GenColInfo($args) {
$default = Array('abbrev' => NULL,
'nom' => NULL,
'extra' => 0,
'fonction' => NULL,
'fonction_data' => NULL,
'importable' => TRUE,
'preload' => NULL,
'dyna' => NULL);
$default = array(
'abbrev' => null,
'nom' => null,
'extra' => 0,
'fonction' => null,
'fonction_data' => null,
'importable' => true,
'preload' => null,
'dyna' => null);
$ret = array_intersect_key($args, $default);
return array_merge($default, $ret);
}
423,7 → 435,9
 
static function formaterDate($date_heure_mysql) {
//return "";
if (!$date_heure_mysql || $date_heure_mysql == "0000-00-00 00:00:00") return NULL;
if (!$date_heure_mysql || $date_heure_mysql == "0000-00-00 00:00:00") {
return null;
}
// malheureusement pas disponible en php < 5.3
//$date_format = DateTime::createFromFormat("Y-m-d H:i:s", $date_heure_mysql);
$val = explode(' ', $date_heure_mysql);
430,13 → 444,17
$date = explode('-', $val[0]);
$heure = explode(':', $val[1]);
$timestamp = mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]);
if(!$timestamp) return NULL;
if (!$timestamp) {
return null;
}
// TODO: les widgets ne font malheureusement pas usage de l'heure dans le CEL
// TODO: si modification, ne pas oublier de modifier le format d'import correspondant
// dans ImportXLS, traiterDateObs() (actuellement: "Y/m/d" car utilisation de strtotime() qui ne lit pas tout)
// $date_formatee = strftime('%d/%m/%Y', $timestamp);
$date_formatee = strftime('%Y/%m/%d', $timestamp);
if(!$date_formatee) return "00/00/0000";
if (!$date_formatee) {
return '00/00/0000';
}
return $date_formatee;
}
 
443,14 → 461,14
static function formaterUrlUser($obs) {
$is_id = is_numeric($obs['ce_utilisateur']);
return sprintf("%s %s <%s>%s",
$obs['prenom_utilisateur'],
$obs['nom_utilisateur'],
preg_replace(';@.*;', '@...', $obs['courriel_utilisateur']),
$is_id ? sprintf(' (' . USER_BASEURL . ')', $obs['ce_utilisateur']) : '');
$obs['prenom_utilisateur'],
$obs['nom_utilisateur'],
preg_replace(';@.*;', '@...', $obs['courriel_utilisateur']),
$is_id ? sprintf(' (' . USER_BASEURL . ')', $obs['ce_utilisateur']) : '');
}
 
static function getImages_preload($cel, $obsids) {
if(!$obsids) return;
if (!$obsids) return;
$rec = Cel::db()->requeter(
sprintf("SELECT o.id_observation, GROUP_CONCAT(nom_original ORDER BY nom_original ASC SEPARATOR '%s') AS i " .
"FROM cel_images i LEFT JOIN cel_obs o ON (i.ce_observation = o.id_observation) " .
459,10 → 477,10
SEPARATEUR_IMAGES,
$cel->id_utilisateur,
implode(',', $obsids)));
foreach($rec as $v) {
foreach ($rec as $v) {
self::$cache['getImages'][$v['id_observation']] = $v['i'];
}
return NULL;
return null;
}
 
static function getImages($obs, $id_utilisateur) {
504,7 → 522,6
return preg_match('/^INSEE-C:[0-9]{5}/',$code_a_tester);
}
 
 
// TODO: référentiel ne devrait pas être généré au moment d'un Config::get,
// comme dans Config::get('nomsVernaRechercheLimiteeTpl')
// Par exemple, la variable pour "nva" ?
853,5 → 870,4
}
return $ordered + $array;
}
 
}
}
/trunk/jrest/bibliotheque/GestionImage.php
146,6 → 146,20
return ($resultat !== false);
}
 
public function modifierTransmissionParObs($idsObs, $publier) {
$ids_obs_proteges = Cel::db()->proteger($idsObs);
$idsObsConcat = is_array($ids_obs_proteges) ? implode(', ', $ids_obs_proteges) : $ids_obs_proteges;
$etatTransmission = $publier ? 1 : 0;
$dateTransmission = $publier ? 'NOW()' : 'NULL';
 
$requete = "UPDATE cel_images ".
"SET transmission = $etatTransmission, date_transmission = $dateTransmission ".
"WHERE ce_observation IN ($idsObsConcat) ".
' -- ' . __FILE__ . ':' . __LINE__;
$resultat = Cel::db()->executer($requete);
return $resultat;
}
 
/**
* Assemble la requete de mise à jour des champs de metadonnées
*