* @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 = ''."\n". ''."\n". ''."\n". ''."\n". 'Flore BONNIER sur PDA'."\n". ''."\n". ''."\n"; $html .= ''."\n"; $html .= '
'."\n"; $html .= '

'; if (isset($ligneIdentifiant)) { $html .= $ligneIdentifiant['titre']; } $html .= '

'."\n"; $html .= '
'."\n"; // print "identifiant : ".$ligneIdentifiant['identifiant']."\n"; // Destinations // Branche niveau inferieur $html.='
'."\n"; for ($i = 1; $i < 6; $i++) { if (isset($ligneIdentifiant['texte_'.$i]) && $ligneIdentifiant['texte_'.$i] != "") { $html .= ''."\n"; } } $html .= '
'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= ''."\n"; $html .= '
'."\n"; $html .= '

'."\n"; // Retour niveau superieur if (isset($ariane[$niveau - 2]) && $ariane[$niveau - 2] != '') { $html .= ''; $html .= $lignesTexteIdentifiant[$ariane[$niveau - 2]]['titre']; $html .= ''."\n"; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

'."\n"; $html .= ''."\n"; $html .= 'Glossaire'."\n"; $html .= ''."\n"; $html .= '

'."\n"; $html .= '

'."\n"; $html .= ''."\n"; $html .= ' Top'."\n"; $html .= ''."\n"; $html .= '

'."\n"; $html .= '
'."\n"; $html .= ''."\n"; $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= ''."\n". ''."\n". ''."\n". ''."\n". 'Flore BONNIER sur PDA'."\n". ''."\n". ''."\n"; $html .= ''."\n"; $html .= '
'."\n"; $html .= '

'; $html .= $nom_latin; $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Famille :

'."\n"; $html .= '

'; $html .= $lignesTexteIdentifiant[$ariane[0]]['titre']; $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Genre :

'."\n"; $html .= '

'; if (isset($ligneIdentifiant)) { $html .= $ligneIdentifiant['genre']; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Nom Latin :

'."\n"; $html .= '

'; $html .= $nom_latin; $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Nom Francais :

'."\n"; $html .= '

'; if (isset($ligneIdentifiant)) { $html .= $ligneIdentifiant['nom_francais']; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Nom Vulgaire :

'."\n"; $html .= '

'; if (isset($ligneIdentifiant)) { $html .= $ligneIdentifiant['nom_vulgaire']; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Caractéristiques spécifiques :

'."\n"; $html .= '

'; if (isset($ligneIdentifiant)) { $html .= $ligneIdentifiant['description']; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Habitat / taille / floraison :

'."\n"; $html .= '

'; if (isset($ligneIdentifiant)) { $html .= $ligneIdentifiant['habitat']; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

Aire géographique :

'."\n"; $html .= '

'; if (isset($ligneIdentifiant)) { $html .= $ligneIdentifiant['geographie']; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

'; $html .= 'Bonnier : '.$identifiant; $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

'; $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

'."\n"; if (($ariane[$niveau - 2]) && $ariane[$niveau - 2] != '') { $html .= ''; $html .= $lignesTexteIdentifiant[$ariane[$niveau - 2]]['titre']; $html .= ''."\n"; } $html .= '

'."\n"; $html .= '
'."\n"; $html .= '
'."\n"; $html .= '

'."\n"; $html .= ''."\n"; $html .= 'Glossaire'."\n"; $html .= ''."\n"; $html .= '

'."\n"; $html .= '

'."\n"; $html .= ''."\n"; $html .= ' Top'."\n"; $html .= ''."\n"; $html .= '

'."\n"; $html .= '
'."\n"; $html .= ''."\n"; $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"; } } } ?>