Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1913 → Rev 1914

/branches/v1.7-croissant/jrest/services/InventoryTransmit.php
1,67 → 1,42
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/*
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author David Delon <david.delon@clapas.net>
* @copyright 2010, 2013 Tela-Botanica
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
*/
 
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
*
* in : utf8
* out : utf8
*
*
* Transmission observation vers Tela
*/
class InventoryTransmit extends Cel {
 
function updateElement($uid,$pairs) {
function updateElement($uid, $pairs) {
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[1])) return false;
 
//TODO: modification pour passer ceci dans la classe gestion observation
if (isset($uid[1]) && $this->estUneSuiteIdentifiantsObservation($uid[1])) {
$requete_transmission = 'UPDATE cel_obs '.
'SET transmission = '.$pairs['transmission'].','.
'date_modification = now(), date_transmission = now() '.
'WHERE ce_utilisateur = '.Cel::db()->proteger($uid[0]).' AND ordre in ('.$uid[1].')';
}
$transmission = intval($pairs['transmission']);
if($transmission != 0 && $transmission != 1) return false;
 
$resultat_transmission = Cel::db()->executer($requete_transmission);
if ($resultat_transmission === false) {
return false;
}
return true;
$ids = array_filter(array_map(create_function('$v','return intval($v);'),
explode(',', $uid[1])));
if(!$ids) return FALSE;
 
$resultat_transmission = Cel::db()->executer(
sprintf('UPDATE cel_obs SET'.
// mise à jour de la valeur de transmission (peut-être ?)
' transmission = %1$d,'.
 
// date_transmission n'est réactualisé que si nécessaire, c'est à dire si le statut de "transmission" actuel n'est
// pas à 1 et que le nouveau statut est à 1. Autrement il est mis (ou reste) à NULL
' date_transmission = IF(transmission != 1 AND %1$s = 1, now(), NULL),'.
 
// idem pour date_modification qui n'est mise à now() que si l'on passe une observation
// de non-transmise à tranmise ou de transmise à non-transmise
' date_modification = IF(transmission != %1$d, now(), date_modification)'.
 
' WHERE ce_utilisateur = %2$s AND ordre in (%3$s)',
$transmission,
Cel::db()->proteger($uid[0]),
implode(',', $ids)));
return ($resultat_transmission != 0);
}
private function estUneSuiteIdentifiantsObservation($chaine) {
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
// sans virgule terminale
$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
return preg_match($reg_exp, $chaine);
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*/
?>
/branches/v1.7-croissant/jrest/services/InventoryKeyWordList.php
42,27 → 42,69
// Controle detournement utilisateur
$id_utilisateur = $uid[1] ;
$this->controleUtilisateur($uid[1]);
$this->setChampsEtTablePourSuffixe($uid[0]);
$requete = 'SELECT mot_cle, id_mot_cle'.$this->suffixe_champ.', ce_mot_cle'.$this->suffixe_champ.'_parent '.
'FROM cel_mots_cles'.$this->suffixe_table.' '.
'WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' '.
'ORDER BY niveau ';
$resultats_mots_cles = Cel::db()->requeter($requete);
if (is_array($resultats_mots_cles)) {
$mots_cles = array();
foreach($resultats_mots_cles as $mot_cle) {
$mots_cles[] = $mot_cle;
}
$this->envoyerJson($mots_cles);
return true;
$this->envoyerJson(self::getMotsClefs($uid[1], $uid[0]));
return TRUE; // compat: pourquoi renvoyer true si vide ?
}
 
 
static function getMotsClefs($uid, $type) {
if($type == 'obs') {
return Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
' FROM cel_mots_cles_obs'.
' WHERE id_utilisateur = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid)));
}
 
if($type == 'images') {
return Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
' FROM cel_mots_cles_images'.
' WHERE id_utilisateur = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid)));
}
/* pour extraire un mot-clef en particulier (bien que getMotsClefId() soit plus adapté:
array_walk($ret,
create_function('&$val, $k, $keyword',
'if($val["mot_cle"] != $keyword) $val = NULL;' .
'else $val = $val["id_mot_cle_obs"];'),
'XXX');
$obsKeywordIdToDetach = array_filter($ret);
$obsKeywordIdToDetach = array_pop($obsKeywordIdToDetach); */
 
return array();
}
 
 
static function getMotsClefId($uid, $type, $keyword) {
if($type == 'obs') {
$ret = Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
' FROM cel_mots_cles_obs'.
' WHERE id_utilisateur = %s'.
' AND mot_cle = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid),
Cel::db()->proteger($keyword) ));
}
 
