Subversion Repositories eFlore/Applications.cel

Rev

Rev 1699 | Rev 1706 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1699 Rev 1702
Line 6... Line 6...
6
* @author    Raphaël Droz <raphael@tela-botania.org>
6
* @author    Raphaël Droz <raphael@tela-botania.org>
7
* @copyright 2013 Tela-Botanica
7
* @copyright 2013 Tela-Botanica
8
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
8
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
9
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
9
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
*/
10
*/
11
 
-
 
12
define('SEPARATEUR_IMAGES', ",");
11
define('SEPARATEUR_IMAGES', ",");
Line 13... Line 12...
13
 
12
 
Line -... Line 13...
-
 
13
Class FormateurGroupeColonne {
14
Class FormateurGroupeColonne {
14
 
Line -... Line 15...
-
 
15
	// cache pour les données des fonctions
-
 
16
	static $cache = Array();
-
 
17
 
-
 
18
	// test sur la table cel_references, mis à TRUE si la table existe
-
 
19
	static $is_table = false;
-
 
20
 
-
 
21
	// les données baseflor à récupérer: colonnes présentes dans cel_references
-
 
22
	// et intitulés associés
-
 
23
	static $baseflor_col = array(
-
 
24
		"ve_lumiere" => "Lumière",
-
 
25
		"ve_temperature" => "Température",
-
 
26
		"ve_continentalite" => "Continentalité",
-
 
27
		"ve_humidite_atmos" => "Humidité Atmosphérique",
-
 
28
		"ve_humidite_edaph" => "Humidité",
-
 
29
		"ve_reaction_sol" => "Réaction (pH)",
-
 
30
		"ve_nutriments_sol" => "Nutriments",
-
 
31
		"ve_salinite" => "Salinité",
-
 
32
		"ve_texture_sol" => "Texture" ,
-
 
33
		"ve_mat_org_sol" => "Matière Organique",
-
 
34
		"catminat_code" => "Code Catminat",
15
 
35
		"syntaxon" => "Syntaxon",
16
	static $cache = Array();
36
	);
17
 
37
 
18
	/*
38
	/*
19
	* @param $fieldSets: un liste de noms de colonnes ou de sets de colonnes
39
	* @param $fieldSets: un liste de noms de colonnes ou de sets de colonnes
Line 80... Line 100...
80
			   'images'				=> self::GenColInfo('images', 'Image(s)', 1, NULL, NULL /* cas particulier 'getImages' */, TRUE),
100
			   'images'				=> self::GenColInfo('images', 'Image(s)', 1, NULL, NULL /* cas particulier 'getImages' */, TRUE),
Line 81... Line 101...
81
 
101
 
82
			   /* 'nom_commun'			=> self::GenColInfo('nom_commun', 'Nom Commun', 1, NULL, 'getNomCommun', FALSE),
102
			   /* 'nom_commun'			=> self::GenColInfo('nom_commun', 'Nom Commun', 1, NULL, 'getNomCommun', FALSE),
83
				  'nom-commun'			=> self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, 'getNomCommun_v2'),
103
				  'nom-commun'			=> self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, 'getNomCommun_v2'),
84
				  'nom-commun'			=> self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, 'getNomCommun_v3'), */
104
				  'nom-commun'			=> self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, 'getNomCommun_v3'), */
-
 
105
			   'nom-commun'			=> self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, NULL /* cas particu 'getNomCommun_v4' */, TRUE, array(__CLASS__, 'getNomCommun_preload')),
-
 
106
			);
Line -... Line 107...
-
 
107
		}
-
 
108
 
-
 
109
		if(isset($groupe_de_champs['baseflor'])) {
-
 
110
			$colonnes += array(
85
			   'nom-commun'			=> self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, NULL /* cas particu 'getNomCommun_v4' */, TRUE, 'getNomCommun_preload'),
111
				// champ dynamique
86
 
112
				'baseflor'			=> self::GenColInfo('baseflor', '', 1, NULL, NULL, FALSE, array(__CLASS__, 'baseflor_preload'), array(__CLASS__, 'baseflor_ligne')),
Line 87... Line 113...
87
			);
113
			);
88
		}	
114
		}
Line 89... Line 115...
89
 
115
 
90
		return $colonnes;
116
		return $colonnes;
91
	}
117
	}
92
 
118
 
