Subversion Repositories Applications.referentiel

Rev

Rev 354 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Classe Controleur du module Accueil.
 * Affichage les infos sur l'ensemble des référentiels disponibles.
 * 
 * @package             Referentiel
 * @category    Php5.2
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @copyright   2010 Tela-Botanica
 * @license             http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
 * @license             http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
 * @version             SVN: $Id$
 */
class Informations extends AppliControleur {
        
        private $referentiel = null;
        private $referentielDao = null;
        private $rechercheDao = null;
        private $traitementDao = null;
        private $resultatDao = null;
        private $metaDao = null;
        private $colonnesOrdonnees = array();
        
        public function __construct()  {
                parent::__construct();
                
                // Récupération de paramêtres
                if (isset($_GET['ref'])) { // code du projet courrant
                        $this->referentiel = strtolower(strip_tags($_GET['ref']));
                }
                
                // Chargement des DAO nécessaires
                $this->resultatDao = new ResultatDao();
                $this->traitementDao = new TraitementDao();
                $this->referentielDao = new ReferentielDao();
                $this->rechercheDao = new RechercheDao();
                $this->metaDao = new MetaDao();
                // tableau colonnesOrdonnees à modifier aussi dans service/Recherche.php
                $this->colonnesOrdonnees = array("nn" => array("Numéro nomenclatural","checked","Identifiant numérique du nom scientifique"),
                        "nr" => array("Numéro nomenclatural du nom retenu","checked","Identifiant numérique du nom scientifique (num_nom) retenu pour désigner le taxon"),
                        "nt" => array("Numéro taxonomique","checked","Identifiant numérique du taxon auquel est rattaché le nom"),
                        "cd" => array("Numéro INPN","checked","Identifiant numérique unique du nom scientifique attribué par l’INPN"),
                        "rg" => array("Code rang","checked","Code numérique indiquant le rang du nom scientifique (voir tableau 7 du manuel technique)"),
                        "fam" => array("Famille (APG III)","checked","Nom de la famille dans APG III"),
                        "nsc" => array("Nom avec auteur","checked","Nom scientifique avec auteur(s)"),
                        "bibc" => array("Année et bibliographie","checked","Format à étudier celui de Tela : 1868, Brev. Pl. Nov., 2 : 70 ou celui de Kew :  Brev. Pl. Nov., 2 : 70 (1868)"),
                        "nsrc" => array("Nom retenu avec auteur","checked","Nom retenu pour tous les taxons (identique si le nom est édjà le nom retenu)"),
                        "extax" => array("Présent dans Taxref","checked",""),
                        "lien" => array("Permalien","checked","Lien http vers la fiche nomenclaturale"),
                        "ntsup" => array("Numéro nomenclatural rang supérieur","","Identifiant numérique du nom (num_nom) de rang supérieur dans la classification par défaut de l'index"),
                        "pre" => array("Répartition géographique","","Code indiquant si le taxon est présent dans la zone géographique définie par le référentiel (tableau 9)"),
                        "ns" => array("Nom sans auteur","","Nom scientifique sans auteur"),
                        "aut" => array("Auteur","","Intitulé de(s) l'auteur(s) du nom (abréviations standards de Brummitt et Powell)"),
                        "ann" => array("Année publication","","Année de la publication effective du support papier"),
                        "bib" => array("Bibliographie","","Référence bibliographique de la publication d'origine du nom"),
                        "ntype" => array("Numéro du type","","Identifiant numérique (num_nom) du 1er basionyme appliqué à la planche d'herbier"),
                        "nbas" => array("Numéro du basionyme","","Identifiant numérique (num_nom) du basionyme du nom"),
                        "genre" => array("Genre","","Nom d'un genre dans le cas d'un monôme du rang genre ou d'une combinaison"),
                        "esp" => array("Epithète espèce","","Épithète de l'espèce"),
                        "eing" => array("Epithète infragénérique","","Épithète infra-générique d'une combinaison dont le rang est situé entre le genre et l'espèce"),
                        "te" => array("Type d'épithète infraspécifique","","Abréviation indiquant le type de l'épithète infra-spécifique"),
                        "einsp" => array("Epithète infraspécifique","","Épithète infra-spécifique d'une combinaison"),
                        "hybp01" => array("Hybride parent 1","","Identifiant du nom (num_nom) du parent numéro 1 (dans le cas d'un hybride)"),
                        "nomsupgen" => array("Nom supra générique","","Monôme dont le rang est supérieur au genre"),
                        "hybp02" => array("Hybride parent 2","","Identifiant du nom (num_nom) du parent numéro 2 (dans le cas d'un hybride)"),
                        "stori" => array("Statut d'origine","","Code indiquant le statut d'origine du taxon dans la zone géographique définie par le référentiel (tableau 10)"),
                        "stint" => array("Statut d'introduction","","Code indiquant le statut d'introduction du taxon dans la zone géographique définie par le référentiel (tableau 11)"),
                        "stcult" => array("Statut de culture","","Code indiquant le statut de culture du taxon dans la zone géographique définie par le référentiel (tableau 12)"),
                        "notes" => array("Remarques","","Notes complémentaires"),
                        "nomadd" => array("Commentaires nomenclaturaux","","Commentaires nomenclaturaux pouvant être associés à un nom (voir tableau 8 du manuel technique)"),
                        "nsr" => array("Nom retenu sans auteur","","Nom scientifique du nom retenu sans auteur"),
                        "hom" => array("Homonymie","","Contient la valeur 1 si le nom possède un homonyme ou si le nom est un homonyme. Dans le cas contraire"),
                        "syn" => array("Statut du nom", "", "retenu, synonyme, ambigü, calculé à partir des num_nom et num_nom_retenu"),
                        "synprop" => array("Synonyme proprate","","Contient plusieurs identifiants numériques (num_nom) dans le cas d'un nom obtenu suite à la division d'un taxon. Contient un seul identifiant numérique (num_nom) dans le cas d'un nom obtenu suite à la fusion de plusieurs taxons."),
                        "syndout" => array("Synonyme douteux","","Contient la valeur 1 si le nom est un synonyme douteux. Dans le cas contraire"),
                        "synmapp" => array("Synonyme mal appliqué","","Contient la valeur 1 si le nom est un synonyme mal appliqué (cas des sensu). Dans le cas contraire"),
                        "synorth" => array("Synonyme orthographique","","Contient l'identifiant numérique du nom (num_nom) correctement orthographié"),
                        "orthori" => array("Orthographe originelle","","Contient la graphie originelle d'un nom non-conforme faisant l'objet d'une correction orthographique obligatoire"),
                        "hybp01n" => array("Hybride parent 1 notes","","Notes éventuelles sur l'hybridité et le parent numéro 1"),
                        "hybp02n" => array("Hybride parent 2 notes","","Notes éventuelles sur l'hybridité et le parent numéro 2"),
                        "cultgp" => array("Groupe de cultivar","","Nom d'un groupe de cultivar (sansl'abréviation « Gp »)"),
                        "cult" => array("Nom cultivar","","Nom d'un cultivar (sans les guillemets simple ou abréviation « cv. »)"),
                        "nomcomm" => array("Nom commercial","","Nom commercial d'une plante (en majuscule"),
                        "autres" => array("Autres","","colonnes spécifiques au référentiel"));
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // Méthodes
        /**
         * Fonction d'affichage par défaut
         */
        public function executerActionParDefaut() {
                return $this->afficherDetail();
        }

        /**
         * Affiche le détail d'un référentiel et la liste des actions possibles
         */
        public function afficherDetail() {
                $this->definirCommeModulePrincipal('Informations');
                $donnees = $this->preparerPagePourDetailReferentielEtTelechargement();

                $donnees['messages'] = $this->getMessages();
                $this->traiterEsperluette($donnees);
                $this->setSortie(self::RENDU_CORPS, $this->getVue('detail_referentiel', $donnees), false);
        }

        public function telecharger() {
                $dossier = Config::get('chemin_tmp');
                $parametres['ref'] = $this->referentiel;
                $parametres['version'] = $_POST["version"];
                $parametres['version'] = str_replace(".", "_", $parametres['version']);
                if (isset($_POST["champs"])) $parametres['champs'] = implode(",",$_POST["champs"]);
                if (isset($_POST["filtres"])) $parametres['filtres'] = implode(",",$_POST["filtres"]);
                if (isset($_POST["encodage"])) $parametres['encodage'] = $_POST["encodage"];
                
                $_POST['usage'] = empty($_POST['usage']) ? 'inconnu' : $_POST['usage'];
                $this->loggerExport($_SERVER['REMOTE_ADDR'], $_POST['usage'], $parametres['ref'], $parametres['version']);
                
                $this->supprimerAncienExport($dossier);
                $ref = $this->referentielDao->exporter($parametres);
                $meta = $this->metaDao->exporter($parametres);

                $dossierDateEtNomDeFichier = date('Y_m_d').'/'.$this->referentiel.time().'.zip';
                $cheminZip = $dossier.$dossierDateEtNomDeFichier;
                $zip = new ZipArchive();
                if($zip->open($cheminZip, ZipArchive::CREATE) === true) {
                        // Ajout des fichiers métadonnées, référentiel et manuel technique
                        $meta = str_replace("\\/", "/", $meta);
                        if (file_exists($meta)) {
                                $metazip = $zip->addFile($meta, "informations.csv"); 
                        }
                        if (file_exists($ref)) {
                                $refzip = $zip->addFile($ref, "referentiel.csv");
                        }
                        if (file_exists($dossier.'mtpr_V4_4.pdf')) {
                                $zip->addFile($dossier.'mtpr_V4_4.pdf', 'manuel_technique.pdf');
                        }
                        // Et on referme l'archive
                        $zip->close();
                } else {
                        echo "Erreur : impossible d'ouvrir le fichier [$cheminZip]<br/>";
                }

                // on revient à la page de détail, avec un lien de téléchargement en prime
                $donnees = $this->preparerPagePourDetailReferentielEtTelechargement();
                if (file_exists($cheminZip)) {
                        $urlLien = Config::get("base_url_telechargements") . $dossierDateEtNomDeFichier;
                        $donnees['url_telechargement_zip'] = $urlLien;
                }
                //$this->transformerEnXls($ref, $dossier);
                $this->setSortie(self::RENDU_CORPS, $this->getVue('detail_referentiel', $donnees), false);
        }
        
        private function loggerExport($ip, $usage, $referentiel, $version) {
                $separateur = "\t";
                $ligne = date('Y-m-d H:i:s').$separateur.$ip.$separateur.$usage.$separateur.$referentiel.$separateur.$version."\n";
                file_put_contents(Config::get('base_chemin_log').'telechargements.log', $ligne, FILE_APPEND);
        }
        
        public function transformerEnXls($fichier, $dossier) {
                include '../bibliotheque/utilitaires/PHPExcel/IOFactory.php';
                
                $dossier .= date('Y_m_d').'/';
        
                $objReader = PHPExcel_IOFactory::createReader('CSV');
        
                // If the files uses a delimiter other than a comma (e.g. a tab), then tell the reader
                $objReader->setDelimiter("\t");
                // If the files uses an encoding other than UTF-8 or ASCII, then tell the reader
                $objReader->setInputEncoding('UTF-8');
        
                $objPHPExcel = $objReader->load($fichier);
                $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
                $objWriter->save($dossier.'MyExcelFile.xls');
        }

        // exécute la partie commune entre l'action "detail" et l'action "telecharger"
        protected function preparerPagePourDetailReferentielEtTelechargement() {
                $donnees = array();
                // Traitement de l'info sur le code du référentiel
                if (isset($this->referentiel)) {
                        $this->construireMenu($this->referentiel);
                        $this->construireFilAriane($this->referentiel);
                        $donnees['referentiel'] = $this->referentiel;
                        $donnees['nom_referentiel'] = $this->referentielDao->getNom($this->referentiel);
                        $donnees['url_menu_test'] = $this->obtenirUrlMenuTest($this->referentiel);
                        $donnees['url_menu_versionnage'] = $this->obtenirUrlMenuVersionnage($this->referentiel);
                        $donnees['url_menu_consultation'] = $this->obtenirUrlMenuConsultation($this->referentiel);
                        $donnees['url_form_telech'] = $this->obtenirUrlDetailReferentielTelechargement($this->referentiel);
                                
                        // suppression du téléchargement pour bdbfx
                        if ($this->referentiel != 'bdbfx') {
                                $donnees['versions'] = $this->afficherFormulaireTelechargementsReferentiels();
                                $donnees['infos_telechargements'] = $this->afficherTelechargementsReferentiels();
                                $donnees['colonnesOrdonnees'] = $this->colonnesOrdonnees;
                                $parametres['ref'] = $this->referentiel;
                                $parametres['rg'] = '180';
                                $donnees['familles'] = $this->rechercheDao->chercher('ParDefaut', $parametres, 250);
                        }
                } else {
                        $this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdtfx).");
                }
                return $donnees;
        }

