Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/* Importation des fichiers excel de Bonnier pour créer une version HTML pour PDA.
 * Utilisation au préalable des utillitaire de traitement de fichier mdb sous Unix (voir ci après)
 * 
 *  Pré-requis :
 *  1. Installer  le paquet pour Perl nommé ParseExcel : urpmi perl-spreadsheet-parseexcel
 *  2. Télécharger les fichiers Excel de Bonnier : http://www.tela-botanica.org/projets/74/documents/16211
 *  3. Créer un dossier où vous dézipperez l'archive des fichiers Excel
 *  4. Copier dans ce dossier les fichier xls2sql.pl et generer_sql.sh que vous trouverez dans le dossier shell de ce module
 *  5. Donner les droits d'execution au fichier generer_sql.sh et lancer le : ./generer_sql.sh
 *  6. Vous devez obtenir un fichier SQL par fichier Excel.
 *  
 *  Pour lancer ce script fichier par fichier :
 *  1. Ouvrir une console et se positionner dans le dossier "scripts"
 *  2. Pour charger le 1er fichier Excel, taper la commande : /opt/lampp/bin/php script.php  bonnier -p bonnier -a charger  -table renonculacees
 *  3. Pour generer le html issu du chargement precedent :
 *  /opt/lampp/bin/php script.php  bonnier -p bonnier -a html -dossier "menus/001-Renonculacees" -table renonculacees
 *  
 * // Auteur original :
 * @author      David DELON <david@clapas.net>
 * @copyright   David DELON 2009
 * @link                http://www.tela-botanica.org/wikini/eflore
 * @licence             GPL v3 & CeCILL v2
 * @version             $Id$
 */
// +-------------------------------------------------------------------------------------------------------------------+
class Bonnier extends ScriptCommandeEflore {

        /**
         * Paramêtres disponible pour la ligne de commande
         * le tableau se construit de la forme suivnate :       
         * - clé =  nom du paramêtre '-foo'
         * - value = contient un nouveau tableau composé de cette façaon :
         *  - booléen: true si le paramêtre est obligatoire
         *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
         *  - string: description du contenu du paramêtre
         * Les paramêtres optionels devraient être déclaré à la fin du tableau.
         * Le dernier parametre du tableau peut avoir la valeur '...',
         * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
         * @var array
         */
        public $parametres = array(     '-table' => array(true, true, "Nom de la table où seront stockées les données d'une famille"), 
                                                                '-dossier' => array(true, true, "Dossier où sont générés les fichiers html pour la table"));
        
        public function executer() {

                error_reporting(E_ALL &  ~E_DEPRECATED );
                
                $table = $this->getParam('table');
                $dossier = $this->getParam('dossier');
                
                @mkdir($this->getIni('chemin_fichier_sortie').$dossier);
                
                $cmd = $this->getParam('a');
                switch ($cmd) {
                        // chargement des fichiers sql issus de la transformation xls dans la base de donnee, une table par fichir sql, 2 tables par
                        // familles : texte (navigation / clef) et plantes : description des plantes.                     
                        case 'charger' :
                                $this->creerTableBonnier($this->version, $table);
                                $this->chargerDonnees($table);
                                break;
                        case 'html' :
                        // tranformation sql vers html : pour la famille considerée : parcours de l'ensemble de ses clef et generation html pour
                        // les feuilles.
                        
                                $this->realiserHtml($dossier, $table);
                                break;
                        default :
                                trigger_error('Erreur : la commande "'.$cmd.'" n\'existe pas!'."\n", E_USER_ERROR);
                }
        }