if($type == 'images') {
$ret = Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
' FROM cel_mots_cles_images'.
' WHERE id_utilisateur = %s'.
' AND mot_cle = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid),
Cel::db()->proteger($keyword) ));
}
return @$ret[0]['id_mot_cle_obs'];
}
 
public function updateElement($uid, $pairs) {
$id_utilisateur = $uid[1];
$this->controleUtilisateur($uid[1]);
90,7 → 132,7
}
} else if ($action == 'deplacement') {
$this->commencerTransaction();
self::commencerTransaction();
$transaction_reussie_1 = true;
$id_pere = $pairs['parent'];
129,10 → 171,10
if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false &&
$transaction_reussie_3 !== false && $transaction_reussie_4 !== false &&
$transaction_reussie_5 !== false && $transaction_reussie_6 !== false) {
$this->completerTransaction();
self::completerTransaction();
return true;
} else {
$this->annulerTransaction();
self::annulerTransaction();
return false;
}
}
154,8 → 196,6
 
$this->ajouterMotCleRacine($id_utilisateur);
 
$this->commencerTransaction();
 
$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
$borne_pere = $bornes['bd'];
$niveau = $bornes['niveau'] + 1;
162,6 → 202,9
$bg = $bornes['bd'];
$bd = $bg + 1;
 
if(!$borne_pere) return false;
 
self::commencerTransaction();
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
$requete = 'INSERT INTO cel_mots_cles'.$this->suffixe_table.' '.
178,11 → 221,18
$transaction_reussie_2 = Cel::db()->executer($requete);
 
if ($transaction_reussie_1 && $transaction_reussie_2) {
$this->completerTransaction();
return true;
// on sort de self::createElement ==> JRest::(get|post) ==> JRest->created() qui fait header().
// or si nous dépassons ini_get(output_buffering) nous ne pouvons plus réécrire le code de retour
// HTTP, de plus, si ini_get(output_buffering) == off, nous enverrions un warning.
// d'où ce clone de JRest::created();
header('HTTP/1.0 201 Created');
self::completerTransaction();
exit;
} else {
$this->annulerTransaction();
return false;
// cf ci-dessus: JRest::badRequest
header('HTTP/1.0 400 Bad Request');
self::annulerTransaction();
exit;
}
return true;
}
197,7 → 247,7
$tableau_ids_mots_cles[] = $id_mot_cle;
 
