Rev 1622 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Service fournissant la liste des collections et leurs informations.* Encodage en entrée : utf8* Encodage en sortie : utf8** @author Jean-Pascal MILCENT <jpm@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 CoelCollection extends Coel {protected $tables = array( 101 => array('nom' => 'coel_collection','prefixe' => 'cc','id' => array('cc_id_collection')),106 => array('nom' => 'coel_collection_botanique','prefixe' => 'ccb','id' => array('ccb_id_collection')));/*** Méthode principale appelée avec une requête de type GET.*/public function getElement($param = array()) {// Initialisation des variables$info = array();// Nour recherchons le type de requête demandé$type = $param[0];if ($type == '*' || is_numeric($type)) {$info = $this->getElementParDefaut($param);} else {$methode = 'getElement'.$type;if (method_exists($this, $methode)) {array_shift($param);$info = $this->$methode($param);} else {$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";}}// Envoie sur la sortie standard$this->envoyer($info);}/*** Méthode par défaut pour garder la compatibilité avec Coel.* Appelée avec les paramêtres d'url suivant :* /CoelCollection/_/_/_* ou les _ représentent dans l'ordre : id_projet, id_collection ou nom* Si un des paramêtres est abscent, il prendre la valeur **/public function getElementParDefaut($param) {// Initialisation des variables$info = array();// Pré traitement des paramêtres$p = $this->traiterParametresUrl(array('id_projet', 'id_collection', 'recherche'), $param);// Construction de la requête$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' c.*, cb.*, '.' cmhl_date_modification, cmhl_notes, cmhl_source, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, '.' ccm.cc_nom AS _collection_mere_nom_, '.' cs_nom AS _structure_nom_, cs_ville AS _structure_ville_ '.'FROM coel_collection AS c'.' LEFT JOIN coel_meta_historique_ligne AS cmhl ON (c.cc_ce_meta = cmhl_id_historique_ligne) '.' LEFT JOIN coel_structure ON (c.cc_ce_structure = cs_id_structure) '.' LEFT JOIN coel_collection AS ccm ON (c.cc_ce_mere = ccm.cc_id_collection) '.' LEFT JOIN coel_collection_botanique AS cb ON (c.cc_id_collection = ccb_id_collection) '.((count($p) != 0) ? 'WHERE ' : '').((isset($p['id_projet'])) ? "AND c.cc_ce_projet = {$p['id_projet']} " : '').((isset($p['id_collection'])) ? "AND c.cc_id_collection = {$p['id_collection']} " : '').(isset($p['recherche']) ? $this->construireWhereRecherche($p['recherche']) : '').'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'c.cc_nom ASC').' ';$requete = str_replace('WHERE AND', 'WHERE', $requete);$requeteCount = $requete;$requete .= "LIMIT $this->start, $this->limit ";// Récupération des résultatstry {// SPÉCIAL :// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet$donnees = (isset($p['id_collection'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";}$nbElements = $this->bdd->query($requeteCount)->rowCount();$info['nbElements'] = $nbElements;$info['collections'] = $donnees;} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}return $info;}private function construireWhereRecherche($recherche) {$recherche = "AND "."("."c.cc_nom LIKE {$recherche} OR "."cs_ville LIKE {$recherche} ".")";return $recherche;}/* Méthode pour récupérer une liste de collection en fonction d'un id structure.* Appelée avec les paramêtres d'url suivant :* /CoelCollection/ParIdStructure/_* ou les _ représentent dans l'ordre : id_structure* Si un des paramêtres est abscent, il prendre la valeur **/public function getElementParIdStructure($param) {// Initialisation des variables$info = array();// Pré traitement des paramêtres$p = $this->traiterParametresUrl(array('id_structure'), $param);if (!isset($p['id_structure'])) {$this->messages[] = "Il est obligatoire d'indiquer un id de structure pour utiliser ce service.";} else {// Construction de la requête$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' cc_nom, cc_id_collection '.'FROM coel_collection AS c '.'WHERE '." c.cc_ce_structure = {$p['id_structure']} ".'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'c.cc_nom ASC').' '."LIMIT $this->start, $this->limit ";// Récupération des résultatstry {// SPÉCIAL :// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";} else {$info = $donnees;}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}}return $info;}/* Méthode pour récupérer le nombre de collection en fonction d'un id structure.* Appelée avec les paramêtres d'url suivant :* /CoelCollection/NbreParIdStructure/_* ou les _ représentent dans l'ordre : id_structure* Si un des paramêtres est abscent, il prendre la valeur **/public function getElementNbreParIdStructure($param) {// Initialisation des variables$info = array();// Pré traitement des paramêtres$p = $this->traiterParametresUrl(array('id_structure'), $param);if (!isset($p['id_structure'])) {$this->messages[] = "Il est obligatoire d'indiquer un id de structure pour utiliser ce service.";} else {// Construction de la requête$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(cc_id_collection) AS nbre '.'FROM coel_collection AS c '.'WHERE '." c.cc_ce_structure = {$p['id_structure']} ".'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'c.cc_nom ASC');// Récupération des résultatstry {// SPÉCIAL :// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";} else {$info = $donnees['nbre'];}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}}return $info;}/*** Méthode appelée pour ajouter un élément.*/public function createElement($params) {// Identification de l'utilisateurlist($id_utilisateur, $id_session) = $this->getIdentification($params);// Contrôle du non détournement de l'utilisateurif ($this->etreAutorise($id_utilisateur)) {try {// Vérification des tables à vraiment mettre à jour en fonction des données passées.$tables_a_modifier = $this->recupererTablesAModifier($params);reset($tables_a_modifier);$id_collection = null;while (list($table_id, $table) = each($tables_a_modifier)) {if (!is_null($table['champs'])) {if (!$this->avoirCleComplete($table)) {// Ajout des données à la table des données$id_collection = $this->ajouter($table);if ($id_collection !== false) {$table['champs_valeurs_id']['cc_id_collection'] = $id_collection;$table['champs_valeurs_brut']['cc_id_collection'] = $id_collection;$tables_a_modifier[106]['champs_valeurs_id']['ccb_id_collection'] = $id_collection;$tables_a_modifier[106]['champs_valeurs_brut']['ccb_id_collection'] = $id_collection;$tables_a_modifier[106]['champs_valeurs_protege']['ccb_id_collection'] = $this->bdd->quote($id_collection);// Historisation (Ajout des méta-données)$etat = 1; // Ajout$cle = $this->recupererCle($table);$info = $this->creerXmlHisto($table['champs_valeurs_brut']);$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);// Liaison de la table des données à ses méta-données$champ_meta = "{$table['prefixe']}_ce_meta";$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);$this->modifier($table);}} else {$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);}}}if(!isset($params['cpr_abreviation'])) {$params['cpr_abreviation'] = '';}$this->ajouterGuid($params['cpr_abreviation'], $id_collection);} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);}}$this->envoyer($id_collection);}/*** Méthode appelée pour mettre à jour un élément*/public function updateElement($uid, $params) {// Vérification de la présence des id passés par l'urlif (!isset($uid[0])) {$this->messages[] = "Identifiant de collection manquant. Vous ne devriez pas avoir accès à ce service.";} else {// Identification de l'utilisateurlist($id_utilisateur, $id_session) = $this->getIdentification($params);// Contrôle du non détournement de l'utilisateurif ($this->etreAutorise($id_utilisateur)) {try {// Vérification des tables à vraiment mettre à jour en fonction des données passées.$tables_a_modifier = $this->recupererTablesAModifier($params);// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jourforeach ($tables_a_modifier as $table_id => $table) {$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);}}}// Envoie sur la sortie standard$this->envoyer();}/*** Méthode appelée pour supprimer un élément*/public function deleteElement($uid) {// Vérification de la présence des id passés par l'urlif (!isset($uid[0]) || !isset($uid[1])) {$this->messages[] = "Identifiant de collection ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";} else {// Identification de l'utilisateurlist($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);// Contrôle du non détournement de l'utilisateurif ($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 {foreach ($identifiants as $id_collection) {// Vérification que la structure ne possède pas de collections liées$params = array('cc_id_collection' => $id_collection, 'ccb_id_collection' => $id_collection);$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);}}}}}} 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 ajouterGuid($abr_projet, $id_collection) {if ($id_collection !== false) {$table_guid = $this->tables[101];$table_guid['champs_valeurs_id']['cc_id_collection'] = $id_collection;$table_guid['champs_valeurs_protege']['cc_guid'] = $this->bdd->quote(sprintf($this->config['coel']['guid'], $abr_projet, 'coll'.$id_collection));$this->modifier($table_guid);}}}?>