        private function realiserHtml($dossier, $table) {
                // Parcours de l'ensemble des données ? ou famille par famille ?
                
                // on charge plante et texte dans des tableaux
                
                $this->type_donnee = $table.'_texte';
                
                $requete =      'SELECT * '.            
                                        'FROM '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' '.
                                        'ORDER BY uid';
                
                $lignesTexte = $this->retournerDonneesRequete($requete);
                
                // Analyse des données
                echo "Analyse des données : ".$this->type_donnee."\n";
                foreach ($lignesTexte as $ligneTexte) {
                        if (!isset($aso_lignes[$ligneTexte['identifiant']])) {
                                $aso_lignes[$ligneTexte['identifiant']] = $ligneTexte;
                        } else {
                                echo "identifiant en double : ".$ligneTexte['identifiant']."\n";  
                        }
                }

                $this->type_donnee = $table.'_plante';
                
                $requete =      'SELECT * '.            
                                        'FROM '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' '.
                                        'ORDER BY uid';
                
                $lignesPlante = $this->retournerDonneesRequete($requete);
                
                foreach ($lignesPlante as $lignePlante) {
                        if (!isset($aso_lignes[$lignePlante['identifiant']])) {
                                $aso_lignes[$lignePlante['identifiant']] = $lignePlante;
                        } else {
                                echo "identifiant en double : ".$lignePlante['identifiant']."\n";  
                        }
                }
                
                //print_r($aso_lignes_texte[$lignesTexte[0]['identifiant']]  ['titre']);
                
                // $ariane : tableau des identifiants parcourus dans la branche
                // $niveau : niveau dans l'arbre 
                
                $ariane = array();
                $niveau = 0;
                
                // Parcours de l'arbre des clefs depuis la racine 
                
                $this->genererHtmlTexte($lignesTexte[1]['identifiant'], $aso_lignes, $ariane, $niveau, $dossier);
        }
        
        
        // Generation des elements de navigation (clef)
        
        private function genererHtmlTexte($identifiant, $lignesTexteIdentifiant, $ariane, $niveau, $dossier) {

                
                $ariane[] = $identifiant;
                $niveau++;
                
                if (isset ($lignesTexteIdentifiant[$identifiant])) {  // Si des identifiants sont en doubles  
                        $ligneIdentifiant = $lignesTexteIdentifiant[$identifiant];
                }
                else {
                        // initialiser valeur par defaut indiquant une erreur
                }

                
                $f_html = fopen($this->getIni('chemin_fichier_sortie').$dossier.'/'.$identifiant.'.html', 'wb');
                
                $html =
                '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n".
                '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">'."\n".
                '<head>'."\n".
                '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'."\n".
                '<title>Flore BONNIER sur PDA</title>'."\n".
                '<link rel="stylesheet" type="text/css" href="../../style/style640.css" media="screen" />'."\n".
                '</head>'."\n";
                
                $html .= '<body>'."\n";
                $html .= '<div class="titre">'."\n";
                $html .= '<p id="titre">';
                if (isset($ligneIdentifiant)) {
                        $html .= $ligneIdentifiant['titre'];
                }
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                // print "identifiant : ".$ligneIdentifiant['identifiant']."\n";
                
                // Destinations
                // Branche niveau inferieur
                
                $html.='<div class="fenetreMenu">'."\n";
                
                for ($i = 1; $i < 6; $i++) {
                        if (isset($ligneIdentifiant['texte_'.$i]) && $ligneIdentifiant['texte_'.$i] != "") {
                                $html .= '<div class="menu'.($i-1).'">'."\n";
                                $html .= '<a href="'.$ligneIdentifiant['destination_'.$i].'.html">';
                                $html .= $ligneIdentifiant['texte_'.$i];
                                $html .= '</a>'."\n";
                                $html .= '</div>'."\n";
                        }
                }

                $html .= '</div>'."\n";
                $html .= '<div class="espace" style="top:518px;">'."\n";
                $html .= '</div>'."\n";
                $html .= '<div class="navigation">'."\n";
                $html .= '<p id="navigation">'."\n";
                
                
                // Navigation 
                
                for ($i = 0; $i < $niveau; $i++) {
                        if (($ariane[$i]) && $ariane[$i] != '') {
                                $html .= '<a href="'.$ariane[$i].'.html">';
                                if (isset ($lignesTexteIdentifiant[$ariane[$i]])) {  // Si des identifiants sont en doubles  
                                        $html .= $lignesTexteIdentifiant[$ariane[$i]]['titre'];
                                }
                                $html .= '</a>'."\n";
                        }
                }
                
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";

                $html .= '<div class="retour">'."\n";
                $html .= '<p id="retour">'."\n";
                
                // Retour niveau superieur 
                
                if (isset($ariane[$niveau - 2]) && $ariane[$niveau - 2] != '') {
                                $html .= '<a href="'.$ariane[$niveau - 2].'.html">';
                                $html .= $lignesTexteIdentifiant[$ariane[$niveau - 2]]['titre'];
                                $html .= '</a>'."\n";
                }
                
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                
                $html .= '<div class="glossaire">'."\n";
                $html .= '<p id="glossaire">'."\n";
                $html .= '<a href="../000-general/glossaire0_640.html">'."\n";
                $html .= 'Glossaire'."\n";
                $html .= '</a>'."\n";
                $html .= '</p></div><div class="text">'."\n";
                $html .= '<p id="Text">'."\n";
                $html .= '<a href="../000-general/accueil1_640.html">'."\n";
                $html .= '   Top'."\n";
                $html .= '</a>'."\n";
                $html .= ' </p>'."\n";
                $html .= '</div>'."\n";

                $html .= '</body>'."\n";
                $html .= '</html>'."\n";
                
                fwrite($f_html, $html);
                fclose($f_html);        
                
                // Ecriture des feuilles (description plantes)
                
                for ($i = 1; $i < 6; $i++) {
                        if (isset($ligneIdentifiant['destination_'.$i]) && $ligneIdentifiant['destination_'.$i] != '') {
                                if (substr($ligneIdentifiant['destination_'.$i], 0, 1) == 'p') {
                                        $this->genererHtmlPlante($ligneIdentifiant['destination_'.$i], $lignesTexteIdentifiant, $ariane, $niveau, $dossier);                            
                                } else {
                                        $this->genererHtmlTexte($ligneIdentifiant['destination_'.$i], $lignesTexteIdentifiant, $ariane, $niveau, $dossier);
                                }
                        }
                }
        }
        
