Subversion Repositories eFlore/Projets.eflore-projets

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
343 jpm 1
<?php
2
// Encodage : UTF-8
3
// +-------------------------------------------------------------------------------------------------------------------+
4
/* Importation des fichiers excel de Bonnier pour créer une version HTML pour PDA.
5
 * Utilisation au préalable des utillitaire de traitement de fichier mdb sous Unix (voir ci après)
6
 *
7
 *  Pré-requis :
8
 *  1. Installer  le paquet pour Perl nommé ParseExcel : urpmi perl-spreadsheet-parseexcel
9
 *  2. Télécharger les fichiers Excel de Bonnier : http://www.tela-botanica.org/projets/74/documents/16211
10
 *  3. Créer un dossier où vous dézipperez l'archive des fichiers Excel
11
 *  4. Copier dans ce dossier les fichier xls2sql.pl et generer_sql.sh que vous trouverez dans le dossier shell de ce module
12
 *  5. Donner les droits d'execution au fichier generer_sql.sh et lancer le : ./generer_sql.sh
13
 *  6. Vous devez obtenir un fichier SQL par fichier Excel.
14
 *
15
 *  Pour lancer ce script fichier par fichier :
16
 *  1. Ouvrir une console et se positionner dans le dossier "scripts"
17
 *  2. Pour charger le 1er fichier Excel, taper la commande : /opt/lampp/bin/php script.php  bonnier -p bonnier -a charger  -table renonculacees
18
 *  3. Pour generer le html issu du chargement precedent :
19
 *  /opt/lampp/bin/php script.php  bonnier -p bonnier -a html -dossier "menus/001-Renonculacees" -table renonculacees
20
 *
21
 * // Auteur original :
22
 * @author      David DELON <david@clapas.net>
23
 * @copyright	David DELON 2009
24
 * @link		http://www.tela-botanica.org/wikini/eflore
25
 * @licence		GPL v3 & CeCILL v2
26
 * @version		$Id$
27
 */
