1,37 → 1,36 |
<?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 { |
|
static $optional_bool_fields = array( |
'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' |
); |
static $optional_bool_fields = array( |
'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', |
'cs_latitude', 'cs_longitude', |
); |
|
// ATTENTION : tjrs garder la table principale en premier, puis mettre les tables spécialisées. |
protected $tables = array( 120 => array( |
'nom' => 'coel_structure', |
'prefixe' => 'cs', |
'id' => array('cs_id_structure')), |
122 => array( |
'nom' => 'coel_structure_conservation', |
'prefixe' => 'csc', |
'id' => array('csc_id_structure')), |
123 => array( |
'nom' => 'coel_structure_valorisation', |
'prefixe' => 'csv', |
'id' => array('csv_id_structure'))); |
static $tables = array( 120 => array( |
'nom' => 'coel_structure', |
'prefixe' => 'cs', |
'id' => array('cs_id_structure')), |
122 => array( |
'nom' => 'coel_structure_conservation', |
'prefixe' => 'csc', |
'id' => array('csc_id_structure')), |
123 => array( |
'nom' => 'coel_structure_valorisation', |
'prefixe' => 'csv', |
'id' => array('csv_id_structure'))); |
|
/** |
* Méthode principale appelée avec une requête de type GET. |
72,34 → 71,34 |
// Initialisation des variables |
$info = array(); |
|
$whereClause = array(); |
if(isset($p['id_projet'])) $whereClause[] = "cs_ce_projet = {$p['id_projet']}"; |
if(isset($p['id_structure'])) $whereClause[] = "cs_id_structure = {$p['id_structure']}"; |
$whereClause = array(); |
if(isset($p['id_projet'])) $whereClause[] = "cs_ce_projet = {$p['id_projet']}"; |
if(isset($p['id_structure'])) $whereClause[] = "cs_id_structure = {$p['id_structure']}"; |
|
if(isset($p['recherche'])) { |
if(@$this->searchCity && trim($this->searchCity) == true) { |
$whereClause[] = "(" . implode(" OR ", array("cs_nom LIKE {$p['recherche']}", "cs_ville LIKE {$p['recherche']}")) . ")"; |
} else { |
$whereClause[] = "cs_nom LIKE {$p['recherche']}"; |
} |
} |
if(isset($p['recherche'])) { |
if(@$this->searchCity && trim($this->searchCity) == true) { |
$whereClause[] = "(" . implode(" OR ", array("cs_nom LIKE {$p['recherche']}", "cs_ville LIKE {$p['recherche']}")) . ")"; |
} else { |
$whereClause[] = "cs_nom LIKE {$p['recherche']}"; |
} |
} |
|
// Construction de la requête |
$requete = sprintf( |
'SELECT SQL_CALC_FOUND_ROWS %s cs.*, csc.*, csv.*, cmhl_date_modification, cmhl_notes, cmhl_source, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip ' |
. ' FROM coel_structure AS cs ' |
. ' LEFT JOIN coel_meta_historique_ligne ON (cs_ce_meta = cmhl_id_historique_ligne) ' |
. ' LEFT JOIN coel_structure_conservation AS csc ON (cs_id_structure = csc_id_structure) ' |
. ' LEFT JOIN coel_structure_valorisation AS csv ON (cs_id_structure = csv_id_structure) ' |
. ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d', |
'SELECT SQL_CALC_FOUND_ROWS %s cs.*, csc.*, csv.*, cmhl_date_modification, cmhl_notes, cmhl_source, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip ' |
. ' FROM coel_structure AS cs ' |
. ' LEFT JOIN coel_meta_historique_ligne ON (cs_ce_meta = cmhl_id_historique_ligne) ' |
. ' LEFT JOIN coel_structure_conservation AS csc ON (cs_id_structure = csc_id_structure) ' |
. ' LEFT JOIN coel_structure_valorisation AS csv ON (cs_id_structure = csv_id_structure) ' |
. ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d', |
|
$this->distinct ? 'DISTINCT' : '', |
$whereClause ? implode(" AND ", $whereClause) : TRUE, |
is_null($this->orderby) ? 'cs.cs_nom ASC' : $this->orderby, |
$this->start, $this->limit, |
__FILE__, __LINE__); |
$this->distinct ? 'DISTINCT' : '', |
$whereClause ? implode(" AND ", $whereClause) : TRUE, |
is_null($this->orderby) ? 'cs.cs_nom ASC' : $this->orderby, |
$this->start, $this->limit, |
__FILE__, __LINE__); |
|
// Récupération des résultats |
// Récupération des résultats |
try { |
// SPÉCIAL : |
// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet |
108,17 → 107,17 |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
|
// l'UI java n'aime pas les NULL |
if(!is_array($donnees)) { |
// $donnees est un objet PHP |
array_walk($donnees, create_function('&$val', '$val = is_null($val) ? "" : $val;')); |
} |
else { |
// $donnees est un tableau d'objets PHP |
foreach($donnees as &$structure) { |
array_walk($structure, create_function('&$val', '$val = is_null($val) ? "" : $val;')); |
} |
} |
// l'UI java n'aime pas les NULL |
if(!is_array($donnees)) { |
// $donnees est un objet PHP |
array_walk($donnees, create_function('&$val', '$val = is_null($val) ? "" : $val;')); |
} |
else { |
// $donnees est un tableau d'objets PHP |
foreach($donnees as &$structure) { |
array_walk($structure, create_function('&$val', '$val = is_null($val) ? "" : $val;')); |
} |
} |
|
$elements_nbre = $this->bdd->query("SELECT FOUND_ROWS() AS c")->fetch(PDO::FETCH_ASSOC); |
$info['nbElements'] = intval($elements_nbre['c']); |
138,52 → 137,54 |
* 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 { |
// Construction de la requête |
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '. |
' IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '. |
' SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '. |
' SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) AS id, '. |
' COUNT( cs_id_structure ) AS nbre '. |
'FROM coel_structure '. |
'WHERE cs_ce_truk_pays = 2654 '. |
(isset($p['projets']) ? " AND cs_ce_projet IN ({$p['projets']}) " : ''). |
'GROUP BY IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '. |
' 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); |
if ($donnees === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} else { |
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 array(); |
} |
return $info; |
} |
|
// Construction de la requête |
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '. |
' IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '. |
' SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '. |
' SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) AS id, '. |
' COUNT( cs_id_structure ) AS nbre '. |
'FROM coel_structure '. |
'WHERE cs_ce_truk_pays = 2654 '. |
(isset($p['projets']) ? " AND cs_ce_projet IN ({$p['projets']}) " : ''). |
'GROUP BY IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '. |
' 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').' '; |
|
static function NULLifNotNum(&$params, $keys_to_null) { |
foreach($keys_to_null as $v) { |
if(array_key_exists($v, $params) && !is_numeric($params[$v])) { |
$params[$v] = NULL; |
} |
// 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."; |
return array(); |
} |
|
$info = array(); |
foreach ($donnees as $donnee) { |
$info[$donnee['id']] = $donnee['nbre']; |
} |
return $info; |
} |
|
|
static function NULLifNotNum(&$params, $keys_to_null) { |
foreach($keys_to_null as $v) { |
if(array_key_exists($v, $params) && !is_numeric($params[$v])) { |
$params[$v] = NULL; |
} |
} |
} |
|
/** |
* Méthode appelée pour ajouter un élément. |
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); |
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); |
|
255,7 → 249,7 |
|
$this->envoyer($id_structure); |
} |
|
|
/** |
* Méthode appelée pour mettre à jour un élément |
*/ |
275,18 → 269,9 |
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); |
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); |
318,70 → 303,81 |
// NOTES : une structure ne peut pas être supprimée si elle possède des collections liées. |
// 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 { |
// 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)) { |
// Récupération des id passés par l'url |
$identifiants = explode(',', rtrim($uid[1], ',')); |
$this->messages[] = "Identifiant de structure ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service."; |
$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; |
} |
|
// Récupération des id passés par l'url |
$identifiants = explode(',', rtrim($uid[1], ',')); |
|
if (count($identifiants) == 0) { |
$this->messages[] = "Aucun enregistrement n'a été supprimé."; |
$this->envoyer(); |
return; |
} |
|
try { |
if (count($identifiants) == 0) { |
$this->messages[] = "Aucun enregistrement n'a été supprimé."; |
} else { |
foreach ($identifiants as $id_structure) { |
// Vérification que la structure ne possède pas de collections liées |
if ($this->verifierPresenceCollection($id_structure) === false) { |
$params = array('cs_id_structure' => $id_structure, 'csc_id_structure' => $id_structure, 'csv_id_structure' => $id_structure); |
$tables_a_modifier = $this->recupererTablesAModifier($params); |
try { |
foreach ($identifiants as $id_structure) { |
// Vérification que la structure ne possède pas de collections liées |
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) { |
// Historisation (Ajout des méta-données) |
$cle = $this->recupererCle($table); |
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session); |
} |
} |
} |
} 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); |
} |
} |
} |
foreach ($tables_a_modifier as $table_id => $table) { |
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); |
} |
} |
} |
} 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(); |
|
$presence = false; |
if ($nbre_collection != 0) { |
$presence = true; |
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); |
} |
|
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 |
} |
} |
} |
?> |