        // Plante       
        private function genererHtmlPlante($identifiant, $lignesTexteIdentifiant, $ariane, $niveau, $dossier) {
                $ariane[] = $identifiant;
                $niveau++;
                
            if (isset ($lignesTexteIdentifiant[$identifiant])) {  // Au cas ou  des identifiants sont en doubles                
                        $ligneIdentifiant = $lignesTexteIdentifiant[$identifiant];
            }
                
                $nom_latin = '';
                if (isset($ariane[($niveau - 2)]) && isset($lignesTexteIdentifiant[$ariane[($niveau - 2)]]['texte_1'])) {
                        $nom_latin = trim(strrchr($lignesTexteIdentifiant[$ariane[($niveau - 2)]]['texte_1'], ':'), ' :');
                }

                $f_html = fopen($this->getIni('chemin_fichier_sortie').$dossier.'/'.$identifiant.'.html', 'wb');
                $html=
                '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n".
                '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">'."\n".
                '<head>'."\n".
                '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'."\n".
                '<title>Flore BONNIER sur PDA</title>'."\n".
                '<link rel="stylesheet" type="text/css" href="../../style/style_plante.css" media="screen" />'."\n".
                '</head>'."\n";
                
                $html .= '<body>'."\n";
                $html .= '<div class="titre">'."\n";
                $html .= '<p id="titre">';                              
                $html .= $nom_latin;
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                
                $html .= '<div class="famille">'."\n";
                $html .= '<p id="famille1">Famille : </p>'."\n";
                $html .= '<p id="famille2">';
                $html .= $lignesTexteIdentifiant[$ariane[0]]['titre'];                          
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
        
                $html .= '<div class="genre">'."\n";
                $html .= '<p id="genre1">Genre : </p>'."\n";
                $html .= '<p id="genre2">';
                if (isset($ligneIdentifiant)) {         
                $html .= $ligneIdentifiant['genre'];                            
                }
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
        
                $html .= '<div class="nom_latin">'."\n";
                $html .= '<p id="nom_latin1">Nom Latin : </p>'."\n";
                $html .= '<p id="nom_latin2">';
                $html .= $nom_latin;                            
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
        
                $html .= '<div class="nom_francais">'."\n";
                $html .= '<p id="nom_francais1">Nom Francais : </p>'."\n";
                $html .= '<p id="nom_francais2">';
                if (isset($ligneIdentifiant)) {
                $html .= $ligneIdentifiant['nom_francais'];
                }                               
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
        
                $html .= '<div class="nom_commun">'."\n";
                $html .= '<p id="nom_commun1">Nom Vulgaire : </p>'."\n";
                $html .= '<p id="nom_commun2">';
                if (isset($ligneIdentifiant)) {
                $html .= $ligneIdentifiant['nom_vulgaire'];
                }                               
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                $html .= '<div class="caracteres">'."\n";
                $html .= '<p id="caracteres1">Caractéristiques spécifiques : </p>'."\n";
                $html .= '<p id="caracteres2">';
                if (isset($ligneIdentifiant)) {
                $html .= $ligneIdentifiant['description'];
                }                               
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                $html .= '<div class="habitat">'."\n";
                $html .= '<p id="habitat1">Habitat / taille / floraison : </p>'."\n";
                $html .= '<p id="habitat2">';
                if (isset($ligneIdentifiant)) {
                $html .= $ligneIdentifiant['habitat'];
                }                               
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
        
                $html .= '<div class="aire">'."\n";
                $html .= '<p id="aire1">Aire g&eacute;ographique : </p>'."\n";
                $html .= '<p id="aire2">';
                if (isset($ligneIdentifiant)) {
                $html .= $ligneIdentifiant['geographie'];
                }                               
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                $html .= '<div class="identifiant">'."\n";
                $html .= '<p id="identifiant">';
                $html .= 'Bonnier : '.$identifiant;                             
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                $html .= '<div class="planche">'."\n";
                $html .= '<p id="planche">';
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                $html .= '<div class="retour">'."\n";
                $html .= '<p id="retour">'."\n";
                if (($ariane[$niveau - 2]) && $ariane[$niveau - 2] != '') {
                                $html .= '<a href="'.$ariane[$niveau - 2].'.html">';
                                $html .= $lignesTexteIdentifiant[$ariane[$niveau - 2]]['titre'];
                                $html .= '</a>'."\n";
                }
                $html .= '</p>'."\n";
                $html .= '</div>'."\n";
                
                $html .= '<div class="glossaire">'."\n";
                $html .= '<p id="glossaire">'."\n";
                $html .= '<a href="../000-general/glossaire0_640.html">'."\n";
                $html .= 'Glossaire'."\n";
                $html .= '</a>'."\n";
                $html .= '</p></div><div class="text">'."\n";
                $html .= '<p id="Text">'."\n";
                $html .= '<a href="../000-general/accueil1_640.html">'."\n";
                $html .= '   Top'."\n";
                $html .= '</a>'."\n";
                $html .= ' </p>'."\n";
                $html .= '</div>'."\n";

                $html .= '</body>'."\n";
                $html .= '</html>'."\n";
                
                fwrite($f_html, $html);
                fclose($f_html);        
        }