$this->controleUtilisateur($id_utilisateur);
$this->commencerTransaction();
self::commencerTransaction();
 
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
if($bornes) {
223,9 → 273,9
$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false) {
$this->completerTransaction();
self::completerTransaction();
} else {
$this->annulerTransaction();
self::annulerTransaction();
}
}
// Suppression des liaisons associées à ce mot clé
276,27 → 326,21
/**
* Désactive l'auto-commit puis débute la transaction
*/
private function commencerTransaction() {
static function commencerTransaction() {
// Désactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 0 ';
$reussite_autocommit = Cel::db()->executer($requete);
 
$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 0");
// Débute une nouvelle transaction
$requete = 'BEGIN ';
$reussite_begin = Cel::db()->executer($requete);
$reussite_begin = Cel::db()->executer("BEGIN");
}
 
/**
* Termine la transaction puis réactive l'auto-commit
*/
private function completerTransaction() {
static function completerTransaction() {
// Complète la transaction
$requete = 'COMMIT ';
$reussite_commit = Cel::db()->executer($requete);
 
$reussite_commit = Cel::db()->executer("COMMIT");
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = Cel::db()->executer($requete);
$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
 
echo 'OK';
}
304,14 → 348,11
/**
* Annule la transaction et réactive l'auto-commit
*/
private function annulerTransaction() {
static function annulerTransaction() {
// Annule la transaction
$requete = 'ROLLBACK ';
$reussite_rollback = Cel::db()->executer($requete);
 
$reussite_rollback = Cel::db()->executer("ROLLBACK");
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = Cel::db()->executer($requete);
$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
 
echo 'ERROR';
}
/branches/v1.7-croissant/jrest/services/ImportXLS.php
482,6 → 482,9
C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
self::traiterEspece($ligne, $espece, $referentiel, $cel);
 
if(!$espece[C_NOM_SEL]) $referentiel = Cel::$fallback_referentiel;
if($espece[C_NOM_SEL] && !$espece[C_NOM_SEL_NN]) $referentiel = Cel::$fallback_referentiel;
 
// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
self::traiterLocalisation($ligne, $localisation);
636,7 → 639,7
if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
 
if($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) {
trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel inconnu", E_USER_NOTICE);
trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel \"{$referentiel}\" inconnu", E_USER_NOTICE);
return 'autre';
}
 
688,7 → 691,14
pour des questions de performances
*/
static function traiterEspece($ligne, Array &$espece, &$referentiel, $cel) {
if(empty($ligne[C_NOM_SEL])) return;
if(empty($ligne[C_NOM_SEL])) {
// TODO: nous ne déclarons pas "Numéro nomenclatural" comme colonne importable
// Nous ne pouvons donc pas tenter d'être sympa sur la détermination par num_nom
/* if(!empty($ligne[C_NOM_SEL_NN]) && $referentiel != Cel::$fallback_referentiel)
$ligne[C_NOM_SEL] = $referentiel . ':nn:' . $ligne[C_NOM_SEL_NN];
else */
return;
}
 
// nom_sel reste toujours celui de l'utilisateur
$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
/branches/v1.7-croissant/jrest/services/CelWidgetUploadImageTemp.php
New file
0,0 → 1,130
<?php
// declare(encoding='UTF-8');
/**
* Service permettant d'enregistrer dans le répertoire temporaire les images envoyées depuis le widget Saisie
*
* Cas d'utilisation :
* POST /CelWidgetUploadImageTemp : écriture d'une image dans le répertoire temporaire
*
* @author Mathias Chouet <mathias@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright © 2013, Tela-Botanica
*/
class CelWidgetUploadImageTemp extends Cel {
 
protected $projet = '';
 
public function createElement($donnees) {
$image = array_shift($donnees); // dangereux!
if (isset($_GET['projet'])) {
$this->projet = $_GET['projet'];
}
$retour = $this->enregistrerImageTemporaire($image);
return $this->formaterRetourAvecSquelette($retour);
}
 
private function formaterRetourAvecSquelette($retour) {
$codeRetour = 'tralala pouet pouet'; // tant que non vide, considère que c'est un succès !
if (is_array($retour)) {
$squelette = 'services/squelettes/image_temp.tpl.xml';
$contenu = $this->traiterSquelettePhp($squelette, $retour);
$mime = 'text/xml';
} else {
$contenu = 'Un problème est survenu : '.print_r($retour['message'], true);
$codeRetour = false;
}
$this->envoyer($contenu, $mime);
return $codeRetour;
}
 
// enregistre l'image envoyée dans le chemin de stockage temporaire, puis
// renvoie le XML attendu par le widget de saisie du CEL
public function enregistrerImageTemporaire($image) {
$retour = array(
'urlMiniature' => '',
'imageNom' => '',
'message' => '',
'debogage' => '');
$message = '';
$debogage = '';
if ($image['error'] == UPLOAD_ERR_OK) {
if (is_uploaded_file($image['tmp_name'])) {
if ($this->verifierFormatJpeg($image['tmp_name'])) {
$dossierStockage = $this->config['cel']['chemin_stockage_temp'];
 
$nomFichierOriginal = preg_replace('/[.](jpeg|jpg)$/i', '.jpg', strtolower($image['name']));
$originalChemin = $dossierStockage.'/'.$nomFichierOriginal;
$deplacementOk = move_uploaded_file($image['tmp_name'], $originalChemin);
 
if ($deplacementOk === true) {
$miniatureFichier = str_replace('.jpg', '_min.jpg', $nomFichierOriginal);
$miniatureChemin = $dossierStockage.'/'.$miniatureFichier;
 
// Parametres
$largeurIdeale = 100;
$hauteurIdeale = 100;
$qualite = 85;
 
// Calcul de la hauteur et de la largeur optimale de la miniature
$taillesImgOriginale = getimagesize($originalChemin);
$largeurOrigine = $taillesImgOriginale[0];
$hauteurOrigine = $taillesImgOriginale[1];
 
$largeurMin = $largeurIdeale;
$hauteurMin = (int) ($hauteurOrigine * ($largeurIdeale / $largeurOrigine));
if ($hauteurMin > $hauteurIdeale) {
$hauteurMin = $hauteurIdeale;
$largeurMin = (int)($largeurOrigine * ($hauteurMin / $hauteurOrigine));
}
 
// Création de la miniature
$imageOriginale = imagecreatefromjpeg($originalChemin);
$imageMiniature = imagecreatetruecolor($largeurMin, $hauteurMin);
$couleurFond = imagecolorallocate($imageMiniature, 255, 255, 255);
imagefill($imageMiniature, 0, 0, $couleurFond);
imagecopyresized($imageMiniature, $imageOriginale, 0, 0, 0, 0, $largeurMin, $hauteurMin, $largeurOrigine, $hauteurOrigine);
imagejpeg($imageMiniature, $miniatureChemin, $qualite);
imagedestroy($imageMiniature);
imagedestroy($imageOriginale);
 
// Retour des infos
$retour['urlMiniature'] = sprintf($this->config['cel']['images_temp_url'], $miniatureFichier);
$retour['imageNom'] = $nomFichierOriginal;
} else {
$message = "L'image n'a pu être déplacé sur le serveur.";
}
} else {
$message = "L'image n'est pas au format JPEG.";
}
} else {
$message = "L'image n'a pu être téléversée.";
$debogage = $message.print_r($image, true);
}
} else {
if ($image['error'] == UPLOAD_ERR_FORM_SIZE) {
$message = "L'image téléversée excède la taille maximum autorisée.".
"Veuillez modifier votre image avant de la téléverser à nouveau.";
} else {
$message = "Une erreur de transfert a eu lieu (téléversement interrompu).";
}
$debogage = "Code erreur : {$image['error']}. ".
"Voir : http://php.net/manual/fr/features.file-upload.errors.php";
}
// Retour des infos
$retour['message'] = $message;
$retour['debogage'] = $debogage;
return $retour;
}
 
// Il ne faut pas utiliser l'index type du tableau files pour tester
// si une image est en jpeg car le type renvoyé par les navigateurs
// peut varier (ex. sous ie qui renvoie image/pjpeg
private function verifierFormatJpeg($chemin) {
// get imagesize renvoie un résultat consistant par contre
$infos = getimagesize($chemin, $infos);
return (isset($infos['mime']) && $infos['mime'] == 'image/jpeg');
}
}
?>
/branches/v1.7-croissant/jrest/services/InventoryObservationList.php
1,36 → 1,30
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* InventoryObservationList.php
*
* in=utf8
* out=utf8
*
* Cas d'utilisation :
* 1: Service recherche d'observations a partir de divers critères
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service renvoie la liste des observations correspondantes
*
* 2: Service modification en masse d'observations
* a: Le service recherche les observations correspondant aux identifiants donnés
* b: Le service modifie les observations correspondantes avec les infos données en paramètres
*
* 3: Service de suppression d'observations en masse
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service supprime la liste des observations correspondantes
*/
* PHP Version 5.2
*
* @category PHP
* @package jrest
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010, 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>
* @link /doc/jrest/
*
* InventoryObservationList.php
* Cas d'utilisation :
* 1: Service recherche d'observations a partir de divers critères
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service renvoie la liste des observations correspondantes
*
* 2: Service modification en masse d'observations
* a: Le service recherche les observations correspondant aux identifiants donnés
* b: Le service modifie les observations correspondantes avec les infos données en paramètres
*
* 3: Service de suppression d'observations en masse
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service supprime la liste des observations correspondantes
*/
class InventoryObservationList extends Cel {
/**
83,13 → 77,32
//TODO: envoyer un message d'erreur
return;
}
$uid[1] = rtrim($uid[1],',');
 
$obs = array_filter(array_map('intval', explode(',', $uid[1])));
if(count($obs) == 0) {
return;
}
$gestionnaire_observation = new GestionObservation($this->config);
$modification_observation = $gestionnaire_observation->modifierObservation($uid[0],$uid[1],$pairs);
return true;
if(count($obs) == 1) {
return $gestionnaire_observation->modifierObservation($uid[0], $obs[0], $pairs);
}
 
// cas de mise à jour de multiples observations:
$ret = GestionObservation::modifierMultiplesObservation($uid[0], $obs, $pairs);
if($ret === FALSE) return FALSE; // JRest::badRequest();
if($ret === 0) {
header('HTTP/1.0 304 Not Modified');
die;
}
 
header('HTTP/1.0 200 OK'); // et non pas une 201 !
// die(); // non, car incompatible avec PHPUnit
// throw(new Exception()); // non, lance une 400 (cf JRest::updateElement())
// return TRUE; // non, lance une 201
// return FALSE; // non, lance une 400
 
die; // tant pis
}
 
/**
/branches/v1.7-croissant/jrest/services/squelettes/image_temp.tpl.xml
New file
0,0 → 1,7
<?='<?xml version="1.0" encoding="UTF-8"?>'."\n";?>
<root>
<miniature-url><?=$urlMiniature?></miniature-url>
<image-nom><?=$imageNom?></image-nom>
<message><?=$message?></message>
<debogage><?=$debogage?></debogage>
</root>
/branches/v1.7-croissant/jrest/services/CelWidgetMapPoint.php
249,7 → 249,7
if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
$ne = $this->decomposerLatLng($this->parametres['ne']);
$sw = $this->decomposerLatLng($this->parametres['sw']);
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree(&$points, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom);
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($points, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom);
} else {
$marqueurs['points'] = $points;
}
/branches/v1.7-croissant/jrest/services/InventoryKeyWordImageLink.php
1,26 → 1,19
<?php
// declare(encoding='UTF-8');
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* in : utf8
* out : utf8
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @author Raphaël Droz <raphael@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
*
* Service de liaisons de mots clés à des images.
* Le service lie une ou plusieurs mots clés à une ou plusieurs images
*
*/
*/
 
require_once('InventoryKeyWordObsLink.php');
 
class InventoryKeyWordImageLink extends Cel {
public function getElement($uid) {
36,46 → 29,24
return;
}
$pairs['images'] = rtrim($pairs['images'],',');
$id_images = explode(',',$pairs['images']);
$id_images = array_filter(explode(',', $pairs['images']));
$mots_cles = array_filter(explode(',', $pairs['mots_cles']));
$pairs['mots_cles'] = rtrim($pairs['mots_cles'],',');
$mots_cles = explode(',',$pairs['mots_cles']);
// Pour le moment on ne peut que supprimer les mots clés et ajouter les nouveaux à cause du fonctionnement
// de l'arbre de mots clés des images
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'images');
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerToutesLiaisonsPourIdImageOuObs($pairs['ce_utilisateur'], $id_images);
$liaison_mot_cle = $gestionnaire_mots_cles->ajouterLiaisonMotsCles($pairs['ce_utilisateur'],$id_images, $mots_cles);
return $liaison_mot_cle;
return $gestionnaire_mots_cles->ajouterLiaisonMotsCles($pairs['ce_utilisateur'],$id_images, $mots_cles);
}
 
public function deleteElement($uid){
$retour = false;
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) {
return;
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || ! InventoryKeyWordObsLink::estUnIdentifiantMotCle($uid[2])) {
return FALSE;
}
$id_images = explode(',',$uid[1]);
$id_utilisateur = $uid[0];
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'images');
$mots_cles = $gestionnaire_mots_cles->nettoyerMotsCles($uid[2]);
$mots_cles = explode(',',$mots_cles);
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $id_images, $mots_cles);
 
return $suppression_liaison_mot_cle;
return InventoryKeyWordObsLink::unlinkKeyword($this->config, 'images', explode(',',$uid[1]), $uid[0], $uid[2]);
}
 
