New file |
0,0 → 1,508 |
<?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é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"; |
} |
} |
} |
?> |