        private function creerTableBonnier($version, $table) {
                //+------------------------------------------------------------------------------------------------------------+
                // texte                
                $this->type_donnee = $table.'_texte';
                $requete =      'DROP TABLE IF EXISTS '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee;
                $this->traiterRequete($requete);                
                
                $requete =      'CREATE TABLE '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' ('.
                        'uid int(11) not null auto_increment,'.
                        'identifiant  varchar(25),'.
                        'titre  varchar(100),'.
                        'texte_1  varchar(255),'.
                        'texte_2  varchar(255),'.
                        'texte_3  varchar(255),'.
                        'texte_4  varchar(255),'.
                        'texte_5  varchar(255),'.
                        'texte_6  varchar(255),'.
                        'destination_1  varchar(25),'.
                        'destination_2  varchar(25),'.
                        'destination_3  varchar(25),'.
                        'destination_4  varchar(25),'.
                        'destination_5  varchar(25),'.
                        'destination_6  varchar(25),'.
                        'planche_croquis varchar(25),'.
                        'PRIMARY KEY (uid)'.
                        ') DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ' ;
                $this->traiterRequete($requete);
                
                //+------------------------------------------------------------------------------------------------------------+
                //plante 
                $this->type_donnee = $table.'_plante';
                $requete =      'DROP TABLE IF EXISTS '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee;
                $this->traiterRequete($requete);                
                $requete =      'CREATE TABLE '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' ('.
                        'uid int(11) not null auto_increment,'.
                        'identifiant  varchar(25),'.
                        'genre  varchar(100),'.
                        'nom_francais  varchar(100),'.
                        'nom_vulgaire  varchar(100),'.
                        'description   varchar(512),'.
                        'habitat       varchar(255),'.
                        'geographie    varchar(255),'.
                        'planche_croquis  varchar(25),'.
                        'PRIMARY KEY (uid)'.
                        ') DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ' ;
                
                $this->traiterRequete($requete);
        }