private function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
}
?>
/branches/v1.7-croissant/jrest/services/InventoryKeyWordObsLink.php
1,31 → 1,18
<?php
// declare(encoding='UTF-8');
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* in : utf8
* out : utf8
*
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
*
* Service de liaisons de mots clés à des observations.
* Le service lie une ou plusieurs mots clés à une ou plusieurs observations
*
*/
*/
 
class InventoryKeyWordObsLink extends Cel {
public function getElement($uid) {
public function getElement($uid) { }
}
public function createElement($pairs) {
// Controle detournement utilisateur
45,30 → 32,25
}
 
public function deleteElement($uid){
$retour = false;
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) {
return;
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || ! self::estUnIdentifiantMotCle($uid[2])) {
return FALSE;
}
return self::unlinkKeyword($this->config, 'obs', explode(',',$uid[1]), $uid[0], $uid[2]);
}
 
static function unlinkKeyword($config, $type /* = obs|images */, Array $obsIds, $uid, $keywordIds /* comma-separated string */) {
if($type != 'obs' && $type != 'images') return FALSE;
$ids_obs = explode(',',$uid[1]);
$id_utilisateur = $uid[0];
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'obs');
$mots_cles = $gestionnaire_mots_cles->nettoyerMotsCles($uid[2]);
$mots_cles = explode(',',$mots_cles);
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_obs, $mots_cles);
$gestionnaire_mots_cles = new LiaisonMotsCles($config, $type);
$mots_cles = explode(',', LiaisonMotsCles::nettoyerMotsCles($keywordIds));
return $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($uid, $obsIds, $mots_cles);
}
 
