/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; |
} |
} |