93
	static function preload($colonnes, $cel, $ids) {
119
	static function preload($colonnes, $cel, $ids) {
94
		$result = array();
120
		$result = array();
95
		foreach($colonnes as $abbrev => $colonne) {
121
		foreach($colonnes as $abbrev => $colonne) {
96
			if(!$colonne['preload']) continue;
122
			if(!$colonne['preload']) continue;
Line 97... Line 123...
97
			$result[$abbrev] = call_user_func(array(__CLASS__, $colonne['preload']), $cel, $ids);
123
			$result[$abbrev] = call_user_func($colonne['preload'], $cel, $ids);
-
 
124
		}
98
		}
125
		return $result;
99
		return $result;
126
	}
Line 100... Line 127...
100
	}
127
	
101
	
128
	public static function getIntitulesColonnes($colonnes) {
102
	public static function getIntitulesColonnes($colonnes) {
129
		// array_filter pour supprimer les colonnes "dynamique" n'ayant pas défini $nom (cf GenColInfo())
Line 110... Line 137...
110
	public static function getLigneObservation(&$obs, &$colonnes, $cel = false) {
137
	public static function getLigneObservation(&$obs, &$colonnes, $cel = false) {
Line 111... Line 138...
111
		
138
		
112
		$ligne_formatee = array();
139
		$ligne_formatee = array();
113
		foreach($colonnes as $abbrev => $colonne) {
140
		foreach($colonnes as $abbrev => $colonne) {
114
			$valeur = null;
141
			$valeur = null;
Line 115... Line 142...
115
			if($colonne['extra'] == 2) continue;
142
			if($colonne['extra'] == 2 || ! is_null($colonne['dyna'])) continue;
116
	
143
	
Line 117... Line 144...
117
			// valeur direct depuis cel_obs ?
144
			// valeur direct depuis cel_obs ?
Line 152... Line 179...
152
				
179
				
153
			// // fin de section "cas particuliers"
180
			// // fin de section "cas particuliers"
154
			$ligne_formatee[] = $valeur;
181
			$ligne_formatee[] = $valeur;
Line -... Line 182...
-
 
182
		}
-
 
183
 
155
		}
184
		// uniquement les champŝ dynamiques
-
 
185
		foreach($colonnes as $abbrev => $colonne) {
156
 
186
			$valeur = null;
-
 
187
			if(is_null($colonne['dyna'])) continue;
Line 157... Line 188...
157
		// TODO:
188
			$colonne['dyna']($cel, $obs, $ligne_formatee);
158
		// taxon => (code_catminat) => syntaxon => données baseveg
189
		}
Line 159... Line 190...
159
 
190
 
Line 168... Line 199...
168
	*		  En effet chaque ligne importée est accessible à l'aide du `define` de $abbrev en majuscule, préfixé de "C_"
199
	*		  En effet chaque ligne importée est accessible à l'aide du `define` de $abbrev en majuscule, préfixé de "C_"
169
	*		  Exemple: $ligne[C_LONGITUDE] pour "longitude".
200
	*		  Exemple: $ligne[C_LONGITUDE] pour "longitude".
170
	*		  cf: ImportXLS::detectionEntete()
201
	*		  cf: ImportXLS::detectionEntete()
Line 171... Line 202...
171
	
202
	
-
 
203
	* @param $nom (obligatoire): nom complet de colonne (utilisé pour la ligne d'en-tête)
-
 
204
	*		  Les définition de champs dynamique (correspondant à de multiples colonnes) doivent laisser cette valeur
Line 172... Line 205...
172
	* @param $nom (obligatoire): nom complet de colonne (utilisé pour la ligne d'en-tête)
205
	*		  vide afin de ne pas créer une colonne supplémentaire erronée.
173
	
206
	
174
	* @param $is_extra:
207
	* @param $is_extra:
175
	* Si 0, la colonne est une colonne standard
208
	* Si 0, la colonne est une colonne standard
Line 188... Line 221...
188
	* @param $importable (optionnel): défini si la colonne est traitée (ou absolument ignorée par PHPExcel) lors de
221
	* @param $importable (optionnel): défini si la colonne est traitée (ou absolument ignorée par PHPExcel) lors de
189
	*		  l'import.
222
	*		  l'import.
Line 190... Line 223...
190
 
223
 
191
	* @param $preload (optionnel): défini une fonction de préchargement massif de donnée potentiellement utilisable par $fonction_data.
224
	* @param $preload (optionnel): défini une fonction de préchargement massif de donnée potentiellement utilisable par $fonction_data.
192
	*		  Utile, notamment, dans le cadre de l'export
225
	*		  Utile, notamment, dans le cadre de l'export
-
 
226
 
-
 
227
	* @param $fonction_dynamique (optionnel): défini une fonction ajoutant un nombre arbitraire de colonnes à une ligne donnée
-
 
228
	*		  Utile, notamment, dans le cadre de l'export des champs étendus ou des données baseflor
-
 
229
	*		  La fonction doit TOUJOURS alterer la ligne en lui ajoutant une nombre CONSTANT d'éléments (NULL ou non)
193
	
230
	*		  La fonction doit prendre comme arguments ($cel, $obs, &$ligne_formatee)
194
	*/
231
	*/
195
	static function GenColInfo($abbrev, $nom, $is_extra = 0, $fonction = NULL, $fonction_data = NULL, $importable = TRUE, $preload = NULL) {
232
	static function GenColInfo($abbrev, $nom, $is_extra = 0, $fonction = NULL, $fonction_data = NULL, $importable = TRUE, $preload = NULL, $fonction_dynamique = NULL) {
196
		return Array('abbrev' => $abbrev,
233
		return Array('abbrev' => $abbrev,
197
					 'nom' => $nom,
234
					 'nom' => $nom,
198
					 'extra' => $is_extra ? 1 : 0,
235
					 'extra' => $is_extra ? 1 : 0,
199
					 'fonction' => $fonction,
236
					 'fonction' => $fonction,
200
					 'fonction_data' => $fonction_data,
237
					 'fonction_data' => $fonction_data,
201
					 'importable' => $importable,
238
					 'importable' => $importable,
-
 
239
					 'preload' => $preload,
202
					 'preload' => $preload,
240
					 'dyna' => $fonction_dynamique,
203
		);
241
		);
Line 204... Line 242...
204
	}
242
	}
205
	
243
	
Line 367... Line 405...
367
		self::$cache['getNomCommun'][$cache_id] = $nom;
405
		self::$cache['getNomCommun'][$cache_id] = $nom;
368
		return $nom;
406
		return $nom;
369
	}
407
	}
Line 370... Line 408...
370
 
408
 
371
	/* Cette fonction initialise le cache des noms communs en 1 fois, sur la liste des observations à exporter.
409
	/* Cette fonction initialise le cache des noms communs en 1 fois, sur la liste des observations à exporter.
372
	   Ainsi, les appels successifs à getNomCommun_v4() ne sont pas couteux (pas de requête SQL)
-
 
373
	 */
410
	   Ainsi, les appels successifs à getNomCommun_v4() ne sont pas couteux (pas de requête SQL) */
374
	static function getNomCommun_preload($cel, $obsids) {
411
	static function getNomCommun_preload($cel, $obsids) {
375
		if(!$obsids) return;
412
		if(!$obsids) return;
Line 376... Line 413...
376
		if(!$cel->executerRequete("SHOW TABLES LIKE 'cel_references'", Cel::SQL_RETOUR_LIGNE)) return NULL;
413
		if(!self::referenceTableExiste($cel)) return NULL;
377
 
414
 
378
		// CREATE INDEX i_nom_referentiel ON cel_obs (nom_referentiel(5));
415
		// CREATE INDEX i_nom_referentiel ON cel_obs (nom_referentiel(5));
379
		$req = sprintf("SELECT r.referentiel, r.num_taxon, r.nom_commun FROM cel_references r" .
416
		$req = sprintf("SELECT r.referentiel, r.num_taxon, r.nom_commun FROM cel_references r" .
Line 384... Line 421...
384
		foreach($res as $v) {
421
		foreach($res as $v) {
385
			self::$cache['getNomCommun'][$v['referentiel'] . '-' . $v['num_taxon'] . '-' . 'fra'] = $v['nom_commun'];
422
			self::$cache['getNomCommun'][$v['referentiel'] . '-' . $v['num_taxon'] . '-' . 'fra'] = $v['nom_commun'];
386
		}
423
		}
387
		return NULL;
424
		return NULL;
388
	}
425
	}
-
 
426
 
-
 
427
	static function referenceTableExiste($cel) {
-
 
428
		if(!self::$is_table) {
-
 
429
			// une seule fois
-
 
430
			if(! $cel->executerRequete("SHOW TABLES LIKE 'cel_references'", Cel::SQL_RETOUR_LIGNE)) return FALSE;
-
 
431
			self::$is_table = TRUE;
-
 
432
		}
-
 
433
		return TRUE;
-
 
434
	}
Line 389... Line 435...
389
					   
435
					   
390
	static function getNomCommun_v4($obs, $cel) {
-
 
391
		static $is_table = false;
436
	static function getNomCommun_v4($obs, $cel) {
-
 
437
		if(! $obs['nt']) return NULL;
Line 392... Line -...
392
		if(! $obs['nt']) return NULL;
-
 
393
 
-
 
394
		if(!$is_table) {
-
 
395
			// une seule fois
-
 
396
			if(! $cel->executerRequete("SHOW TABLES LIKE 'cel_references'", Cel::SQL_RETOUR_LIGNE)) return NULL;
-
 
397
			$is_table = true;
438
		if(! self::referenceTableExiste($cel)) return NULL;
398
		}
439
 
399
		$langue = 'fra';
440
		$langue = 'fra';
Line 400... Line 441...
400
		list($referentiel) = explode(':', strtolower($obs['nom_referentiel']));
441
		list($referentiel) = explode(':', strtolower($obs['nom_referentiel']));
Line 416... Line 457...
416
 
457
 
417
		// cache
458
		// cache
418
		self::$cache['getNomCommun'][$cache_id] = $nom;
459
		self::$cache['getNomCommun'][$cache_id] = $nom;
419
		return $nom;
460
		return $nom;
-
 
461
	}
-
 
462
 
-
 
463
 
-
 
464
	/* Cette fonction initialise le cache des données baseflor en 1 fois, sur la liste des observations à exporter.
-
 
465
	   Ainsi, les appels successifs à baseflor_ligne() ne sont pas couteux (pas de requête SQL) */
-
 
466
	static function baseflor_preload($cel, $obsids) {
-
 
467
		if(!$obsids) return;
-
 
468
		if(!self::referenceTableExiste($cel)) return NULL;
-
 
469
 
-
 
470
		$req = sprintf("SELECT referentiel, num_nom_retenu, %s FROM cel_references r" .
-
 
471
					   " INNER JOIN cel_obs c ON (r.num_nom_retenu = c.nom_ret_nn)" .
-
 
472
					   " WHERE c.id_observation IN (%s)",
-
 
473
					   //" AND catminat_code IS NOT NULL", // TODO: suppression des NULL ici signifie que le cache sera partiel...
-
 
474
					   implode(',', array_keys(self::$baseflor_col)),
-
 
475
					   implode(',', $obsids));
-
 
476
		$res = $cel->requeter($req);
-
 
477
 
-
 
478
		foreach($res as $v) {
-
 
479
			$data = $v;
-
 
480
			unset($data['referentiel']); // non nécessaire
-
 
481
			unset($data['num_nom_retenu']); // non nécessaire
-
 
482
			self::$cache['getBaseflor'][$v['referentiel'] . '-' . $v['num_nom_retenu']] = $data;
-
 
483
		}
-
 
484
 
-
 
485
		return NULL;
Line -... Line 486...
-
 
486
	}
-
 
487
	
-
 
488
 
-
 
489
	static function baseflor_ligne($cel, $obs, &$ligne) {
-
 
490
 
-
 
491
		if(! $obs['nom_ret_nn']) {
-
 
492
			$ligne = array_merge($ligne, array_fill(0, count(self::$baseflor_col), 'A'));
-
 
493
			return;
-
 
494
		}
-
 
495
 
-
 
496
		if(! self::referenceTableExiste($cel)) {
-
 
497
			$ligne = array_merge($ligne, array_fill(0, count(self::$baseflor_col), 'A'));
-
 
498
			return;
-
 
499
		}
-
 
500
 
-
 
501
		list($referentiel) = explode(':', strtolower($obs['nom_referentiel']));
-
 
502
		$cache_id = $referentiel . '-' . $obs['nom_ret_nn'];
-
 
503
 
-
 
504
		// XXX: problème de valeurs NULL pour utiliser simplement isset() ?
-
 
505
		// @ car getBaseflor[] n'est peut-être pas encore initialisé
-
 
506
		if(@array_key_exists($cache_id, self::$cache['getBaseflor'])) {
-
 
507
			$ligne = array_merge($ligne, self::$cache['getBaseflor'][$cache_id]);
-
 
508
			return;
-
 
509
		}
-
 
510
 
-
 
511
		// pas de cache:
-
 
512
		$data = $cel->executerRequete(sprintf("SELECT %s FROM cel_references " .
-
 
513
											 "WHERE referentiel = '%s' AND num_nom_retenu = %d LIMIT 1",
-
 
514
											 implode(', ', array_keys(self::$baseflor_col)),
-
 
515
											 $referentiel,
-
 
516
											 $obs['nom_ret_nn']),
-
 
517
									 Cel::SQL_RETOUR_LIGNE);
-
 
518
 
-
 
519
		if(! $data) {
-
 
520
			$ligne = array_merge($ligne, array_fill(0, count(self::$baseflor_col), 'A'));
-
 
521
			return;
-
 
522
		}
-
 
523
 
-
 
524
		// cache
420
	}
525
		self::$cache['getBaseflor'][$cache_id] = $data;
421
	
526
		$ligne = array_merge($ligne, $data);