Rev 1530 | 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 = '';// 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) ? 'SELECT 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) ? 'SELECT 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) {// Traitement des paramêtres de stockage$truk_stockage_parametres = explode(';;', trim($structure['csc_truk_stockage_parametre'], ' ;'));$export_stockage_parametres = array();foreach ($truk_stockage_parametres as $param_code) {$param_code = preg_replace('/^AUTRE##/', '', trim($param_code));$param_txt = preg_match('/^[0-9]+$/', $param_code) ? $parametres[$param_code]['nom'] : $param_code;$export_stockage_parametres[] = addcslashes($param_txt, '"');}$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() {$donnees = array();$projet_id = $this->parametres['projet'];// Construction de la requête$requete = 'SELECT '.(($this->distinct) ? 'SELECT 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.";$structures = $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é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) {$truk_stockage_parametres = explode(';;', trim($structure['csc_truk_stockage_parametre'], ' ;'));$export_stockage_parametres = array();foreach ($truk_stockage_parametres as $param_code) {$param_code = preg_replace('/^AUTRE##/', '', trim($param_code));$param_txt = preg_match('/^[0-9]+$/', $param_code) ? $parametres[$param_code]['nom'] : $param_code;$export_stockage_parametres[] = addcslashes($param_txt, '"');}$id_structure = $structure['cs_id_structure'];$nom = addcslashes($structure['cs_nom'], '"');$stockage_params = implode(' ; ', $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,'collection_nbre' => $collection_nbre,'personnel_heure_nbre' => $personnel_heure_nbre);}}// 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'), $e->getFile(), $e->getLine(), $e->getMessage());}return $infos;}private function executerService($donnees) {// Création du contenu à partir d'un template PHP$contenu = Coel::traiterSquelettePhp($this->squelette, $donnees);return $contenu;}}