        private function supprimerAncienExport($dossier) {
                $pointeur = opendir($dossier);
                // si pas d'erreur d'ouverture du dossier on lance le scan
                if( $pointeur != false ) {
                        // Parcours du repertoire
                        while( $ss_dossier = readdir($pointeur)) {
                                if($ss_dossier != "." && $ss_dossier != "..") {
                                        $chemin_complet = $dossier . $ss_dossier;
                                        if (is_dir($chemin_complet) && $ss_dossier < date('Y_m_d')) {
                                                $fichiers = scandir($chemin_complet);
                                                foreach ($fichiers as $fichier) {
                                                        if($fichier != "." && $fichier != "..") {
                                                                unlink($chemin_complet."/".$fichier);
                                                        }
                                                }
                                                rmdir($chemin_complet);
                                        }
                                }
                        }
                        closedir($pointeur);
                }
        }
        
        private function afficherFormulaireTelechargementsReferentiels() {
                $versions = $this->traitementDao->getTraitementsTermines($this->referentiel, 'versionnage');
                if ($versions != null) {
                        foreach ($versions as $id => $version) {
                                $versions[$id] = (unserialize($versions[$id]["script_parametres"]));
                        }
                }
                return $versions;
        }
        private function afficherTelechargementsReferentiels() {
                $infos_telechargements = array();
                // Recherche des traitements déjà effectué
                $resultat = $this->traitementDao->getTraitementsTermines($this->referentiel, 'versionnage');
                if (is_array($resultat)) {
                        foreach ($resultat as &$traitement) {
                                $infos_traitement = $this->traitementDao->getInfos($traitement['id_traitement']);
                                if ($infos_traitement != false) {
                                        // Recherche des fichiers disponibles
                                        $infos_zip = $this->obtenirUrlsZipPourTraitement($infos_traitement);
                                        $infos_telechargements[] = array(
                                                                'infos_traitement' => $traitement,
                                                                'description' => $this->creerDescriptionTelechargement($traitement),
                                                                'urls_zip' => $infos_zip);
                                }
                        }
                }
                return $infos_telechargements;
        }
                
        private function creerDescriptionTelechargement($traitement) {
                return strftime('%e %B %Y', strtotime($traitement['meta_date_creation'])).' ('.$this->referentielDao->getNom($this->referentiel).') ';
        }
        
}
?>