Rev 1941 | 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'), $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();// Construction de la requête$requete = 'SELECT '.(($this->distinct) ? 'DISTINCT' : '').' '.' cs_id_structure, cs_nom, cs_description, cs_adresse_01, cs_code_postal, cs_ville, cs_courriel, '.' cs_truk_telephone, cs_truk_url,'.' SUM(csap_bota_travail_hebdo_tps) AS personnel_heure_nbre, '.' csc_truk_stockage_parametre, cmlv_nom, csv_mark_visite_avec_motif '.'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) '.' LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure) '.' LEFT JOIN coel_meta_liste_valeur on `cmlv_id_valeur` =`cs_ce_truk_type_public`'.'GROUP BY cs_id_structure '.'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cs_nom ASC').' ';$message_echec = "La requête n'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) '.'GROUP BY cs_id_structure ';$message_echec = "La requête comptant le nombre de collections n'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 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;}// Instanciation des objets nécessaires aux traitements$ontologie = new Ontologie($metadonnees);$utilTruck = new UtilTruck($ontologie);// Traitement final des données concernant les structuresforeach ($structures as $structure) {$id_structure = $structure['cs_id_structure'];$nom = $structure['cs_nom'];$description = $structure['cs_description'];$adresse_01 = $structure['cs_adresse_01'];$code_postal = $structure['cs_code_postal'];$ville = $structure['cs_ville'];$telephone = $utilTruck->construireTxtListeOntologie($structure['cs_truk_telephone']);$courriel = $structure['cs_courriel'];$type = $structure['cmlv_nom'];$url = $utilTruck->construireTxtListeOntologie($structure['cs_truk_url']);$stockage_params = $utilTruck->construireTxtListeOntologie($structure['csc_truk_stockage_parametre']);$stockage_params_nbre = $utilTruck->getNbreValeur($structure['csc_truk_stockage_parametre']);$stockage_params_nbre = empty($stockage_params_nbre) ? 0 : $stockage_params_nbre;$collection_nbre = $collections_par_structure[$structure['cs_id_structure']];$collection_nbre = empty($collection_nbre) ? 0 : $collection_nbre;// désactivé à la demande de Louise - 01/09/2014//$personnel_heure_nbre = empty($structure['personnel_heure_nbre']) ? 0 : $structure['personnel_heure_nbre'];//$visite_avec_motif_science = $structure['csv_mark_visite_avec_motif'];$structure_affichage = array('nom' => $nom,'description' => $description,'adresse' => $adresse_01,'code_postal' => $code_postal,'ville' => $ville,'telephone' => $telephone,'courriel' => $courriel,'url' => $url,'type' => $type,'stockage_params' => $stockage_params,'stockage_params_nbre' => $stockage_params_nbre,'collection_nbre' => $collection_nbre,//'personnel_heure_nbre' => $personnel_heure_nbre,//'visite_avec_motif_science' => $visite_avec_motif_science);$structure_affichage = $this->nettoyerTableau($structure_affichage);$donnees['structures'][$id_structure] = $structure_affichage;}}// Création du contenu$contenu = $this->executerService($donnees);return $contenu;}private function getServiceCollectionExpertise() {// Construction de la requête$requete = 'SELECT '.(($this->distinct) ? 'DISTINCT' : '').' '.' cc_id_collection, '.' cc_ce_structure, '.' cc_nom, cc_cote, cs_nom, cc_ce_specimen_type, cc_description, cc_periode_constitution_debut, cc_periode_constitution_fin, '.' cc_truk_couverture_lieu, ccb_truk_etiquette_renseignement, ccb_truk_nature, '.' ccb_nb_planches_herbiers, ccb_nb_especes, ccb_ce_etat_general, ccb_specimen_fixation_pourcent, '.' ccb_truk_specimen_fixation_methode, 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) '.'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cc_nom ASC').' ';$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);$etat_ontologie = array("" =>"", "0" => "", "1" => "Très mauvais état", "2" => "Mauvais état", "3" => "État moyen","4" => "Bon état", "5" => "Très bon état");// Traitement final des données concernant les structuresforeach ($collections as $collection) {$id_collection = $collection['cc_id_collection'];$nom = $collection['cc_nom'];$cote = $collection['cc_cote'];$id_structure = $collection['cc_ce_structure'];$nom_structure = $collection['cs_nom'];$specimen_type = $utilTruck->construireTxtListeOntologie($collection['cc_ce_specimen_type']);$description = $collection['cc_description'];$couverture_lieu = $utilTruck->construireTxtListeOntologie($collection['cc_truk_couverture_lieu']);$specimen_fixation_pourcent = $collection['ccb_specimen_fixation_pourcent'];$specimen_fixation_methode = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_specimen_fixation_methode']);$etiquette_renseignement = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_etiquette_renseignement']);$nature = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_nature']);$etat_general = $etat_ontologie[$collection['ccb_ce_etat_general']];$etiquette_fixation_support = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_etiquette_fixation_support']);$etiquette_fixation_specimen = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_etiquette_fixation_specimen']);$degradation_presentation = $utilTruck->construireTxtListeOntologie($collection['ccb_truk_degradation_presentation'], false, true, true);$classement_etat = $utilTruck->construireTxtListeOntologie($collection['ccb_ce_classement_etat']);$inventaire = $utilTruck->construireTxtListeOntologie($collection['ccb_ce_inventaire']);$collection_affichage = array('id' => $id_collection,'cote' => $cote,'nom' => $nom,'nom_structure' => $nom_structure,'id_structure' => $id_structure,'specimen_type' => $specimen_type,'description' => $description,'periode_constitution_debut' => $collection['cc_periode_constitution_debut'],'periode_constitution_fin' => $collection['cc_periode_constitution_fin'],'couverture_lieu' => $couverture_lieu,'etiquette_renseignement' => $etiquette_renseignement,'nature' => $nature,'nombre_planches_herbier' => $collection['ccb_nb_planches_herbiers'],'etat_general' => $etat_general,'etiquette_fixation_support' => $etiquette_fixation_support,'etiquette_fixation_specimen' => $etiquette_fixation_specimen,'specimen_fixation_pourcent' => $specimen_fixation_pourcent,'specimen_fixation_methode' => $specimen_fixation_methode,'degradation_presentation' => $degradation_presentation,'classement_etat' => $classement_etat,'inventaire' => $inventaire);$collection_affichage = $this->nettoyerTableau($collection_affichage);$donnees['collections'][] = $collection_affichage;}$donnees['champs'] = array_keys(current($donnees['collections']));}// 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 function nettoyerTableau(Array $tableau) {foreach ($tableau as $cle => $valeur) {$tableau[$cle] = self::nettoyerGuillemets($valeur);}return $tableau;}private static function nettoyerGuillemets($txt) {$txt = preg_replace('/"/', '""', $txt);return $txt;}}