Subversion Repositories eFlore/Applications.coel

Compare Revisions

Regard whitespace Rev 1704 → Rev 1706

/trunk/jrest/services/CoelStructure.php
1,14 → 1,12
<?php
/**
* Service fournissant la liste des structures et leurs informations.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @Copyright (c) 2009, 2013 Tela Botanica (accueil@tela-botanica.org)
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelStructure extends Coel {
 
16,11 → 14,12
'cs_nbre_personne',
'csc_mark_formation', 'csc_mark_formation_interet',
/*'csc_mark_collection_commune',*/ 'csc_mark_acces_controle', 'csc_mark_restauration', 'csc_mark_traitement',
'csc_mark_acquisition_collection', 'csc_mark_acquisition_echantillon'
'csc_mark_acquisition_collection', 'csc_mark_acquisition_echantillon',
'cs_latitude', 'cs_longitude',
);
 
// ATTENTION : tjrs garder la table principale en premier, puis mettre les tables spécialisées.
protected $tables = array( 120 => array(
static $tables = array( 120 => array(
'nom' => 'coel_structure',
'prefixe' => 'cs',
'id' => array('cs_id_structure')),
138,14 → 137,13
* Si un des paramêtres est abscent, il prendre la valeur *
*/
public function getElementParZoneGeo($param) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('type', 'projets'), $param);
if (!isset($p['type'])) {
$this->messages[] = "Il est obligatoire d'indiquer type de recherche pour utiliser ce service.";
} else {
return array();
}
 
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '.
159,20 → 157,23
' SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '.
' SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'id ASC').' ';
 
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else {
return array();
}
 
$info = array();
foreach ($donnees as $donnee) {
$info[$donnee['id']] = $donnee['nbre'];
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
return $info;
}
 
198,18 → 199,11
return;
}
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
if( (! @$params['cs_latitude'] || ! @$params['cs_longitude']) &&
(@$params['cs_adresse_01'] || @$params['cs_code_postal'] || @$params['cs_ville']) ) {
$lonlat = array();
if(Coel::coordGuess(Coel::addrReStruct($params), $lonlat)) {
$params['cs_latitude'] = $lonlat['lat'];
$params['cs_longitude'] = $lonlat['lon'];
}
}
$form_needs_refresh = self::callNominatim($params);
 
self::NULLifNotNum($params, self::$optional_bool_fields);
 
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
reset($tables_a_modifier);
 
275,16 → 269,7
return;
}
try {
$form_needs_refresh = FALSE;
if( (! @$params['cs_latitude'] || ! @$params['cs_longitude']) &&
(@$params['cs_adresse_01'] || @$params['cs_code_postal'] || @$params['cs_ville']) ) {
$lonlat = array();
if(Coel::coordGuess(Coel::addrReStruct($params), $lonlat)) {
$params['cs_latitude'] = $lonlat['lat'];
$params['cs_longitude'] = $lonlat['lon'];
$form_needs_refresh = TRUE;
}
}
$form_needs_refresh = self::callNominatim($params);
 
self::NULLifNotNum($params, self::$optional_bool_fields);
 
319,29 → 304,42
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de structure ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
$this->envoyer();
return;
}
 
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Contrôle du non détournement de l'utilisateur
if (! $this->etreAutorise($id_utilisateur)) {
$this->envoyer();
return;
}
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des id passés par l'url
$identifiants = explode(',', rtrim($uid[1], ','));
try {
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
$this->envoyer();
return;
}
try {
foreach ($identifiants as $id_structure) {
// Vérification que la structure ne possède pas de collections liées
if ($this->verifierPresenceCollection($id_structure) === false) {
if (self::verifierPresenceCollection($this->bdd, $id_structure)) {
$this->messages[] = "La structure '$id_structure' ne peut pas être supprimée car elle possède des collections liées.";
continue;
}
 
$params = array('cs_id_structure' => $id_structure, 'csc_id_structure' => $id_structure, 'csv_id_structure' => $id_structure);
$tables_a_modifier = $this->recupererTablesAModifier($params);
foreach ($tables_a_modifier as $table_id => $table) {
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
if (! $this->avoirEnregistrement($table)) continue;
 
if ($this->supprimer($table) === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
348,40 → 346,38
}
}
}
} else {
$this->messages[] = "La structure '$id_structure' ne peut pas être supprimée car elle possède des collections liées.";
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
private function verifierPresenceCollection($id_structure) {
$requete = 'SELECT COUNT(cc_id_collection) AS nbre_collection '.
'FROM coel_collection '.
"WHERE cc_ce_structure = '$id_structure' ".
'GROUP BY cc_ce_structure ';
static function verifierPresenceCollection($db, $id_structure) {
// Vérification que la structure ne possède pas de collections liées
$nbre_collection = $this->bdd->query($requete)->fetchColumn();
return ($db->query(sprintf(
'SELECT COUNT(cc_id_collection) AS nbre_collection FROM coel_collection ' .
' WHERE cc_ce_structure = %d GROUP BY cc_ce_structure ',
$id_structure))->fetchColumn() != 0);
}
$presence = false;
if ($nbre_collection != 0) {
$presence = true;
static function callNominatim(&$params) {
if ( (! @$params['cs_latitude'] || ! @$params['cs_longitude']) &&
(@$params['cs_adresse_01'] || @$params['cs_code_postal'] || @$params['cs_ville']) ) {
$lonlat = array();
if(Coel::coordGuess(Coel::addrReStruct($params), $lonlat)) {
$params['cs_latitude'] = $lonlat['lat'];
$params['cs_longitude'] = $lonlat['lon'];
$form_needs_refresh = TRUE;
}
return $presence;
}
return FALSE;
}
private function ajouterGuid($abr_projet, $id_structure) {
if ($id_structure !== false) {
$table_guid = $this->tables[120];
$table_guid = self::$tables[120];
$table_guid['champs_valeurs_id']['cs_id_structure'] = $id_structure;
$table_guid['champs_valeurs_protege']['cs_guid'] = $this->bdd->quote(sprintf($this->config['coel']['guid'], $abr_projet, 'str'.$id_structure));
$this->modifier($table_guid);
388,4 → 384,3
}
}
}
?>