/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/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/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/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/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/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/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/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/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/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/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/bibliotheque/Bdd2.php |
---|
File deleted |
\ No newline at end of file |
/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 |
* |
/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; |
} |
} |
} |