        protected function chargerDonnees($table) {
                print "Chargements des données ...";
                print "\n";
                
                $this->type_donnee = $table.'_texte';
                $this->chargerDonneesSql($table);
                
                $this->type_donnee = $table.'_plante';
                $this->chargerDonneesSql($table);
                
                return;
        }
        
        protected function chargerDonneesSql($table) {
                echo $this->type_donnee."\n";
                $fichier_sql = $this->chemin_fichier_tab.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.'.sql';
                
                print $fichier_sql."\n";
                
                if (file_exists($fichier_sql)) {
                        // Des champs textes sont multilignes, d'ou la boucle sur INSERT, marqueur de fin de la requete precedente.
                        if ($lines = file($fichier_sql))  {
                                $i = 0;
                                $ligne_courante = $lines[$i];
                                if (($i + 1) >= count($lines)) {
                                        $ligne_suivante = 'FIN';
                                } else {
                                        $ligne_suivante = $lines[$i+1];
                                }                       
                                while ($i < count($lines)) {
                                        $line_in = $ligne_courante;
                                        while (($i < count($lines)) && (substr($ligne_suivante, 0, 6) != 'INSERT') && ($ligne_suivante != 'FIN')) {
                                                $line_in .= $ligne_suivante;
                                                $i++;
                                                $ligne_courante = $lines[$i];
                                                if (($i + 1) >= count($lines))  {
                                                        $ligne_suivante = 'FIN';
                                                } else {
                                                $ligne_suivante = $lines[$i + 1];
                                                }
                                        }
                                                
                            $requete = $line_in;
                            
                            if (substr($requete, 0, 6) == 'INSERT') {
                                $requete = preg_replace('/ VALUES\(/',' VALUES(0,', $requete);
                                                $this->traiterRequete(utf8_encode($requete));
                            }
                                        
                            $i++;
                                        if (($i + 1) >= count($lines))  {
                                                $ligne_suivante = 'FIN';
                                        } else {
                                                $ligne_courante = $lines[$i];
                                                $ligne_suivante = $lines[$i + 1];
                                        }
                                        
                                        
                                        if ($i == (int) $this->getParam('t')) {
                                                break;
                                        }
                                }
                        }
                } else {
                        echo 'Fichier sql introuvable'."\n";
                }
     }  
}
?>