28
// +-------------------------------------------------------------------------------------------------------------------+
29
class Bonnier extends ScriptCommandeEflore {
30
 
31
	/**
32
	 * Paramêtres disponible pour la ligne de commande
33
	 * le tableau se construit de la forme suivnate :
34
	 * - clé =  nom du paramêtre '-foo'
35
	 * - value = contient un nouveau tableau composé de cette façaon :
36
	 *  - booléen: true si le paramêtre est obligatoire
37
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
38
	 *  - string: description du contenu du paramêtre
39
	 * Les paramêtres optionels devraient être déclaré à la fin du tableau.
40
	 * Le dernier parametre du tableau peut avoir la valeur '...',
41
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
42
	 * @var array
43
	 */
44
	public $parametres = array(	'-table' => array(true, true, "Nom de la table où seront stockées les données d'une famille"),
45
								'-dossier' => array(true, true, "Dossier où sont générés les fichiers html pour la table"));
46
 
47
	public function executer() {
48
 
49
		error_reporting(E_ALL &  ~E_DEPRECATED );
50
 
51
		$table = $this->getParam('table');
52
		$dossier = $this->getParam('dossier');
53
 
54
		@mkdir($this->getIni('chemin_fichier_sortie').$dossier);
55
 
56
		$cmd = $this->getParam('a');
57
		switch ($cmd) {
58
			// chargement des fichiers sql issus de la transformation xls dans la base de donnee, une table par fichir sql, 2 tables par
59
			// familles : texte (navigation / clef) et plantes : description des plantes.
60
			case 'charger' :
61
				$this->creerTableBonnier($this->version, $table);
62
				$this->chargerDonnees($table);
63
				break;
64
			case 'html' :
65
			// tranformation sql vers html : pour la famille considerée : parcours de l'ensemble de ses clef et generation html pour
66
			// les feuilles.
67
 
68
				$this->realiserHtml($dossier, $table);
69
				break;
70
			default :
71
				trigger_error('Erreur : la commande "'.$cmd.'" n\'existe pas!'."\n", E_USER_ERROR);
72
		}
73
	}
74
 
75
	private function realiserHtml($dossier, $table) {
76
		// Parcours de l'ensemble des données ? ou famille par famille ?
77
 
78
		// on charge plante et texte dans des tableaux
79
 
80
		$this->type_donnee = $table.'_texte';
81
 
82
		$requete = 	'SELECT * '.
83
					'FROM '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' '.
84
					'ORDER BY uid';
85
 
86
		$lignesTexte = $this->retournerDonneesRequete($requete);
87
 
88
		// Analyse des données
89
		echo "Analyse des données : ".$this->type_donnee."\n";
90
		foreach ($lignesTexte as $ligneTexte) {
91
			if (!isset($aso_lignes[$ligneTexte['identifiant']])) {
92
				$aso_lignes[$ligneTexte['identifiant']] = $ligneTexte;
93
			} else {
94
				echo "identifiant en double : ".$ligneTexte['identifiant']."\n";
95
			}
96
		}
97
 
98
		$this->type_donnee = $table.'_plante';
99
 
100
		$requete = 	'SELECT * '.
101
					'FROM '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' '.
102
					'ORDER BY uid';
103
 
104
		$lignesPlante = $this->retournerDonneesRequete($requete);
105
 
106
		foreach ($lignesPlante as $lignePlante) {
107
			if (!isset($aso_lignes[$lignePlante['identifiant']])) {
108
				$aso_lignes[$lignePlante['identifiant']] = $lignePlante;
109
			} else {
110
				echo "identifiant en double : ".$lignePlante['identifiant']."\n";
111
			}
112
		}
113
 
114
		//print_r($aso_lignes_texte[$lignesTexte[0]['identifiant']]  ['titre']);
115
 
116
		// $ariane : tableau des identifiants parcourus dans la branche
117
		// $niveau : niveau dans l'arbre
118
 
119
		$ariane = array();
120
		$niveau = 0;
121
 
122
		// Parcours de l'arbre des clefs depuis la racine
123
 
124
		$this->genererHtmlTexte($lignesTexte[1]['identifiant'], $aso_lignes, $ariane, $niveau, $dossier);
125
	}
126
 
127
 
128
	// Generation des elements de navigation (clef)
129
 
130
	private function genererHtmlTexte($identifiant, $lignesTexteIdentifiant, $ariane, $niveau, $dossier) {
131
 
132
 
133
		$ariane[] = $identifiant;
134
		$niveau++;
135
 
136
		if (isset ($lignesTexteIdentifiant[$identifiant])) {  // Si des identifiants sont en doubles
137
			$ligneIdentifiant = $lignesTexteIdentifiant[$identifiant];
138
		}
139
		else {
140
			// initialiser valeur par defaut indiquant une erreur
141
		}
142
 
143
 
144
		$f_html = fopen($this->getIni('chemin_fichier_sortie').$dossier.'/'.$identifiant.'.html', 'wb');
145
 
146
		$html =
147
		'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n".
148
		'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">'."\n".
149
		'<head>'."\n".
150
		'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'."\n".
151
		'<title>Flore BONNIER sur PDA</title>'."\n".
152
		'<link rel="stylesheet" type="text/css" href="../../style/style640.css" media="screen" />'."\n".
153
		'</head>'."\n";
154
 
155
		$html .= '<body>'."\n";
156
		$html .= '<div class="titre">'."\n";
157
		$html .= '<p id="titre">';
158
		if (isset($ligneIdentifiant)) {
159
			$html .= $ligneIdentifiant['titre'];
160
		}
161
		$html .= '</p>'."\n";
162
		$html .= '</div>'."\n";
163
		// print "identifiant : ".$ligneIdentifiant['identifiant']."\n";
164
 
165
		// Destinations
166
		// Branche niveau inferieur
167
 
168
		$html.='<div class="fenetreMenu">'."\n";
169
 
170
		for ($i = 1; $i < 6; $i++) {
171
			if (isset($ligneIdentifiant['texte_'.$i]) && $ligneIdentifiant['texte_'.$i] != "") {
172
				$html .= '<div class="menu'.($i-1).'">'."\n";
173
				$html .= '<a href="'.$ligneIdentifiant['destination_'.$i].'.html">';
174
				$html .= $ligneIdentifiant['texte_'.$i];
175
				$html .= '</a>'."\n";
176
				$html .= '</div>'."\n";
177
			}
178
		}
179
 
180
		$html .= '</div>'."\n";
181
		$html .= '<div class="espace" style="top:518px;">'."\n";
182
  		$html .= '</div>'."\n";
183
		$html .= '<div class="navigation">'."\n";
184
		$html .= '<p id="navigation">'."\n";
185
 
186
 
187
		// Navigation
188
 
189
		for ($i = 0; $i < $niveau; $i++) {
190
			if (($ariane[$i]) && $ariane[$i] != '') {
191
				$html .= '<a href="'.$ariane[$i].'.html">';
192
				if (isset ($lignesTexteIdentifiant[$ariane[$i]])) {  // Si des identifiants sont en doubles
193
					$html .= $lignesTexteIdentifiant[$ariane[$i]]['titre'];
194
				}
195
				$html .= '</a>'."\n";
196
			}
197
		}
198
 
199
		$html .= '</p>'."\n";
200
		$html .= '</div>'."\n";
201
 
202
		$html .= '<div class="retour">'."\n";
203
		$html .= '<p id="retour">'."\n";
204
 
205
		// Retour niveau superieur
206
 
207
		if (isset($ariane[$niveau - 2]) && $ariane[$niveau - 2] != '') {
208
				$html .= '<a href="'.$ariane[$niveau - 2].'.html">';
209
				$html .= $lignesTexteIdentifiant[$ariane[$niveau - 2]]['titre'];
210
				$html .= '</a>'."\n";
211
		}
212
 
213
		$html .= '</p>'."\n";
214
		$html .= '</div>'."\n";
215
 
216
 
217
		$html .= '<div class="glossaire">'."\n";
218
		$html .= '<p id="glossaire">'."\n";
219
		$html .= '<a href="../000-general/glossaire0_640.html">'."\n";
220
		$html .= 'Glossaire'."\n";
221
		$html .= '</a>'."\n";
222
		$html .= '</p></div><div class="text">'."\n";
223
		$html .= '<p id="Text">'."\n";
224
		$html .= '<a href="../000-general/accueil1_640.html">'."\n";
225
		$html .= '   Top'."\n";
226
		$html .= '</a>'."\n";
227
		$html .= ' </p>'."\n";
228
		$html .= '</div>'."\n";
229
 
230
		$html .= '</body>'."\n";
231
		$html .= '</html>'."\n";
232
 
233
		fwrite($f_html, $html);
234
		fclose($f_html);
235
 
236
		// Ecriture des feuilles (description plantes)
237
 
238
		for ($i = 1; $i < 6; $i++) {
239
			if (isset($ligneIdentifiant['destination_'.$i]) && $ligneIdentifiant['destination_'.$i] != '') {
240
				if (substr($ligneIdentifiant['destination_'.$i], 0, 1) == 'p') {
241
					$this->genererHtmlPlante($ligneIdentifiant['destination_'.$i], $lignesTexteIdentifiant, $ariane, $niveau, $dossier);
242
				} else {
243
					$this->genererHtmlTexte($ligneIdentifiant['destination_'.$i], $lignesTexteIdentifiant, $ariane, $niveau, $dossier);
244
				}
245
			}
246
		}
247
	}
248
 
249
	// Plante
250
	private function genererHtmlPlante($identifiant, $lignesTexteIdentifiant, $ariane, $niveau, $dossier) {
251
		$ariane[] = $identifiant;
252
		$niveau++;
253
 
254
	    if (isset ($lignesTexteIdentifiant[$identifiant])) {  // Au cas ou  des identifiants sont en doubles
255
			$ligneIdentifiant = $lignesTexteIdentifiant[$identifiant];
256
	    }
257
 
258
		$nom_latin = '';
259
		if (isset($ariane[($niveau - 2)]) && isset($lignesTexteIdentifiant[$ariane[($niveau - 2)]]['texte_1'])) {
260
			$nom_latin = trim(strrchr($lignesTexteIdentifiant[$ariane[($niveau - 2)]]['texte_1'], ':'), ' :');
261
		}
262
 
263
		$f_html = fopen($this->getIni('chemin_fichier_sortie').$dossier.'/'.$identifiant.'.html', 'wb');
264
		$html=
265
		'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n".
266
		'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">'."\n".
267
		'<head>'."\n".
268
		'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'."\n".
269
		'<title>Flore BONNIER sur PDA</title>'."\n".
270
		'<link rel="stylesheet" type="text/css" href="../../style/style_plante.css" media="screen" />'."\n".
271
		'</head>'."\n";
272
 
273
		$html .= '<body>'."\n";
274
		$html .= '<div class="titre">'."\n";
275
		$html .= '<p id="titre">';
276
		$html .= $nom_latin;
277
		$html .= '</p>'."\n";
278
		$html .= '</div>'."\n";
279
 
280
 
281
		$html .= '<div class="famille">'."\n";
282
   		$html .= '<p id="famille1">Famille : </p>'."\n";
283
		$html .= '<p id="famille2">';
284
		$html .= $lignesTexteIdentifiant[$ariane[0]]['titre'];
285
		$html .= '</p>'."\n";
286
		$html .= '</div>'."\n";
287
 
288
		$html .= '<div class="genre">'."\n";
289
   		$html .= '<p id="genre1">Genre : </p>'."\n";
290
		$html .= '<p id="genre2">';
291
		if (isset($ligneIdentifiant)) {
292
		$html .= $ligneIdentifiant['genre'];
293
		}
294
		$html .= '</p>'."\n";
295
		$html .= '</div>'."\n";
296
 
297
		$html .= '<div class="nom_latin">'."\n";
298
   		$html .= '<p id="nom_latin1">Nom Latin : </p>'."\n";
299
		$html .= '<p id="nom_latin2">';
300
		$html .= $nom_latin;
301
		$html .= '</p>'."\n";
302
		$html .= '</div>'."\n";
303
 
304
		$html .= '<div class="nom_francais">'."\n";
305
   		$html .= '<p id="nom_francais1">Nom Francais : </p>'."\n";
306
		$html .= '<p id="nom_francais2">';
307
		if (isset($ligneIdentifiant)) {
308
		$html .= $ligneIdentifiant['nom_francais'];
309
		}
310
		$html .= '</p>'."\n";
311
		$html .= '</div>'."\n";
312
 
313
		$html .= '<div class="nom_commun">'."\n";
314
   		$html .= '<p id="nom_commun1">Nom Vulgaire : </p>'."\n";
315
		$html .= '<p id="nom_commun2">';
316
		if (isset($ligneIdentifiant)) {
317
		$html .= $ligneIdentifiant['nom_vulgaire'];
318
		}
319
		$html .= '</p>'."\n";
320
		$html .= '</div>'."\n";
321
 
322
		$html .= '<div class="caracteres">'."\n";
323
   		$html .= '<p id="caracteres1">Caractéristiques spécifiques : </p>'."\n";
324
		$html .= '<p id="caracteres2">';
325
		if (isset($ligneIdentifiant)) {
326
		$html .= $ligneIdentifiant['description'];
327
		}
328
		$html .= '</p>'."\n";
329
		$html .= '</div>'."\n";
330
 
331
		$html .= '<div class="habitat">'."\n";
332
   		$html .= '<p id="habitat1">Habitat / taille / floraison : </p>'."\n";
333
		$html .= '<p id="habitat2">';
334
		if (isset($ligneIdentifiant)) {
335
		$html .= $ligneIdentifiant['habitat'];
336
		}
337
		$html .= '</p>'."\n";
338
		$html .= '</div>'."\n";
339
 
340
		$html .= '<div class="aire">'."\n";
341
   		$html .= '<p id="aire1">Aire g&eacute;ographique : </p>'."\n";
342
		$html .= '<p id="aire2">';
343
		if (isset($ligneIdentifiant)) {
344
		$html .= $ligneIdentifiant['geographie'];
345
		}
346
		$html .= '</p>'."\n";
347
		$html .= '</div>'."\n";
348
 
349
		$html .= '<div class="identifiant">'."\n";
350
		$html .= '<p id="identifiant">';
351
		$html .= 'Bonnier : '.$identifiant;
352
		$html .= '</p>'."\n";
353
		$html .= '</div>'."\n";
354
 
355
		$html .= '<div class="planche">'."\n";
356
		$html .= '<p id="planche">';
357
		$html .= '</p>'."\n";
358
		$html .= '</div>'."\n";
359
 
360
		$html .= '<div class="retour">'."\n";
361
		$html .= '<p id="retour">'."\n";
362
		if (($ariane[$niveau - 2]) && $ariane[$niveau - 2] != '') {
363
				$html .= '<a href="'.$ariane[$niveau - 2].'.html">';
364
				$html .= $lignesTexteIdentifiant[$ariane[$niveau - 2]]['titre'];
365
				$html .= '</a>'."\n";
366
		}
367
		$html .= '</p>'."\n";
368
		$html .= '</div>'."\n";
369
 
370
		$html .= '<div class="glossaire">'."\n";
371
		$html .= '<p id="glossaire">'."\n";
372
		$html .= '<a href="../000-general/glossaire0_640.html">'."\n";
373
		$html .= 'Glossaire'."\n";
374
		$html .= '</a>'."\n";
375
		$html .= '</p></div><div class="text">'."\n";
376
		$html .= '<p id="Text">'."\n";
377
		$html .= '<a href="../000-general/accueil1_640.html">'."\n";
378
		$html .= '   Top'."\n";
379
		$html .= '</a>'."\n";
380
		$html .= ' </p>'."\n";
381
		$html .= '</div>'."\n";
382
 
383
		$html .= '</body>'."\n";
384
		$html .= '</html>'."\n";
385
 
386
		fwrite($f_html, $html);
387
		fclose($f_html);
388
	}
389
 
390
 
391
	private function creerTableBonnier($version, $table) {
392
		//+------------------------------------------------------------------------------------------------------------+
393
		// texte
394
		$this->type_donnee = $table.'_texte';
395
		$requete = 	'DROP TABLE IF EXISTS '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee;
396
		$this->traiterRequete($requete);
397
 
398
		$requete = 	'CREATE TABLE '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' ('.
399
			'uid int(11) not null auto_increment,'.
400
			'identifiant  varchar(25),'.
401
		 	'titre  varchar(100),'.
402
		 	'texte_1  varchar(255),'.
403
		 	'texte_2  varchar(255),'.
404
		 	'texte_3  varchar(255),'.
405
		 	'texte_4  varchar(255),'.
406
		 	'texte_5  varchar(255),'.
407
		 	'texte_6  varchar(255),'.
408
		 	'destination_1  varchar(25),'.
409
		 	'destination_2  varchar(25),'.
410
		 	'destination_3  varchar(25),'.
411
		 	'destination_4  varchar(25),'.
412
		 	'destination_5  varchar(25),'.
413
		 	'destination_6  varchar(25),'.
414
			'planche_croquis varchar(25),'.
415
			'PRIMARY KEY (uid)'.
416
			') DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ' ;
417
		$this->traiterRequete($requete);
418
 
419
		//+------------------------------------------------------------------------------------------------------------+
420
		//plante
421
		$this->type_donnee = $table.'_plante';
422
		$requete = 	'DROP TABLE IF EXISTS '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee;
423
		$this->traiterRequete($requete);
424
		$requete = 	'CREATE TABLE '.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.' ('.
425
			'uid int(11) not null auto_increment,'.
426
			'identifiant  varchar(25),'.
427
		 	'genre  varchar(100),'.
428
		 	'nom_francais  varchar(100),'.
429
		 	'nom_vulgaire  varchar(100),'.
430
		 	'description   varchar(512),'.
431
		 	'habitat       varchar(255),'.
432
		 	'geographie    varchar(255),'.
433
		 	'planche_croquis  varchar(25),'.
434
		 	'PRIMARY KEY (uid)'.
435
			') DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ' ;
436
 
437
		$this->traiterRequete($requete);
438
	}
439
 
440
	protected function chargerDonnees($table) {
441
		print "Chargements des données ...";
442
		print "\n";
443
 
444
		$this->type_donnee = $table.'_texte';
445
		$this->chargerDonneesSql($table);
446
 
447
		$this->type_donnee = $table.'_plante';
448
		$this->chargerDonneesSql($table);
449
 
450
		return;
451
	}
452
 
453
	protected function chargerDonneesSql($table) {
454
		echo $this->type_donnee."\n";
455
		$fichier_sql = $this->chemin_fichier_tab.$this->projet_nom.'_v'.$this->version.'_'.$this->sous_version.'_'.$this->type_donnee.'.sql';
456
 
457
		print $fichier_sql."\n";
458
 
459
		if (file_exists($fichier_sql)) {
460
			// Des champs textes sont multilignes, d'ou la boucle sur INSERT, marqueur de fin de la requete precedente.
461
			if ($lines = file($fichier_sql))  {
462
				$i = 0;
463
				$ligne_courante = $lines[$i];
464
				if (($i + 1) >= count($lines)) {
465
					$ligne_suivante = 'FIN';
466
				} else {
467
					$ligne_suivante = $lines[$i+1];
468
				}
469
				while ($i < count($lines)) {
470
					$line_in = $ligne_courante;
471
					while (($i < count($lines)) && (substr($ligne_suivante, 0, 6) != 'INSERT') && ($ligne_suivante != 'FIN')) {
472
						$line_in .= $ligne_suivante;
473
						$i++;
474
						$ligne_courante = $lines[$i];
475
						if (($i + 1) >= count($lines))  {
476
							$ligne_suivante = 'FIN';
477
						} else {
478
						$ligne_suivante = $lines[$i + 1];
479
						}
480
					}
481
 
482
		            $requete = $line_in;
483
 
484
		            if (substr($requete, 0, 6) == 'INSERT') {
485
		            	$requete = preg_replace('/ VALUES\(/',' VALUES(0,', $requete);
486
						$this->traiterRequete(utf8_encode($requete));
487
		            }
488
 
489
		            $i++;
490
					if (($i + 1) >= count($lines))  {
491
						$ligne_suivante = 'FIN';
492
					} else {
493
						$ligne_courante = $lines[$i];
494
						$ligne_suivante = $lines[$i + 1];
495
					}
496
 
497
 
498
					if ($i == (int) $this->getParam('t')) {
499
						break;
500
					}
501
				}
502
			}
503
		} else {
504
			echo 'Fichier sql introuvable'."\n";
505
		}
506
     }
507
}
508
?>