Blame | 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éesecho "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";// Navigationfor ($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 superieurif (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);}}}}// Planteprivate 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é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";}}}?>