return $suppression_liaison_mot_cle;
static function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
 
private function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
}
?>
/branches/v1.7-croissant/jrest/services/CelImageDoublon.php
69,7 → 69,7
private function getDoublonHtml($parametres) {
$widget = null;
$utilisateur_mail = $this->getAuthIdentifiant();
$utilisateur_mail = Cel::getAuthIdentifiant();
$utilisateur_infos = new User($this->config);
$utilisateur = $utilisateur_infos->obtenirUtilisateurSiExiste($utilisateur_mail);
$utilisateur = $utilisateur['id_utilisateur'];
/branches/v1.7-croissant/jrest/services/CelValidationObservation.php
1,59 → 1,137
<?php
/**
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @author Raphaël Droz <raphael@tela-botania.org>
* @copyright 2013 Tela-Botanica
* @license Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
*
*/
class CelValidationObservation extends Cel {
/**
* Méthode appelée avec une requête de type POST avec un identifiant d'obs.
* Modifie le taxon associé à une observation avec les informations envoyées
* Utilisé par:
* - del/services/modules/0.1/determinations/ValiderDetermination.php::modifierObservationParDetermination()
*
* @param int $uid[0] identifiant observation
* @param pairs array tableau contenant les valeurs à modifier
* @param pairs['obsKeywordDelete'] optional string: mot-clef à délier à cette observation
*/
public function updateElement($uid,$pairs)
{
public function updateElement($uid, $pairs) {
// ce service est uniquement destiné à être appelé en local,
// depuis le serveur lui même
// en particulier par l'application identiplante
$this->controleAppelIpAutorisee();
$this->verifierParametresObligatoires($uid, $pairs);
self::verifierParametresObligatoires($uid, $pairs);
$id = $uid[0];
 
$gestion_observation = new GestionObservation($this->config);
$pairs = array_map('trim', $pairs);
$utilisateur = $pairs['ce_utilisateur'];
unset($pairs['ce_utilisateur']);
unset($pairs['ce_utilisateur'], $pairs['id_observation']);
 
// mise à jour des mots-clefs suite à une validation:
// typiquement, DEL modifierObservationParDetermination()
// nous enverra obsKeywordDelete=aDeterminer en plus de certitude=Certaine
$obsKeywordDelete = @trim($pairs['obsKeywordDelete']);
// $imgKeywordDelete = @trim($pairs['imgKeywordDelete']);
unset($pairs['obsKeywordDelete']); // , $pairs['imgKeywordDelete']);
 
// complete les données de la proposition validée car:
// 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
// 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
// 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
$more_data = CelTaxonNomFrom::NN2($this->bdd, @$pairs['nom_sel_nn'], @$pairs['nom_referentiel']);
if($more_data) $pairs = array_merge($pairs, $more_data);
 
$modification = $gestion_observation->modifierObservationPublique($utilisateur, $id, $pairs);
if($modification !== false) {
$resultat = 'ok';
$this->envoyer($resultat);
exit;
} else {
$info = array();
$info = 'Impossible de modifier l\'observation associée à cet identifiant ';
$this->envoyer($info, 'text/html', 'utf-8', false);
exit;
if($modification) {
// quel impact de ces valeurs de retour ?
if($kid = InventoryKeyWordList::getMotsClefId($utilisateur, 'obs', $obsKeywordDelete))
InventoryKeyWordObsLink::unlinkKeyword($this->config, 'obs', explode(',', $id), $utilisateur, $kid);
/* if($kid = InventoryKeyWordList::getMotsClefId($utilisateur, 'images', $imgKeywordDelete))
InventoryKeyWordObsLink::unlinkKeyword($this->config, 'obs', explode(',', $id), $utilisateur, $kid); */
header("Content-Type: text/plain; charset=utf-8");
die("OK"); // attention, compatibilité avec ValiderDetermination.php de DEL !
}
// cf TODO: n'arrivera pas tant que l'UPDATE ajoutera systématiquement date_modification = now()
elseif($modification === 0) {
header("HTTP/1.0 304 Not Modified"); // XXX: PHP 5.4 // http_response_code(304); // Not Modified
header("Content-Type: text/plain; charset=utf-8");
die("Not Modified");
}
else {
header("HTTP/1.0 500 Internal Server Error"); // XXX: PHP: 5.4 // http_response_code(500); // Internal Server Error
header("Content-Type: text/plain; charset=utf-8");
die("Impossible de modifier l'observation associée à cet identifiant " . mysql_error());
}
}
private function verifierParametresObligatoires($uid ,$params) {
$params_obligatoires = array('id_observation',
'ce_utilisateur',
'nom_sel');
$info = array();
if(!isset($uid[0]) || !is_numeric($uid[0])) {
$info .= 'l\' identifiant doit être un entier ';
static function verifierParametresObligatoires($uid, $params) {
if(!@intval($uid[0]) || !@intval($params['id_observation'])) {
header("Content-Type: text/plain; charset=utf-8");
die("L'identifiant d'observation doit être un entier");
}
 
// TODO: check sur 'id_observation' en tant que param est superflu ?
// TODO: avec l'apparition de CelTaxonNomFrom, "nom_sel" devrait être optionnel
// puisque nous regénérons des données valides avant l'update et puisque
// seul un nom_sel_nn *valide* a pu nous provenir depuis une validation de proposition de la part de DEL.
$params_obligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');
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(@trim($params[$param])) continue;
header("HTTP/1.0 412 Precondition Failed"); // XXX: PHP: 5.4 // http_response_code(412); // Precondition Failed
header("Content-Type: text/plain; charset=utf-8");
die(sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $params_obligatoires)));
}
if(!empty($info)) {
$this->envoyer($info, 'text/html', 'utf-8', false);
exit;
}
}
}
?>
 
// pour les modifications touchants aux nom_sel(nn)/nom_ret(nn)/...
// les clefs du tableau (= les aliases de champs) correspondent aux champs attendus
// par tb_cel.cel_obs afin de pouvoir array_merger() et passer le résultat à modifierObservationPublique()
class CelTaxonNomFrom {
const db = 'tb_eflore';
const bdtfx = 'bdtfx_v2_00';
const bdtxa = 'bdtxa_v1_01';
const isfan = 'isfan_v2013';
 
// get from num_nom(_sel)
static function NN($db, $id, $ref) {
if(!$db || !$id || !$ref) return FALSE;
return $db->query(sprintf("SELECT num_nom_retenu AS nom_ret_nn, num_taxon AS nt, CONCAT(nom_sci, ' ', auteur) AS nom_sel".
" FROM cel_references".
" WHERE referentiel = %s AND num_nom = %d", $db->quote($ref), intval($id)))->fetch(PDO::FETCH_ASSOC);
}
 
// get from num_nom(_sel) directement via la DB
// ce qui nous permet l'initialisation des champs non-présents dans cel_references
// cf TODO
static function NN2($db, $id, $ref) {
if(!$db || !$id || !$ref) return FALSE;
switch($ref) {
case "bdtfx":
return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtfx, self::db, self::bdtfx, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
case "bdtxa":
return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel". // subtilité: "num_tax"
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtxa, self::db, self::bdtxa, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
case "isfan":
return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::isfan, self::db, self::isfan, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
}
return FALSE;
}
}