Rev 1531 | Rev 1540 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Service exportant des informations concernant COEL au format CSV.* 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 2010*/class CoelExport extends Coel {const META_LISTE_STOCK_PARAMS = 1020;// Liste des paramètres de contrôle environnemental d'un localconst META_LISTES_EXPERTISE_COLLECTION = '1040,1041,1043,1045,1046,1049,1050,1053,1057,1081';// Liste des métadonnées pour les informations des des collectionsprivate $format = null;private $service = null;private $squelette = null;private $squelette_dossier = null;/*** Méthode appelée avec une requête de type GET.*/public function getElement($params = array()) {// Initialisation des variables$info = array();$contenu = '';// Pré traitement des paramêtres$pour_bdd = false;$this->parametres = $this->traiterParametresUrl(array('service', 'format', 'projet'), $params, $pour_bdd);// Chargement du bon type de service demandéif (isset($this->parametres['service'])) {$this->service = strtolower($this->parametres['service']);$methode = $this->getNomMethodeService();if (method_exists($this, $methode)) {if (isset($this->parametres['format']) && preg_match('/^(?:csv|txt)$/i', $this->parametres['format'])) {// Mise en minuscule de l'indication du format$this->format = strtolower($this->parametres['format']);// Définition du fichier squelette demandé$this->definirSquelette();} else {$this->format = '';$this->messages[] = "Le service COEL Export nécessite d'indiquer en second paramètre le format : csv, txt.";}// Récupération du contenu à renvoyer$contenu = $this->$methode();} else {$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";}} else {$this->messages[] = "Le service COEL Syndication nécessite d'indiquer en premier paramètre le type d'information demandé.";}// Envoie sur la sortie standard$encodage = 'utf-8';$mime = $this->getTypeMime();$formatage_json = $this->getFormatageJson();$this->envoyer($contenu, $mime, $encodage, $formatage_json);}private function definirSquelette() {$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;$ext = $this->getExtensionFichierSquelette();$this->squelette = $this->squelette_dossier.'export_'.$this->service.'.tpl.'.$ext;}private function getExtensionFichierSquelette() {$ext = '';switch ($this->format) {case 'csv' :case 'txt' :$ext = 'csv';break;default:$ext = 'csv';}return $ext;}private function getNomMethodeService() {$methode = '';$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('_', $this->service))));$methode = 'getService'.$service_formate;return $methode;}private function getTypeMime() {$mime = '';switch ($this->format) {case 'csv' :$mime = 'text/csv';break;case 'txt' :$mime = 'text/plain';break;default:$mime = 'text/html';}return $mime;}private function getFormatageJson() {$json = false;switch ($this->service) {default:$json = false;}return $json;}private function getServiceStructureExpertise() {$donnees = array();$projet_id = $this->parametres['projet'];// Construction de la requête$requete = 'SELECT '.(($this->distinct) ? 'DISTINCT' : '').' '.' cs_id_structure, '.' SUM(csap_bota_travail_hebdo_tps) AS personnel_heure_nbre, '.' cs_nom, csc_truk_stockage_parametre '.'FROM coel_structure '.' LEFT JOIN coel_structure_a_personne ON (cs_id_structure = csap_id_structure) '.' LEFT JOIN coel_structure_conservation ON (cs_id_structure = csc_id_structure) '.( is_null($projet_id) ? '' : "WHERE cs_ce_projet = $projet_id ").'GROUP BY cs_id_structure '.'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cs_nom ASC').' '.((!is_null($this->start) && !is_null($this->limit)) ? "LIMIT $this->start,$this->limit " : '');$message_echec = "La requête a retourné aucun résultat.";$structures = $this->executerRequete($requete, $message_echec);// Construction de la requête$requete = 'SELECT '.(($this->distinct) ? 'DISTINCT' : '').' '.' cs_id_structure, '.' COUNT(cc_id_collection) AS collection_nbre '.'FROM coel_structure '.' LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure) '.( is_null($projet_id) ? '' : "WHERE cs_ce_projet = $projet_id ").'GROUP BY cs_id_structure ';$message_echec = "La requête comptant le nombre de collection a retourné aucun résultat.";$collections_nbre = $this->executerRequete($requete, $message_echec);// Récupération des métadonnées nécessaires$requete = 'SELECT cmlv_id_valeur, cmlv_nom, cmlv_abreviation '.'FROM coel_meta_liste_valeur '.'WHERE cmlv_ce_parent = '.self::META_LISTE_STOCK_PARAMS.' ';$message_echec = "La requête de recherche des métadonnées a retourné aucun résultat.";$metadonnees = $this->executerRequete($requete, $message_echec);// Traitement des donnéesif ($structures !== false) {// Traitement des métadonnées$parametres = array(0 => array('nom' => 'Non renseigné', 'abr' => 'NR'));foreach ($metadonnees as $meta) {$parametres[$meta['cmlv_id_valeur']] = array('nom' => $meta['cmlv_nom'], 'abr' => $meta['cmlv_abreviation']);}// Traitement du nombre de collection par structure$collections_par_structure = array();foreach ($collections_nbre as $collection) {$nbre = (empty($collection['collection_nbre'])) ? 0 : $collection['collection_nbre'];$collections_par_structure[$collection['cs_id_structure']] = $nbre;}// Traitement final des données concernant les structuresforeach ($structures as $structure) {$id_structure = $structure['cs_id_structure'];$nom = addcslashes($structure['cs_nom'], '"');$stockage_params = implode(' ; ', $export_stockage_parametres);$stockage_params_nbre = count($export_stockage_parametres);$collection_nbre = $collections_par_structure[$structure['cs_id_structure']];$collection_nbre = empty($collection_nbre) ? 0 : $collection_nbre;$personnel_heure_nbre = empty($structure['personnel_heure_nbre']) ? 0 : $structure['personnel_heure_nbre'];$donnees['structures'][$id_structure] = array('nom' => $nom,'stockage_params' => $stockage_params,'stockage_params_nbre' => $stockage_params_nbre,'collection_nbre' => $collection_nbre,'personnel_heure_nbre' => $personnel_heure_nbre);}}// Création du contenu$contenu = $this->executerService($donnees);return $contenu;}private function getServiceCollectionExpertise() {$projet_id = $this->parametres['projet'];// Construction de la requête$requete = 'SELECT '.(($this->distinct) ? 'DISTINCT' : '').' '.' cc_id_collection, '.' cc_nom, cs_nom, cc_ce_specimen_type, cc_description, cc_truk_periode_constitution, '.' cc_truk_couverture_lieu, ccb_truk_etiquette_renseignement, ccb_truk_nature, '.' ccb_truk_unite_base, ccb_ce_etat_general, ccb_truk_etiquette_fixation_support, '.' ccb_truk_etiquette_fixation_specimen, ccb_truk_degradation_presentation, '.' ccb_ce_classement_etat, ccb_ce_inventaire '.'FROM coel_collection '.' LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection) '.' LEFT JOIN coel_structure ON (cs_id_structure = cc_ce_structure) '.( is_null($projet_id) ? '' : "WHERE cc_ce_projet = $projet_id ").'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cc_nom ASC').' '.((!is_null($this->start) && !is_null($this->limit)) ? "LIMIT $this->start,$this->limit " : '');$message_echec = "La requête a retourné aucun résultat.";$collections = $this->executerRequete($requete, $message_echec);// Récupération des métadonnées nécessaires$requete = 'SELECT cmlv_id_valeur, cmlv_ce_parent, cmlv_nom, cmlv_abreviation '.'FROM coel_meta_liste_valeur '.'WHERE cmlv_ce_parent IN ('.self::META_LISTES_EXPERTISE_COLLECTION.') ';$message_echec = "La requête de recherche des métadonnées a retourné aucun résultat.";$metadonnees = $this->executerRequete($requete, $message_echec);// Traitement des données$donnees = array();if ($collections !== false) {// Instanciation des objets nécessaires aux traitements$ontologie = new Ontologie($metadonnees);$utilTruck = new UtilTruck($ontologie);// Traitement final des données concernant les structuresforeach ($collections as $collection) {$id_collection = $collection['cc_id_collection'];$nom = self::nettoyerGuillemets($collection['cc_nom']);$nom_structure = self::nettoyerGuillemets($collection['cs_nom']);$specimen_type = $utilTruck->construireTxtListeOntologie($collection['cc_ce_specimen_type']);$description = self::nettoyerGuillemets($collection['cc_description']);$periode_constitution = $utilTruck->construireTxtListeOntologie($collection['cc_truk_periode_constitution']);$couverture_lieu = $utilTruck->construireTxtListeOntologie($collection['cc_truk_couverture_lieu']);$etiquette_renseignement = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_etiquette_renseignement']);$nature = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_nature']);$parts_total = $collection['ccb_truk_unite_base'];$donnees['collections'][$id_collection] = array('nom' => $nom,'nom_structure' => $nom_structure,'specimen_type' => $specimen_type,'description' => $description,'periode_constitution' => $periode_constitution,'couverture_lieu' => $couverture_lieu,'etiquette_renseignement' => $etiquette_renseignement,'nature' => $nature,'parts_total' => $parts_total);}}// Création du contenu$contenu = $this->executerService($donnees);return $contenu;}private function executerRequete($requete, $message_echec) {try {$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($infos === false) {$this->messages[] = $message_echec;}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);}return $infos;}private function executerService($donnees) {// Création du contenu à partir d'un template PHP$contenu = Coel::traiterSquelettePhp($this->squelette, $donnees);return $contenu;}private static function nettoyerGuillemets($txt) {$txt = preg_replace('/"/', '""', $txt);return $txt;}}