Subversion Repositories eFlore/Applications.cel

Rev

Rev 2394 | Rev 2458 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2394 Rev 2447
Line 1... Line 1...
1
<?php
1
<?php
2
/**
-
 
3
 * @category  PHP
-
 
4
 * @package   jrest
-
 
5
 * @author    Raphaël Droz <raphael@tela-botania.org>
-
 
6
 * @copyright 2013 Tela-Botanica
2
// declare(encoding='UTF-8');
7
 * @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
-
 
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
-
 
9
 */
-
 
10
 
-
 
11
/**
3
/**
12
 * Service d'import de données d'observation du CEL au format XLS
4
 * Service d'import de données d'observation du CEL au format XLS
13
 *
5
 *
14
 * Sont define()'d commme n° de colonne tous les abbrevs retournés par
6
 * Sont define()'d commme n° de colonne tous les abbrevs retournés par
15
 * FormateurGroupeColonne::nomEnsembleVersListeColonnes() préfixés par C_  cf: detectionEntete()
7
 * FormateurGroupeColonne::nomEnsembleVersListeColonnes() préfixés par C_  cf: detectionEntete()
Line 18... Line 10...
18
 * $ GET "/jrest/ExportXLS/22506?format=csv&range=*&limite=13" \
10
 * $ GET "/jrest/ExportXLS/22506?format=csv&range=*&limite=13" \
19
 *   | curl -F "upload=@-" -F utilisateur=22506 "/jrest/ImportXLS"
11
 *   | curl -F "upload=@-" -F utilisateur=22506 "/jrest/ImportXLS"
20
 * # 13 observations importées
12
 * # 13 observations importées
21
 * + cf MySQL general_log = 1
13
 * + cf MySQL general_log = 1
22
 *  
14
 *
-
 
15
 * @category   DEL
-
 
16
 * @package    Services
-
 
17
 * @subpackage Communes
-
 
18
 * @version    0.1
-
 
19
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
-
 
20
 * @author     Raphaël DROZ <raphael@tela-botanica.org>
-
 
21
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
-
 
22
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
-
 
23
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
-
 
24
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
-
 
25
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
23
 **/
26
 */
24
 
-
 
25
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
27
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
26
// TERM
28
// TERM
27
error_reporting(-1);
29
error_reporting(-1);
28
ini_set('html_errors', 0);
30
ini_set('html_errors', 0);
29
ini_set('xdebug.cli_color', 2);
31
ini_set('xdebug.cli_color', 2);
30
require_once('lib/PHPExcel/Classes/PHPExcel.php');
32
require_once('lib/PHPExcel/Classes/PHPExcel.php');
31
require_once('FormateurGroupeColonne.php');
33
require_once('FormateurGroupeColonne.php');
Line 32... Line -...
32
 
-
 
33
 
34
 
Line 34... Line 35...
34
date_default_timezone_set("Europe/Paris");
35
date_default_timezone_set('Europe/Paris');
35
 
36
 
36
// nombre d'INSERT à cumuler par requête SQL
37
// nombre d'INSERT à cumuler par requête SQL
37
// (= nombre de lignes XLS à bufferiser)
38
// (= nombre de lignes XLS à bufferiser)
Line 43... Line 44...
43
define('QUICK_CSV_IMPORT', TRUE);
44
define('QUICK_CSV_IMPORT', TRUE);
Line 44... Line 45...
44
 
45
 
45
// Numbers of days between January 1, 1900 and 1970 (including 19 leap years)
46
// Numbers of days between January 1, 1900 and 1970 (including 19 leap years)
46
// see traiterDateObs()
47
// see traiterDateObs()
47
// define("MIN_DATES_DIFF", 25569);
-
 
48
 
-
 
49
 
48
// define("MIN_DATES_DIFF", 25569);
50
class MyReadFilter implements PHPExcel_Reader_IReadFilter {
49
class MyReadFilter implements PHPExcel_Reader_IReadFilter {
51
    // exclusion de colonnes
50
	// exclusion de colonnes
Line 52... Line 51...
52
    public $exclues = array();
51
	public $exclues = array();
Line 56... Line 55...
56
    public $ligne_fin = 0;
55
	public $ligne_fin = 0;
Line 57... Line 56...
57
    
56
 
Line 58... Line 57...
58
    public static $gestion_mots_cles = null;
57
	public static $gestion_mots_cles = null;
-
 
58
 
59
 
59
	public function __construct() {}
60
    public function __construct() {}
60
 
61
    public function def_interval($debut, $nb) {
61
	public function def_interval($debut, $nb) {
62
	$this->ligne_debut = $debut;
62
		$this->ligne_debut = $debut;
-
 
63
		$this->ligne_fin = $debut + $nb;
63
	$this->ligne_fin = $debut + $nb;
64
	}
64
    }
65
 
65
    public function readCell($colonne, $ligne, $worksheetName = '') {
66
	public function readCell($colonne, $ligne, $worksheetName = '') {
66
	if(@$this->exclues[$colonne]) return false;
67
		if(@$this->exclues[$colonne]) return false;
67
	// si des n° de morceaux ont été initialisés, on filtre...
68
		// si des n° de morceaux ont été initialisés, on filtre...
68
	if($this->ligne_debut && ($ligne < $this->ligne_debut || $ligne >= $this->ligne_fin)) return false;
69
		if($this->ligne_debut && ($ligne < $this->ligne_debut || $ligne >= $this->ligne_fin)) return false;
69
	return true;
70
		return true;
Line 70... Line -...
70
    } 
-
 
71
} 
71
	}
72
 
72
}
73
// XXX: PHP 5.3
73
 
74
function __anonyme_1($v) {	return !$v['importable']; }
74
function __anonyme_1($v) {	return !$v['importable']; }
75
function __anonyme_2(&$v) {	$v = $v['nom']; }
75
function __anonyme_2(&$v) {	$v = $v['nom']; }
Line 135... Line 135...
135
      Ces colonnes:
135
	 Ces colonnes:
136
      - sont propres à l'ensemble des enregistrements uploadés
136
	 - sont propres à l'ensemble des enregistrements uploadés
137
      - sont indépendantes du numéro de lignes
137
	 - sont indépendantes du numéro de lignes
138
      - n'ont pas de valeur par défaut dans la structure de la table
138
	 - n'ont pas de valeur par défaut dans la structure de la table
139
      - nécessitent une initialisation dans le cadre de l'upload
139
	 - nécessitent une initialisation dans le cadre de l'upload
140
 
-
 
141
      initialiser_colonnes_statiques() y merge les données d'identification utilisateur
140
	 initialiser_colonnes_statiques() y merge les données d'identification utilisateur
142
    */
141
	*/
143
    public $colonnes_statiques = Array(
142
	public $colonnes_statiques = array(
144
	"ce_utilisateur" => NULL,
143
		"ce_utilisateur" => NULL,
145
	"prenom_utilisateur" => NULL,
144
		"prenom_utilisateur" => NULL,
146
	"nom_utilisateur" => NULL,
145
		"nom_utilisateur" => NULL,
147
	"courriel_utilisateur" => NULL,
146
		"courriel_utilisateur" => NULL,
Line 175... Line 174...
175
	}
174
		}
Line 176... Line 175...
176
 
175
 
177
	$id_utilisateur = intval($pairs['utilisateur']);
176
		$id_utilisateur = intval($pairs['utilisateur']);
Line 178... Line 177...
178
	$this->id_utilisateur = $id_utilisateur; // pour traiterImage();
177
		$this->id_utilisateur = $id_utilisateur; // pour traiterImage();
-
 
178
 
-
 
179
		if (!isset($_SESSION)) {
179
 
180
			session_start();
Line 180... Line 181...
180
	if(!isset($_SESSION)) session_start();
181
		}
181
	$this->controleUtilisateur($id_utilisateur);
-
 
182
 
-
 
183
	$this->utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
-
 
184
	
182
		$this->controleUtilisateur($id_utilisateur);
185
 
-
 
186
 
-
 
187
	$this->initialiser_colonnes_statiques($id_utilisateur);
-
 
188
 
-
 
189
	// initialisation du statement PDO/MySQL
-
 
190
	// première version, pattern de requête pas génial
-
 
191
	/* list(self;;$insert_prefix_ordre, self::$insert_ligne_pattern_ordre) =
183
 
Line 192... Line 184...
192
	   $this->initialiser_pdo_ordered_statements($this->colonnes_statiques); */
184
		$this->utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
Line 193... Line -...
193
	list(self::$insert_prefix, self::$insert_ligne_pattern) =
-
 
194
	    $this->initialiser_pdo_statements($this->colonnes_statiques);
-
 
195
 
-
 
196
	$infos_fichier = array_pop($_FILES);
-
 
197
		
-
 
198
	/*$objPHPExcel = PHPExcel_IOFactory::load($infos_fichier['tmp_name']);
-
 
199
	  $donnees = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);*/
-
 
200
 
-
 
201
	/*$objReader = PHPExcel_IOFactory::createReader("Excel5");
-
 
202
	  $objReader->setReadDataOnly(true);
185
		$this->initialiser_colonnes_statiques($id_utilisateur);
203
	  $objPHPExcel = $objReader->load($infos_fichier['tmp_name']);*/
186
		list(self::$insert_prefix, self::$insert_ligne_pattern) = $this->initialiser_pdo_statements($this->colonnes_statiques);
204
 
187
 
205
	//var_dump($donnees);
188
		$infos_fichier = array_pop($_FILES);
206
 
189
 
207
	// renomme le fichier pour lui ajouter son extension initiale, ce qui
-
 
208
	// permet (une sorte) d'autodétection du format.
190
		// renomme le fichier pour lui ajouter son extension initiale, ce qui
209
	$fichier = $infos_fichier['tmp_name'];
191
		// permet (une sorte) d'autodétection du format.
Line 210... Line 192...
210
	$extension = pathinfo($infos_fichier['name'], PATHINFO_EXTENSION);
192
		$fichier = $infos_fichier['tmp_name'];
211
	if( (strlen($extension) == 3 || strlen($extension) == 4) &&
193
		$extension = pathinfo($infos_fichier['name'], PATHINFO_EXTENSION);
212
	    (@rename($fichier, $fichier . '.' . $extension))) { // XXX: @ safe-mode
194
		if ( (strlen($extension) == 3 || strlen($extension) == 4) && (@rename($fichier, "$fichier.$extension"))) {
Line 213... Line 195...
213
	    $fichier = $fichier . '.' . $extension;
195
			$fichier = "$fichier.$extension";
214
	}
196
		}
215
 
197
 
-
 
198
		$objReader = PHPExcel_IOFactory::createReaderForFile($fichier);
216
	$objReader = PHPExcel_IOFactory::createReaderForFile($fichier);
199
		// TODO: check if compatible with toArray(<1>,<2>,TRUE,<4>)
-
 
200
		$objReader->setReadDataOnly(true);
217
	// TODO: check if compatible with toArray(<1>,<2>,TRUE,<4>)
201
 
218
	$objReader->setReadDataOnly(true);
202
		// TODO: is_a obsolete entre 5.0 et 5.3, retirer le @ à terme
219
 
203
		$IS_CSV = @is_a($objReader, 'PHPExcel_Reader_CSV') && QUICK_CSV_IMPORT;
-
 
204
		// en cas d'usage de fgetcsv, testons que nous pouvons compter les lignes
-
 
205
		if ($IS_CSV) {
Line 220... Line 206...
220
	// TODO: is_a obsolete entre 5.0 et 5.3, retirer le @ à terme
206
			$nb_lignes = intval(exec("wc -l $fichier"));
221
	$IS_CSV = @is_a($objReader, 'PHPExcel_Reader_CSV') && QUICK_CSV_IMPORT;
207
		}
222
	// en cas d'usage de fgetcsv, testons que nous pouvons compter les lignes
208
		// et, le cas échéant, fallback sur PHPExcel à nouveau. La raison de ce test ici est
223
	if($IS_CSV) $nb_lignes = intval(exec("wc -l $fichier"));
209
		// l'instabilité du serveur (safe_mode, safe_mode_exec_dir, symlink vers binaires pour exec(), ... multiples points-of-failure)
Line 262... Line 248...
262
	$nb_mots_cle_ajoutes = 0;
248
		$nb_mots_cle_ajoutes = 0;
263
	$nb_champs_etendus_inseres = 0;
249
		$nb_champs_etendus_inseres = 0;
Line 264... Line 250...
264
 
250
 
265
	$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
251
		$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
266
	$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
252
		$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
-
 
253
		if (! $dernier_ordre) {
-
 
254
			$dernier_ordre = 0;
Line 267... Line 255...
267
	if(! $dernier_ordre) $dernier_ordre = 0;
255
		}
268
 
256
 
269
	// on catch to les trigger_error(E_USER_NOTICE);
257
		// on catch to les trigger_error(E_USER_NOTICE);
Line 270... Line -...
270
	set_error_handler(array($this, 'erreurs_stock'), E_USER_NOTICE);
-
 
271
	$this->taxon_info_webservice = new RechercheInfosTaxonBeta($this->config, NULL);
258
		set_error_handler(array($this, 'erreurs_stock'), E_USER_NOTICE);
272
 
259
		$this->taxon_info_webservice = new RechercheInfosTaxonBeta($this->config, NULL);
273
 
260
 
274
	// lecture par morceaux (chunks), NB_LIRE_LIGNE_SIMUL lignes à fois
261
		// lecture par morceaux (chunks), NB_LIRE_LIGNE_SIMUL lignes à fois
275
	// pour aboutir des requêtes SQL d'insert groupés.
262
		// pour aboutir des requêtes SQL d'insert groupés.
276
	for($ligne = 2; $ligne < $nb_lignes + NB_LIRE_LIGNE_SIMUL; $ligne += NB_LIRE_LIGNE_SIMUL) {
263
		for ($ligne = 2; $ligne < $nb_lignes + NB_LIRE_LIGNE_SIMUL; $ligne += NB_LIRE_LIGNE_SIMUL) {
Line 277... Line -...
277
	    if(!$IS_CSV) {
-
 
278
		$filtre->def_interval($ligne, NB_LIRE_LIGNE_SIMUL);
-
 
279
		$objReader->setReadFilter($filtre);
-
 
280
 
264
			if (!$IS_CSV) {
Line 281... Line 265...
281
		/* recharge avec $filtre actif (filtre sur lignes colonnes):
265
				$filtre->def_interval($ligne, NB_LIRE_LIGNE_SIMUL);
282
		   - exclue les colonnes inutiles/inutilisables)
266
				$objReader->setReadFilter($filtre);
283
		   - ne selectionne que les lignes dans le range [$ligne - $ligne + NB_LIRE_LIGNE_SIMUL] */
267
 
284
		$objPHPExcel = $objReader->load($fichier)->getActiveSheet();
268
				$objPHPExcel = $objReader->load($fichier)->getActiveSheet();
285
 
269
 
286
		// set col typing
270
				// set col typing
287
		if(C_CE_ZONE_GEO != 'C_CE_ZONE_GEO')
271
				if (C_CE_ZONE_GEO != 'C_CE_ZONE_GEO') {
288
		    $objPHPExcel->getStyle(C_CE_ZONE_GEO . '2:' . C_CE_ZONE_GEO . $objPHPExcel->getHighestRow())->getNumberFormat()->setFormatCode('00000');
-
 
289
 
-
 
290
		// TODO: set to string type
272
					$objPHPExcel->getStyle(C_CE_ZONE_GEO . '2:' . C_CE_ZONE_GEO . $objPHPExcel->getHighestRow())->getNumberFormat()->setFormatCode('00000');
-
 
273
				}
291
		if(C_ZONE_GEO != 'C_ZONE_GEO')
274
				// TODO: set to string type
292
		    $objPHPExcel->getStyle(C_ZONE_GEO . '2:' . C_ZONE_GEO . $objPHPExcel->getHighestRow())->getNumberFormat()->setFormatCode('00000');
275
				if (C_ZONE_GEO != 'C_ZONE_GEO') {
293
 
276
					$objPHPExcel->getStyle(C_ZONE_GEO . '2:' . C_ZONE_GEO . $objPHPExcel->getHighestRow())->getNumberFormat()->setFormatCode('00000');
294
		$donnees = $objPHPExcel->toArray(NULL, FALSE, TRUE, TRUE);
277
				}
295
	    }
278
				$donnees = $objPHPExcel->toArray(NULL, FALSE, TRUE, TRUE);
296
	    else {
279
			} else {
-
 
280
				$i = NB_LIRE_LIGNE_SIMUL;
-
 
281
				$donnees = array();
297
		$i = NB_LIRE_LIGNE_SIMUL;
282
				while ($i--) {
298
		$donnees = array();
283
					$tab = fgetcsv($csvFileHandler);
299
		while($i--) {
-
 
300
		    $tab = fgetcsv($csvFileHandler);
284
					if (!$tab) {
Line 301... Line -...
301
		    if(!$tab) continue;
-
 
302
		    $donnees[] = array_diff_key($tab, $filtre->exclues);
-
 
303
		}
-
 
304
 
-
 
305
	    }
-
 
306
 
-
 
307
	    // var_dump($donnees, get_defined_constants(true)['user']);die;
285
						continue;
308
	    // ici on appel la fonction qui fera effectivement l'insertion multiple
286
					}
-
 
287
					$donnees[] = array_diff_key($tab, $filtre->exclues);
-
 
288
				}
Line 309... Line 289...
309
	    // à partir des (au plus) NB_LIRE_LIGNE_SIMUL lignes
289
			}
310
 
290
 
311
	    // TODO: passer $this, ne sert que pour appeler des méthodes publiques qui pourraient être statiques
291
			list($enregistrements, $images, $mots_cle, $champs_etendus) = self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
Line 312... Line 292...
312
	    list($enregistrements, $images, $mots_cle, $champs_etendus) =
292
			if (! $enregistrements) {
313
		self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
293
				break;
314
	    if(! $enregistrements) break;
-
 
315
 
-
 
316
	    self::trierColonnes($enregistrements);
-
 
317
	    // normalement: NB_LIRE_LIGNE_SIMUL, sauf si une enregistrement ne semble pas valide
-
 
318
	    // ou bien lors du dernier chunk
294
			}
319
 
295
 
Line 320... Line 296...
320
	    $nb_rec = count($enregistrements);
296
			self::trierColonnes($enregistrements);
321
	    $sql_pattern = self::$insert_prefix .
297
			// normalement: NB_LIRE_LIGNE_SIMUL, sauf si une enregistrement ne semble pas valide
322
		str_repeat(self::$insert_ligne_pattern_ordre . ', ', $nb_rec - 1) .
298
			// ou bien lors du dernier chunk
-
 
299
 
323
		self::$insert_ligne_pattern_ordre;
300
			$nb_rec = count($enregistrements);
324
 
301
			$sql_pattern = self::$insert_prefix.
325
	    $sql_pattern = self::$insert_prefix .
-
 
Line 326... Line 302...
326
		str_repeat(self::$insert_ligne_pattern . ', ', $nb_rec - 1) .
302
				str_repeat(self::$insert_ligne_pattern.', ', $nb_rec - 1).
Line 327... Line -...
327
		self::$insert_ligne_pattern;
-
 
328
 
303
				self::$insert_ligne_pattern;
329
	    Cel::db()->beginTransaction();
304
 
Line -... Line 305...
-
 
305
			Cel::db()->beginTransaction();
330
	    $stmt = Cel::db()->prepare($sql_pattern);
306
			$stmt = Cel::db()->prepare($sql_pattern);
-
 
307
			$donnees = array();
Line 331... Line 308...
331
	    $donnees = array();
308
			foreach ($enregistrements as $e) {
332
	    foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
-
 
333
 
-
 
Line 334... Line 309...
334
	     // echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die; // debug ici
309
				$donnees = array_merge($donnees, array_values($e));
Line 335... Line 310...
335
 
310
			}
336
	    $stmt->execute($donnees);
311
 
337
 
312
			$stmt->execute($donnees);
338
	    // $stmt->debugDumpParams(); // https://bugs.php.net/bug.php?id=52384
313
 
Line 339... Line 314...
339
	    $dernier_autoinc = Cel::db()->lastInsertId();
314
			$dernier_autoinc = Cel::db()->lastInsertId();
Line -... Line 315...
-
 
315
			Cel::db()->commit();
340
	    Cel::db()->commit();
316
 
-
 
317
			if (! $dernier_autoinc) {
341
 
318
				trigger_error("l'insertion semble avoir échoué", E_USER_NOTICE);
342
	    if(! $dernier_autoinc) trigger_error("l'insertion semble avoir échoué", E_USER_NOTICE);
319
			}
343
 
-
 
344
	    $obs_ajouts += count($enregistrements);
320
 
Line 345... Line 321...
345
	    // $obs_ajouts += count($enregistrements['insert']);
321
			$obs_ajouts += count($enregistrements);
346
	    // $obs_maj += count($enregistrements['update']);
322
 
347
	    
323
			$ordre_ids = self::chargerCorrespondancesIdOrdre($this, $enregistrements);
Line 410... Line 386...
410
	// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
386
		// défini tous les index que nous utilisons à une valeur d'index de colonne Excel qui n'existe pas dans
411
	// le tableau renvoyé par PHPExcel
387
		// le tableau renvoyé par PHPExcel
412
	// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
388
		// Attention cependant d'utiliser des indexes différenciés car traiterLonLat() et traiterEspece()
413
	// les utilisent
389
		// les utilisent
414
	foreach($cols as $col) {
390
		foreach ($cols as $col) {
415
	    if(!defined("C_" . strtoupper($col['abbrev'])))
391
			if (!defined('C_'.strtoupper($col['abbrev']))) {
416
		define("C_" . strtoupper($col['abbrev']), "C_" . strtoupper($col['abbrev']));
392
				define('C_'.strtoupper($col['abbrev']), 'C_'.strtoupper($col['abbrev']));
-
 
393
			}
417
	}
394
		}
Line 418... Line 395...
418
 
395
 
419
	// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues
-
 
420
 
-
 
421
	// eg: diff ( Array( H => Commune, I => rien ) , Array( H => 1, K => 1 )
-
 
422
	// ==> Array( I => rien )
396
		// prépare le filtre de PHPExcel qui évitera le traitement de toutes les colonnes superflues
Line 423... Line 397...
423
	$colonnesID_non_reconnues = array_diff_key($entete, $colonnes_reconnues);
397
		$colonnesID_non_reconnues = array_diff_key($entete, $colonnes_reconnues);
424
 
398
 
425
	// des colonnes de FormateurGroupeColonne::nomEnsembleVersListeColonnes()
399
		// des colonnes de FormateurGroupeColonne::nomEnsembleVersListeColonnes()
Line 426... Line 400...
426
	// ne retient que celles marquées "importables"
400
		// ne retient que celles marquées "importables"
427
	$colonnes_automatiques = array_filter($cols, '__anonyme_1');
401
		$colonnes_automatiques = array_filter($cols, '__anonyme_1');
Line 428... Line -...
428
 
-
 
429
	// ne conserve que le nom long pour matcher avec la ligne XLS d'entête
-
 
430
	array_walk($colonnes_automatiques, '__anonyme_2');
402
 
Line 431... Line 403...
431
 
403
		// ne conserve que le nom long pour matcher avec la ligne XLS d'entête
432
	// intersect ( Array ( N => Milieu, S => Ordre ), Array ( ordre => Ordre, phenologie => Phénologie ) )
404
		array_walk($colonnes_automatiques, '__anonyme_2');
433
	// ==> Array ( S => Ordre, AA => Phénologie )
405
 
434
	$colonnesID_a_exclure = array_intersect($entete, $colonnes_automatiques);
-
 
435
 
-
 
436
	if($numeric_keys) {
-
 
437
	    return $colonnesID_non_reconnues + $colonnesID_a_exclure;
406
		$colonnesID_a_exclure = array_intersect($entete, $colonnes_automatiques);
438
	}
407
 
Line 439... Line 408...
439
	// TODO: pourquoi ne pas comparer avec les abbrevs aussi ?
408
		if ($numeric_keys) {
440
	// merge ( Array( I => rien ) , Array ( S => Ordre, AA => Phénologie ) )
-
 
441
	// ==> Array ( I => rien, AA => Phénologie )
409
			return $colonnesID_non_reconnues + $colonnesID_a_exclure;
442
	return array_merge($colonnesID_non_reconnues, $colonnesID_a_exclure);
-
 
443
    }
-
 
444
    
410
		}
445
    static function chargerCorrespondancesIdOrdre($cel, $lignes) {
411
		return array_merge($colonnesID_non_reconnues, $colonnesID_a_exclure);
446
    	
412
	}
447
    	$ordre_ids = array();
413
 
448
    
414
	static function chargerCorrespondancesIdOrdre($cel, $lignes) {
449
    	$requete_obs_ids = "SELECT id_observation, ordre FROM cel_obs WHERE ordre IN (";
-
 
450
    	foreach($lignes as &$ligne) {
-
 
-
 
415
		$ordresObs = array();
-
 
416
		foreach ($lignes as &$ligne) {
-
 
417
			$ordresObs[] = $ligne['ordre'];
-
 
418
		}
-
 
419
		$ordresObsConcat = implode(',', $ordresObs);
451
    		$requete_obs_ids .= $ligne['ordre'].',';
420
		$idUtilisateurP = Cel::db()->proteger($cel->id_utilisateur);
-
 
421
		$requete = 'SELECT id_observation, ordre '.
452
    	}
422
			'FROM cel_obs '.
453
    	$requete_obs_ids = rtrim($requete_obs_ids, ',');
423
			"WHERE ordre IN ($ordresObsConcat) ".
454
    	$requete_obs_ids .= ") AND ce_utilisateur = ".Cel::db()->proteger($cel->id_utilisateur);
424
			"AND ce_utilisateur = $idUtilisateurP ".
455
    	
425
			' -- '.__FILE__.':'.__LINE__;
456
    	
426
		$resultats = Cel::db()->requeter($requete);
Line 457... Line 427...
457
    	$obs_ids = Cel::db()->requeter($requete_obs_ids);
427
		$ordresIds = array();
458
    	foreach($obs_ids as &$obs) {
428
		foreach ($resultats as &$infos) {
459
    		$ordre_ids[$obs['ordre']] = $obs['id_observation'];
429
			$ordresIds[$infos['ordre']] = $infos['id_observation'];
460
    	}
430
		}
461
    	return $ordre_ids;
431
		return $ordresIds;
462
    }
432
	}
463
 
433
 
464
    /*
434
	/*
465
     * charge un groupe de lignes
435
	 * charge un groupe de lignes
Line 466... Line 436...
466
     */
436
	 */
467
    static function chargerLignes($cel, $lignes, $colonnes_statiques, &$dernier_ordre) {
-
 
468
	$enregistrement = NULL;
437
	static function chargerLignes($cel, $lignes, $colonnes_statiques, &$dernier_ordre) {
469
	$enregistrements = Array();
438
		$enregistrement = NULL;
-
 
439
		$enregistrements = array();
-
 
440
		$toutes_images = array();
Line 470... Line -...
470
	$toutes_images = Array();
-
 
471
	$tous_mots_cle = Array();
-
 
472
	$tous_champs_etendus = array();
441
		$tous_mots_cle = array();
473
 
442
		$tous_champs_etendus = array();
-
 
443
 
-
 
444
		foreach ($lignes as $ligne) {
Line 474... Line 445...
474
	foreach($lignes as $ligne) {
445
			// dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279)
475
		
446
			if ($ligne === false) {
476
	    // dans le cas de fgetcsv, on peut avoir des false additionnel (cf do/while l. 279)
447
				continue;
477
	    if($ligne === false) continue;
448
			}
478
 
449
 
Line 479... Line 450...
479
	    //$ligne = array_filter($ligne, function($cell) { return !is_null($cell); });
450
			// on a besoin des NULL pour éviter des notice d'index indéfini
480
	    //if(!$ligne) continue;
451
			if (! array_filter($ligne, '__anonyme_3')) {
481
	    // on a besoin des NULL pour éviter des notice d'index indéfini
452
				continue;
-
 
453
			}
482
	    if(! array_filter($ligne, '__anonyme_3')) continue;
454
 
483
 
455
			if ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) {
484
	    if( ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) ) {
456
				// $enregistrements[] = array_merge($colonnes_statiques, $enregistrement);
485
		// $enregistrements[] = array_merge($colonnes_statiques, $enregistrement);
457
				$enregistrements[] = $enregistrement;
486
		$enregistrements[] = $enregistrement;
458
				$pos = count($enregistrements) - 1;
487
		$pos = count($enregistrements) - 1;
459
				$last = &$enregistrements[$pos];
Line 488... Line 460...
488
		$last = &$enregistrements[$pos];
460
 
489
 
461
				if (isset($enregistrement['_images'])) {
490
		if(isset($enregistrement['_images'])) {
462
					// ne dépend pas de cel_obs, et seront insérées *après* les enregistrements
-
 
463
					// mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
491
		    // ne dépend pas de cel_obs, et seront insérées *après* les enregistrements
464
					$toutes_images[] = array(
492
		    // mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
465
						'images' => $last['_images'],
493
		    $toutes_images[] = Array("images" => $last['_images'],
-
 
494
					     "obs_pos" => $pos);
-
 
495
		    // ce champ n'a pas à faire partie de l'insertion dans cel_obs,
-
 
496
		    // mais est utile pour cel_obs_images
-
 
497
		    unset($last['_images']);
466
						'obs_pos' => $pos);
498
		}
467
					// ce champ n'a pas à faire partie de l'insertion dans cel_obs,
Line 499... Line 468...
499
 
468
					// mais est utile pour la liaison avec les images
-
 
469
					unset($last['_images']);
500
		if(isset($enregistrement['_mots_cle'])) {
470
				}
501
		    // ne dépend pas de cel_obs, et seront insérés *après* les enregistrements
471
 
502
		    // mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
472
				if (isset($enregistrement['_mots_cle'])) {
503
		    $tous_mots_cle[] = Array("mots_cle" => $last['_mots_cle'],
473
					// ne dépend pas de cel_obs, et seront insérés *après* les enregistrements
504
					     "obs_pos" => $pos);
474
					// mais nous ne voulons pas nous priver de faire des INSERT multiples pour autant
505
		    // la version inlinée des mots est enregistrées dans cel_obs
475
					$tous_mots_cle[] = array(
506
		    // mais cel_mots_cles_obs fait foi.
476
						'mots_cle' => $last['_mots_cle'],
507
		    // XXX: postponer l'ajout de ces informations dans cel_obs *après* l'insertion effective
-
 
508
		    // des records dans cel_mots_cles_obs ?
-
 
509
		    unset($last['_mots_cle']);
477
						'obs_pos' => $pos);
510
		}
478
					unset($last['_mots_cle']);
Line 511... Line -...
511
 
-
 
512
		if(isset($enregistrement['_champs_etendus'])) {
479
				}
513
			$tous_champs_etendus[] = Array("champs_etendus" => $last['_champs_etendus'],
480
 
514
					"ordre" => $dernier_ordre);
481
				if (isset($enregistrement['_champs_etendus'])) {
515
			unset($last['_champs_etendus']);
-
 
516
		}
-
 
517
		$dernier_ordre++;
482
					$tous_champs_etendus[] = array(
518
	    }
483
						'champs_etendus' => $last['_champs_etendus'],
Line 519... Line -...
519
	}
-
 
520
 
484
						'ordre' => $dernier_ordre);
521
	// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
485
					unset($last['_champs_etendus']);
522
	return Array($enregistrements, $toutes_images, $tous_mots_cle, $tous_champs_etendus);
486
				}
-
 
487
				$dernier_ordre++;
523
    }
488
			}
-
 
489
		}
524
 
490
		return array($enregistrements, $toutes_images, $tous_mots_cle, $tous_champs_etendus);
525
 
491
	}
Line 526... Line 492...
526
    static function trierColonnes(&$enregistrements) {
492
 
527
	foreach($enregistrements as &$enregistrement) {
-
 
528
	    $enregistrement = self::sortArrayByArray($enregistrement, self::$ordre_BDD);
493
	static function trierColonnes(&$enregistrements) {
529
	    //array_walk($enregistrement, function(&$item, $k) { $item = is_null($item) ? "NULL" : $item; });
-
 
530
	    //$req .= implode(', ', $enregistrement) . "\n";
494
		foreach ($enregistrements as &$enregistrement) {
531
	}
495
			$enregistrement = self::sortArrayByArray($enregistrement, self::$ordre_BDD);
532
    }
496
		}
533
 
497
	}
534
 
498
 
535
    static function stockerMotsCle($enregistrements, $tous_mots_cle, $lastid) {
-
 
536
	$c = 0;
-
 
537
	// debug: var_dump($tous_mots_cle);die;
499
	static function stockerMotsCle($enregistrements, $tous_mots_cle, $lastid) {
538
	foreach($tous_mots_cle as $v) $c += count($v['mots_cle']['to_insert']);
500
		$c = 0;
Line 539... Line 501...
539
	return $c;
501
		// debug: var_dump($tous_mots_cle);die;
540
    }
502
		foreach ($tous_mots_cle as $v) {
-
 
503
			$c += count($v['mots_cle']['to_insert']);
-
 
504
		}
541
 
505
		return $c;
-
 
506
	}
-
 
507
 
542
    static function stockerImages($enregistrements, $toutes_images, $ordre_ids) {
508
	static function stockerImages($enregistrements, $toutes_images, $ordre_ids) {
543
	$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
509
		$idsImagesObs = array();
544
	$images_obs_assoc = Array();
-
 
545
 
510
		foreach ($toutes_images as $images_pour_obs) {
546
	foreach($toutes_images as $images_pour_obs) {
511
			$obs = $enregistrements[$images_pour_obs['obs_pos']];
Line 547... Line 512...
547
	    $obs = $enregistrements[$images_pour_obs["obs_pos"]];
512
			$id_obs = $ordre_ids[$obs['ordre']]; // id réel de l'observation correspondant à l'ordre
548
	    $id_obs = $ordre_ids[$obs['ordre']]; // id réel de l'observation correspondant à l'ordre
513
			foreach ($images_pour_obs['images'] as $image) {
549
	    foreach($images_pour_obs['images'] as $image) {
514
				$idsImagesObs[] = sprintf('(%d,%d, NOW())', $image['id_image'], $id_obs);
Line 576... Line 541...
576
	// * traiter espèce (traiterEspece())
541
		// * traiter espèce (traiterEspece())
577
	// * traiter longitude et latitude (traiterLonLat())
542
		// * traiter longitude et latitude (traiterLonLat())
578
	$referentiel = self::identReferentiel(trim(strtolower(@$ligne[C_NOM_REFERENTIEL])), $ligne, $ref_ligne);
543
		$referentiel = self::identReferentiel(trim(strtolower(@$ligne[C_NOM_REFERENTIEL])), $ligne, $ref_ligne);
Line 579... Line 544...
579
 
544
 
-
 
545
		// $espece est rempli de plusieurs informations
-
 
546
		$espece = array(
580
	// $espece est rempli de plusieurs informations
547
			C_NOM_SEL => NULL,
-
 
548
			C_NOM_SEL_NN => NULL,
581
	$espece = Array(C_NOM_SEL => NULL, C_NOM_SEL_NN => NULL, C_NOM_RET => NULL,
549
			C_NOM_RET => NULL,
-
 
550
			C_NOM_RET_NN => NULL,
-
 
551
			C_NT => NULL,
582
			C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
552
			C_FAMILLE => NULL);
Line -... Line 553...
-
 
553
		self::traiterEspece($ligne, $espece, $referentiel, $cel->taxon_info_webservice);
583
	self::traiterEspece($ligne, $espece, $referentiel, $cel->taxon_info_webservice);
554
 
-
 
555
		if (!$espece[C_NOM_SEL]) {
584
 
556
			$referentiel = Cel::$fallback_referentiel;
-
 
557
		}
-
 
558
		if ($espece[C_NOM_SEL] && !$espece[C_NOM_SEL_NN]) {
Line 585... Line 559...
585
	if(!$espece[C_NOM_SEL]) $referentiel = Cel::$fallback_referentiel;
559
			$referentiel = Cel::$fallback_referentiel;
586
	if($espece[C_NOM_SEL] && !$espece[C_NOM_SEL_NN]) $referentiel = Cel::$fallback_referentiel;
560
		}
587
 
561
 
Line 639... Line 613...
639
	);
613
		);
Line 640... Line 614...
640
 
614
 
641
	// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
615
		// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
642
	// que si des résultats sont trouvés
616
		// que si des résultats sont trouvés
-
 
617
		// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
643
	// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
618
		if (@$ligne[C_IMAGES]) {
-
 
619
			self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
Line -... Line 620...
-
 
620
		}
644
	if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
621
 
-
 
622
		if (@$ligne[C_MOTS_CLES_TEXTE]) {
Line 645... Line 623...
645
 
623
			self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
646
	if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
624
		}
647
	
625
 
648
	$champs_etendus = self::traiterChampsEtendus($ligne, self::$indexes_colonnes_etendues);
626
		$champs_etendus = self::traiterChampsEtendus($ligne, self::$indexes_colonnes_etendues);
Line 649... Line 627...
649
	if(!empty($champs_etendus)) {
627
		if (!empty($champs_etendus)) {
650
		$enregistrement["_champs_etendus"] = $champs_etendus;
628
			$enregistrement['_champs_etendus'] = $champs_etendus;
Line 662... Line 640...
662
    	}
640
		}
663
    	return $champs_etendus_indexes;
641
		return $champs_etendus_indexes;
664
    }
642
	}
Line 665... Line 643...
665
 
643
 
666
    static function traiterImage($str, $id_utilisateur, &$enregistrement) {
644
	static function traiterImage($str, $id_utilisateur, &$enregistrement) {
667
	$liste_images = array_filter(explode("/", $str));
-
 
668
 
-
 
669
	//array_walk($liste_images, '__anonyme_4');
645
		$liste_images = array_filter(explode('/', $str));
670
	array_walk($liste_images, array(__CLASS__, '__anonyme_4'));
-
 
671
	$requete = sprintf(
-
 
672
	    "SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (%s)",
-
 
673
	    $id_utilisateur,
-
 
Line -... Line 646...
-
 
646
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'));
-
 
647
 
-
 
648
		$nomsOrignalConcat = implode(',', $liste_images);
-
 
649
		$requete = 'SELECT id_image, nom_original '.
-
 
650
			'FROM cel_images '.
674
	    implode(',', $liste_images));
651
			"WHERE ce_utilisateur = $id_utilisateur AND nom_original IN ($nomsOrignalConcat) ".
Line -... Line 652...
-
 
652
			' -- '.__FILE__.':'.__LINE__;
675
 
653
		$resultat = Cel::db()->requeter($requete);
-
 
654
 
676
	$resultat = Cel::db()->requeter($requete);
655
		if ($resultat) {
Line 677... Line 656...
677
 
656
			$enregistrement['_images'] = $resultat;
678
	if($resultat) $enregistrement['_images'] = $resultat;
657
		}
679
    }
658
	}
Line 680... Line 659...
680
 
659
 
681
    static function traiterMotsCle($str, $id_utilisateur, &$enregistrement) {
660
	static function traiterMotsCle($str, $id_utilisateur, &$enregistrement) {
682
	$liste_mots_cle = $liste_mots_cle_recherche = array_map("trim", array_unique(array_filter(explode(",", $str))));
661
		$liste_mots_cle = $liste_mots_cle_recherche = array_map('trim', array_unique(array_filter(explode(',', $str))));
Line 689... Line 668...
689
	foreach($mots_cles_ids as $mot_cle) {
668
		foreach ($mots_cles_ids as $mot_cle) {
690
		$resultat[$mot_cle['id_mot_cle']] = $mot_cle['mot_cle'];
669
			$resultat[$mot_cle['id_mot_cle']] = $mot_cle['mot_cle'];
691
	}
670
		}
Line 692... Line 671...
692
 
671
 
693
	$enregistrement['mots_cles_texte'] = implode(',', $liste_mots_cle);
672
		$enregistrement['mots_cles_texte'] = implode(',', $liste_mots_cle);
-
 
673
		$enregistrement['_mots_cle'] = array(
694
	$enregistrement['_mots_cle'] = array("existing" => $resultat,
674
			'existing' => $resultat,
695
					     "to_insert" => array_diff($liste_mots_cle, $resultat));
675
			'to_insert' => array_diff($liste_mots_cle, $resultat));
Line 696... Line 676...
696
    }
676
	}
697
 
-
 
698
 
677
 
699
    /* FONCTIONS de TRANSFORMATION de VALEUR DE CELLULE */
678
 
700
 
679
	/* FONCTIONS de TRANSFORMATION de VALEUR DE CELLULE */
701
    // TODO: PHP 5.3, utiliser date_parse_from_format()
680
	// TODO: PHP 5.3, utiliser date_parse_from_format()
702
    // TODO: parser les heures (cf product-owner)
681
	// TODO: parser les heures (cf product-owner)
703
    // TODO: passer par le timestamp pour s'assurer de la validité
682
	// TODO: passer par le timestamp pour s'assurer de la validité
704
    static function traiterDateObs($date, $ref_ligne) {
683
	static function traiterDateObs($date, $ref_ligne) {
705
	// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208
684
		// TODO: see https://github.com/PHPOffice/PHPExcel/issues/208
706
	// TODO: PHPExcel_Shared_Date::ExcelToPHP()
685
		// TODO: PHPExcel_Shared_Date::ExcelToPHP()
707
	if(is_double($date)) {
-
 
708
	    if($date > 0)
-
 
709
		return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00";
-
 
710
	    trigger_error("ligne \"{$ref_ligne}\": " .
-
 
711
			  "Attention: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble",
-
 
712
			  E_USER_NOTICE);
-
 
713
 
-
 
714
	    // throw new Exception("erreur: date antérieure à 1970 et format de cellule \"DATE\" utilisés ensemble");
-
 
715
 
-
 
716
	    // attention, UNIX timestamp, car Excel les décompte depuis 1900
-
 
717
	    // cf http://fczaja.blogspot.fr/2011/06/convert-excel-date-into-timestamp.html
-
 
718
	    // $timestamp = ($date - MIN_DATES_DIFF) * 60 * 60 * 24 - time(); // NON
-
 
719
 
-
 
720
	    // $timestamp = PHPExcel_Calculation::getInstance()->calculateFormula("=" . $date . "-DATE(1970,1,1)*60*60*24"); // NON
686
		if (is_double($date)) {
-
 
687
			if ($date > 0) {
-
 
688
				return PHPExcel_Style_NumberFormat::toFormattedString($date, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2) . " 00:00:00";
-
 
689
			}
721
 
690
 
722
	    // echo strftime("%Y/%m/%d 00:00:00", $timestamp); // NON
691
			$msg = "ligne «{$ref_ligne}»: Attention: date antérieure à 1970 et format de cellule «DATE» utilisés ensemble";
723
	}
692
			trigger_error($msg, E_USER_NOTICE);
724
	else {
693
		} else {
725
	    // attend l'un des formats de
694
			// attend l'un des formats de
726
	    // http://www.php.net/manual/fr/datetime.formats.date.php
695
			// http://www.php.net/manual/fr/datetime.formats.date.php
727
	    // le plus simple: YYYY/MM/DD (utilisé à l'export), mais DD-MM-YYYY est aussi supporté
696
			// le plus simple: YYYY/MM/DD (utilisé à l'export), mais DD-MM-YYYY est aussi supporté
728
	    $matches = NULL;
697
			$matches = NULL;
729
	    // et on essaie d'être sympa et supporter aussi DD/MM/YYYY
698
			// et on essaie d'être sympa et supporter aussi DD/MM/YYYY
730
	    if(preg_match(';^([0-3]?\d)/([01]\d)/([12]\d\d\d)$;', $date, $matches)) {
699
			if (preg_match(';^([0-3]?\d)/([01]\d)/([12]\d\d\d)$;', $date, $matches)) {
731
		$date = $matches[3] . '/' . $matches[2] . '/' . $matches[1];
700
				$date = $matches[3] . '/' . $matches[2] . '/' . $matches[1];
-
 
701
			}
732
	    }
702
			$timestamp = strtotime($date);
-
 
703
			if (! $timestamp || $timestamp > time() + 3600 * 24 * 1) { // une journée d'avance maxi autorisée (décallage horaire ?)
-
 
704
				if ($date) {
733
	    $timestamp = strtotime($date);
705
					$msg = "ligne «{$ref_ligne}»: Attention: date erronée ($date)";
734
	    if(! $timestamp || $timestamp > time() + 3600 * 24 * 1) { // une journée d'avance maxi autorisée (décallage horaire ?)
706
					trigger_error($msg, E_USER_NOTICE);
735
		if($date) trigger_error("ligne \"{$ref_ligne}\": Attention: date erronée ($date)", E_USER_NOTICE);
707
				}
736
		return NULL;
708
				return NULL;
737
	    }
709
			}
Line 738... Line 710...
738
	    return strftime("%Y-%m-%d 00:00:00", $timestamp);
710
			return strftime('%Y-%m-%d 00:00:00', $timestamp);
739
	}
711
		}
740
    }
712
	}
-
 
713
 
-
 
714
	static function identReferentiel($referentiel, $ligne, $ref_ligne) {
741
 
715
		// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
-
 
716
		if (strpos($referentiel, 'bdtfx') !== FALSE) {
-
 
717
			return 'bdtfx'; //:v1.01';
742
    static function identReferentiel($referentiel, $ligne, $ref_ligne) {
718
		}
-
 
719
		if (strpos($referentiel, 'bdtxa') !== FALSE) {
-
 
720
			return 'bdtxa'; //:v1.00';
743
	// SELECT DISTINCT nom_referentiel, COUNT(id_observation) AS count FROM cel_obs GROUP BY nom_referentiel ORDER BY count DESC;
721
		}
744
	if(strpos($referentiel, 'bdtfx') !== FALSE) return 'bdtfx'; //:v1.01';
722
		if (strpos($referentiel, 'bdnff') !== FALSE) {
-
 
723
			return 'bdtfx';
745
	if(strpos($referentiel, 'bdtxa') !== FALSE) return 'bdtxa'; //:v1.00';
724
		}
-
 
725
		if (strpos($referentiel, 'isfan') !== FALSE) {
-
 
726
			return 'isfan'; //:v1.00';
746
	//if(strpos($referentiel, 'bdnff') !== FALSE) return 'bdnff'; //:4.02';
727
		}
-
 
728
		if (strpos($referentiel, 'apd') !== FALSE) {
-
 
729
			return 'apd'; //:v1.00';
Line 747... Line 730...
747
	if(strpos($referentiel, 'bdnff') !== FALSE) return 'bdtfx';
730
		}
748
	if(strpos($referentiel, 'isfan') !== FALSE) return 'isfan'; //:v1.00';
731
		if (strpos($referentiel, 'autre') !== FALSE) {
-
 
732
			return 'autre';
749
	if(strpos($referentiel, 'apd') !== FALSE) return 'apd'; //:v1.00';
733
		}
750
	if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
734
 
751
 
-
 
752
	if($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) {
-
 
753
	    trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel \"{$referentiel}\" inconnu", E_USER_NOTICE);
735
		if ($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) {
754
	    return 'autre';
-
 
755
	}
-
 
756
 
-
 
757
	// pas de référentiel ou pas de NOM_SEL: NULL
736
			$msg = "ligne «{$ref_ligne}»: Attention: référentiel «{$referentiel}» inconnu";
Line 758... Line 737...
758
	return NULL;
737
			trigger_error($msg, E_USER_NOTICE);
759
	/* TODO: cf story,
738
			return 'autre';
-
 
739
		}
760
	   En cas de NULL faire une seconde passe de détection à partir du nom saisi
740
		return NULL;
-
 
741
	}
-
 
742
 
761
	   + accepter les n° de version */
743
	static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx', $ref_ligne) {
-
 
744
		// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS)
Line 762... Line 745...
762
    }
745
		if ($lon && is_string($lon)) {
763
 
746
			$lon = str_replace(',', '.', $lon);
764
    static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx', $ref_ligne) {
747
		}
-
 
748
		if ($lat && is_string($lat)) {
-
 
749
			$lat = str_replace(',', '.', $lat);
765
	// en CSV ces valeurs sont des string, avec séparateur en français (","; cf défauts dans ExportXLS)
750
		}
-
 
751
 
-
 
752
		// sprintf applique une précision à 5 décimale (comme le ferait MySQL)
Line 766... Line 753...
766
	if($lon && is_string($lon)) $lon = str_replace(',', '.', $lon);
753
		// tout en uniformisant le format de séparateur des décimales (le ".")
767
	if($lat && is_string($lat)) $lat = str_replace(',', '.', $lat);
754
		if ($lon && is_numeric($lon) && $lon >= -180 && $lon <= 180) {
768
 
755
			return sprintf('%.5F', $lon);
769
	// sprintf applique une précision à 5 décimale (comme le ferait MySQL)
756
		}
770
	// tout en uniformisant le format de séparateur des décimales (le ".")
757
		if ($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) {
771
	if($lon && is_numeric($lon) && $lon >= -180 && $lon <= 180) return sprintf('%.5F', $lon);
758
			return sprintf('%.5F', $lat);
772
	if($lat && is_numeric($lat) && $lat >= -90 && $lat <= 90) return sprintf('%.5F', $lat);
-
 
773
 
-
 
774
	if($lon || $lat) {
-
 
775
	    trigger_error("ligne \"{$ref_ligne}\": " .
-
 
776
			  "Attention: longitude ou latitude erronée",
-
 
777
			  E_USER_NOTICE);
-
 
778
	}
-
 
779
	return NULL;
-
 
780
 
-
 
781
	/* limite france métropole si bdtfx ? ou bdtxa ? ...
-
 
782
	   NON!
-
 
783
	   Un taxon d'un référentiel donné peut être théoriquement observé n'importe où sur le globe.
-
 
784
	   Il n'y a pas lieu d'effectuer des restriction ici.
-
 
785
	   Cependant des erreurs fréquentes (0,0 ou lon/lat inversées) peuvent être détectés ici.
-
 
786
	   TODO */
-
 
787
	$bbox = self::getReferentielBBox($referentiel);
-
 
788
	if(!$bbox) return NULL;
-
 
789
 
-
 
790
	if($lon) {
759
		}
Line 791... Line 760...
791
	    if($lon < $bbox['EST'] && $lon > $bbox['OUEST']) return is_numeric($lon) ? $lon : NULL;
760
 
792
	    else return NULL;
761
		if ($lon || $lat) {
793
	}
762
			trigger_error("ligne \"{$ref_ligne}\": " .
794
	if($lat) {
763
				  "Attention: longitude ou latitude erronée",
795
	    if($lat < $bbox['NORD'] && $lat > $bbox['SUD']) return is_numeric($lat) ? $lat : NULL;
764
				  E_USER_NOTICE);
796
	    return NULL;
765
		}
797
	}
-
 
798
    }
-
 
799
 
-
 
800
    /*
-
 
801
      TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
-
 
802
      pour des questions de performances
766
		return NULL;
803
    */
767
	}
Line 804... Line 768...
804
    static function traiterEspece($ligne, Array &$espece, &$referentiel, $taxon_info_webservice) {
768
 
805
	if(empty($ligne[C_NOM_SEL])) {
769
	/*
Line 806... Line 770...
806
	    // TODO: nous ne déclarons pas "Numéro nomenclatural" comme colonne importable
770
	  TODO: s'affranchir du webservice pour la détermination du nom scientifique en s'appuyant sur cel_references,
-
 
771
	  pour des questions de performances
807
	    // Nous ne pouvons donc pas tenter d'être sympa sur la détermination par num_nom
772
	*/
-
 
773
	static function traiterEspece($ligne, Array &$espece, &$referentiel, $taxon_info_webservice) {
808
	    /* if(!empty($ligne[C_NOM_SEL_NN]) && $referentiel != Cel::$fallback_referentiel)
774
		if (empty($ligne[C_NOM_SEL])) {
809
	       $ligne[C_NOM_SEL] = $referentiel . ':nn:' . $ligne[C_NOM_SEL_NN];
775
			return;
Line 810... Line -...
810
	       else */
-
 
811
	    return;
-
 
812
	}
-
 
813
 
-
 
814
	// nom_sel reste toujours celui de l'utilisateur
-
 
815
	$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
-
 
816
 
-
 
817
	// XXX/attention, nous ne devrions pas accepter un référentiel absent !
-
 
818
	if(!$referentiel) $referentiel = 'bdtfx';
-
 
819
	$taxon_info_webservice->setReferentiel($referentiel);
-
 
820
	$ascii = iconv('UTF-8', 'ASCII//TRANSLIT', $ligne[C_NOM_SEL]);
-
 
821
 
-
 
822
	// TODO: si empty(C_NOM_SEL) et !empty(C_NOM_SEL_NN) : recherche info à partir de C_NOM_SEL_NN
-
 
823
	// echo "rechercherInformationsComplementairesSurNom()\n";
-
 
824
	/*
776
		}
Line 825... Line 777...
825
	  SELECT num_nom, nom_sci, num_nom_retenu ,auteur, annee, biblio_origine, nom_sci,auteur  FROM bdtfx_v1_01  WHERE (nom_sci LIKE 'Heliotropium europaeum')  ORDER BY nom_sci ASC	  LIMIT 0, 1
777
 
826
	  #
778
		// nom_sel reste toujours celui de l'utilisateur
827
	  SELECT num_nom, nom_sci, num_nom_retenu ,auteur, annee, biblio_origine, nom_sci,auteur  FROM bdtfx_v1_01  WHERE (nom_sci LIKE 'eliotropium euro')  ORDER BY nom_sci ASC   LIMIT 0, 1
779
		$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
Line 848... Line 800...
848
 
800
 
849
	    return;
801
			return;
Line 850... Line 802...
850
	}
802
		}
851
 
803
 
852
	// succès de la détection, mais résultat partiel
804
		// succès de la détection, mais résultat partiel
-
 
805
		if (!isset($determ->id)) {
Line 853... Line 806...
853
	if(!isset($determ->id)) 
806
			$determ = $taxon_info_webservice->effectuerRequeteInfosComplementairesSurNumNom($determ->{"nom_retenu.id"});
-
 
807
		}
854
	    $determ = $taxon_info_webservice->effectuerRequeteInfosComplementairesSurNumNom($determ->{"nom_retenu.id"});
808
 
-
 
809
		// ne devrait jamais arriver !
Line 855... Line 810...
855
 
810
		if (!$determ) {
856
	// ne devrait jamais arriver !
811
			die("erreur critique: " . __FILE__ . ':' . __LINE__);
857
	if(!$determ) die("erreur critique: " . __FILE__ . ':' . __LINE__);
812
		}
858
 
813
 
Line 873... Line 828...
873
	$espece[C_NOM_RET] = RechercheInfosTaxonBeta::supprimerBiblio($determ->nom_retenu_complet);
828
		$espece[C_NOM_RET] = RechercheInfosTaxonBeta::supprimerBiblio($determ->nom_retenu_complet);
874
	$espece[C_NOM_RET_NN] = $determ->{"nom_retenu.id"};
829
		$espece[C_NOM_RET_NN] = $determ->{"nom_retenu.id"};
875
	$espece[C_NT] = $determ->num_taxonomique;
830
		$espece[C_NT] = $determ->num_taxonomique;
876
	$espece[C_FAMILLE] = $determ->famille;
831
		$espece[C_FAMILLE] = $determ->famille;
877
	return;
832
		return;
878
	// et des info complémentaires
-
 
879
 
-
 
880
	/*
-
 
881
	// GET /service:eflore:0.1/bdtfx/noms/31468?retour.champs=nom_sci,auteur,id,nom_retenu_complet,nom_retenu.id,num_taxonomique,famille
-
 
882
	/home/raphael/eflore/projets/services/modules/0.1/bdtfx/Noms.php:280
-
 
883
	SELECT  *, nom_sci   FROM bdtfx_v1_01	 WHERE num_nom = '31468' 
-
 
884
	SELECT nom_sci, num_nom_retenu, nom_sci_html, auteur, annee, biblio_origine FROM bdtfx_v1_01 WHERE num_nom = 31468
-
 
885
	SELECT nom_sci, num_nom_retenu, nom_sci_html, auteur, annee, biblio_origine FROM bdtfx_v1_01 WHERE num_nom = 86535
-
 
886
	*/
-
 
887
 
-
 
888
 
-
 
889
	//var_dump($complement, $espece);die;
-
 
890
    }
833
	}
Line 891... Line 834...
891
 
834
 
892
    static function detectFromNom($nom) {
835
	static function detectFromNom($nom) {
893
	$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
836
		$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
894
					 "ORDER BY nom_sci ASC LIMIT 0, 1",
837
			"ORDER BY nom_sci ASC LIMIT 0, 1",
-
 
838
			Cel::db()->proteger($nom)));
895
					 Cel::db()->proteger($nom)));
839
		if ($r) {
-
 
840
			return $r;
Line 896... Line 841...
896
	if($r) return $r;
841
		}
897
 
842
 
898
	Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s' OR nom LIKE '%s') ".
843
		Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s' OR nom LIKE '%s') ".
899
				    "ORDER BY nom_sci ASC LIMIT 0, 1",
844
			"ORDER BY nom_sci ASC LIMIT 0, 1",
900
				    Cel::db()->proteger($nom),
845
			Cel::db()->proteger($nom),
901
				    Cel::db()->proteger(str_replace(' ', '% ', $nom))));
846
			Cel::db()->proteger(str_replace(' ', '% ', $nom))));
Line 902... Line -...
902
	return $r;
-
 
903
    }
-
 
904
 
-
 
905
 
-
 
906
    /*
-
 
907
     * TODO: analyse rigoureuse:
-
 
908
     * == Identifiant Commune
-
 
909
     * - INSEE-C:\d{5}
-
 
910
     * - \d{5}
-
 
911
     * - \d{2}
-
 
912
     * == Commune
-
 
913
     * - \w+ (\d{2})
-
 
914
     * - \w+ (\d{5})
-
 
915
     * - \w+
847
		return $r;
916
     *
848
	}
-
 
849
 
-
 
850
	static function traiterLocalisation($ligne, Array &$localisation) {
917
     */
851
		if (empty($ligne[C_ZONE_GEO])) {
-
 
852
			$ligne[C_ZONE_GEO] = NULL;
-
 
853
		}
Line 918... Line 854...
918
    static function traiterLocalisation($ligne, Array &$localisation) {
854
		if (empty($ligne[C_CE_ZONE_GEO])) {
919
	if(empty($ligne[C_ZONE_GEO])) $ligne[C_ZONE_GEO] = NULL;
855
			$ligne[C_CE_ZONE_GEO] = NULL;
920
	if(empty($ligne[C_CE_ZONE_GEO])) $ligne[C_CE_ZONE_GEO] = NULL;
856
		}
Line 921... Line 857...
921
 
857
 
922
	$identifiant_commune = trim($ligne[C_ZONE_GEO]);
858
		$identifiant_commune = trim($ligne[C_ZONE_GEO]);
923
	if(!$identifiant_commune) {
859
		if (!$identifiant_commune) {
924
	    $departement = trim($ligne[C_CE_ZONE_GEO]);
860
			$departement = trim($ligne[C_CE_ZONE_GEO]);
925
 
-
 
926
	    if(strpos($departement, "INSEE-C:", 0) === 0) {
861
 
927
		$localisation[C_CE_ZONE_GEO] = trim($ligne[C_CE_ZONE_GEO]);
862
			if (strpos($departement, 'INSEE-C:', 0) === 0) {
928
		if(array_key_exists($localisation[C_CE_ZONE_GEO], self::$cache['geo'])) {
863
				$localisation[C_CE_ZONE_GEO] = trim($ligne[C_CE_ZONE_GEO]);
-
 
864
				if (array_key_exists($localisation[C_CE_ZONE_GEO], self::$cache['geo'])) {
929
		    $localisation[C_ZONE_GEO] = self::$cache['geo'][$localisation[C_CE_ZONE_GEO]];
865
					$localisation[C_ZONE_GEO] = self::$cache['geo'][$localisation[C_CE_ZONE_GEO]];
-
 
866
				} else {
930
		}
867
					$nom = Cel::db()->requeter(sprintf("SELECT nom FROM cel_zones_geo WHERE code = %s LIMIT 1",
931
		else {
868
						self::quoteNonNull(substr($localisation[C_CE_ZONE_GEO], strlen("INSEE-C:")))));
932
		    $nom = Cel::db()->requeter(sprintf("SELECT nom FROM cel_zones_geo WHERE code = %s LIMIT 1",
869
					if ($nom) {
933
						       self::quoteNonNull(substr($localisation[C_CE_ZONE_GEO], strlen("INSEE-C:")))));
870
						$localisation[C_ZONE_GEO] = $nom[0]['nom'];
Line 950... Line 887...
950
		    $localisation[C_CE_ZONE_GEO] = self::$cache['geo'][$departement][1];
887
					$localisation[C_CE_ZONE_GEO] = self::$cache['geo'][$departement][1];
951
		    return;
888
					return;
952
		}
889
				}
953
	    }
890
			}
Line -... Line 891...
-
 
891
 
-
 
892
			$requete = "SELECT DISTINCT nom, CONCAT('INSEE-C:', code) AS code ".
-
 
893
				'FROM cel_zones_geo '.
-
 
894
				'WHERE code = %s '.
-
 
895
				'LIMIT 1 '.
954
 
896
				' -- '.__FILE__.':'.__LINE__;
955
	    if(! $cache_attempted && ($resultat_commune = Cel::db()->requeter(sprintf("SELECT DISTINCT nom, CONCAT('INSEE-C:', code) AS code FROM cel_zones_geo WHERE code = %s LIMIT 1",
897
			$resultat_commune = Cel::db()->requeter(sprintf($requete, self::quoteNonNull($departement)));
956
										      self::quoteNonNull($departement)))) ) {
898
			if (! $cache_attempted && $resultat_commune) {
957
		$localisation[C_ZONE_GEO] = $resultat_commune[0]['nom'];
899
				$localisation[C_ZONE_GEO] = $resultat_commune[0]['nom'];
958
		$localisation[C_CE_ZONE_GEO] = $resultat_commune[0]['code'];
900
				$localisation[C_CE_ZONE_GEO] = $resultat_commune[0]['code'];
959
		self::$cache['geo'][$departement] = array($resultat_commune[0]['nom'], $resultat_commune[0]['code']);
901
				self::$cache['geo'][$departement] = array($resultat_commune[0]['nom'], $resultat_commune[0]['code']);
960
		return;
902
				return;
961
	    }
-
 
962
	    ;
-
 
963
	    // if(strlen($departement) == 4) $departement = "INSEE-C:0" . $departement;
-
 
964
	    // if(strlen($departement) == 5) $departement = "INSEE-C:" . $departement;
-
 
965
	    // if(strlen($departement) <= 9) return "INSEE-C:0" . $departement; // ? ... TODO
-
 
966
 
-
 
967
	    $departement = trim($departement); // TODO
-
 
968
 
903
			}
969
	    $localisation[C_CE_ZONE_GEO] = $ligne[C_CE_ZONE_GEO];
904
			$localisation[C_CE_ZONE_GEO] = $ligne[C_CE_ZONE_GEO];
970
	    return;
905
			return;
Line 971... Line -...
971
	}
-
 
972
 
906
		}
Line 973... Line 907...
973
 
907
 
974
	$select = "SELECT DISTINCT nom, code FROM cel_zones_geo";
908
		$select = "SELECT DISTINCT nom, code FROM cel_zones_geo";
975
	
909
 
976
	if (preg_match('/(.+) \((\d{1,5})\)/', $identifiant_commune, $elements)) {
910
		if (preg_match('/(.+) \((\d{1,5})\)/', $identifiant_commune, $elements)) {
977
	    // commune + departement : montpellier (34)
911
			// commune + departement : montpellier (34)
978
	    $nom_commune=$elements[1];
912
			$nom_commune=$elements[1];
979
	    $code_commune=$elements[2];
913
			$code_commune=$elements[2];
980
	    if(strlen($code_commune) <= 2) {
914
			if (strlen($code_commune) <= 2) {
981
		$requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
-
 
982
				   $select, self::quoteNonNull($nom_commune),
915
				$requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
983
				   self::quoteNonNull($code_commune.'%'));
916
					$select, self::quoteNonNull($nom_commune),
984
	    }
917
					self::quoteNonNull($code_commune.'%'));
985
	    else {
918
			} else {
986
		$requete = sprintf("%s WHERE nom = %s AND code = %d",
919
				$requete = sprintf("%s WHERE nom = %s AND code = %d",
987
				   $select, self::quoteNonNull($nom_commune),
-
 
988
				   $code_commune);
920
					$select, self::quoteNonNull($nom_commune),
989
	    }
921
					$code_commune);
990
	}
922
			}
991
	elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
923
		} elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
992
	    // Code insee seul  
-
 
993
	    $code_insee_commune=$elements[1];
924
			// Code insee seul
994
	    $requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
925
			$code_insee_commune=$elements[1];
995
	}
926
			$requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
996
	else {
927
		} else {
997
	    // Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
928
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
998
	    // on prend le risque ici de retourner une mauvaise Commune
929
			// on prend le risque ici de retourner une mauvaise Commune
Line 999... Line -...
999
	    $nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
-
 
1000
	    $requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
930
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
1001
	}
931
			$requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
1002
 
-
 
1003
 
932
		}
1004
	if(array_key_exists($identifiant_commune, self::$cache['geo'])) {
933
 
1005
	    $resultat_commune = self::$cache['geo'][$identifiant_commune];
934
		if (array_key_exists($identifiant_commune, self::$cache['geo'])) {
1006
	}
935
			$resultat_commune = self::$cache['geo'][$identifiant_commune];
1007
	else {
-
 
1008
	    $resultat_commune = Cel::db()->requeter($requete);
-
 
Line 1009... Line 936...
1009
	    self::$cache['geo'][$identifiant_commune] = $resultat_commune;
936
		} else {
1010
	}
937
			$resultat_commune = Cel::db()->requeter($requete);
1011
	// TODO: levenstein sort ?
938
			self::$cache['geo'][$identifiant_commune] = $resultat_commune;
1012
	// TODO: count résultat !
939
		}
Line 1027... Line 954...
1027
	if(strpos($departement, "INSEE-C:", 0) === 0) {
954
		if (strpos($departement, "INSEE-C:", 0) === 0) {
1028
	    $localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
955
			$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
1029
	    $localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
956
			$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
1030
	}
957
		}
Line 1031... Line -...
1031
 
-
 
1032
 
958
 
1033
	if(!is_numeric($departement)) {
959
		if (!is_numeric($departement)) {
1034
	    $localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
960
			$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
1035
	    $localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
961
			$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
Line -... Line 962...
-
 
962
		}
1036
	}
963
 
-
 
964
		if (strlen($departement) == 4) {
1037
 
965
			$departement = "INSEE-C:0$departement";
1038
	if(strlen($departement) == 4) $departement = "INSEE-C:0" . $departement;
966
		}
1039
	if(strlen($departement) == 5) $departement = "INSEE-C:" . $departement;
967
		if (strlen($departement) == 5) {
1040
	// if(strlen($departement) <= 9) return "INSEE-C:0" . $departement; // ? ... TODO
968
			$departement = "INSEE-C:$departement";
Line 1041... Line 969...
1041
 
969
		}
1042
	$departement = trim($departement); // TODO
970
		$departement = trim($departement);
1043
 
971
 
Line 1044... Line -...
1044
	$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
-
 
1045
	$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
972
		$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
1046
    }
973
		$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
1047
    
974
	}
1048
    
975
 
1049
    public static function stockerChampsEtendus($champs_etendus, $ordre_ids, $config) {   	
976
	public static function stockerChampsEtendus($champs_etendus, $ordre_ids, $config) {
Line 1069... Line 996...
1069
    				$champs_etendus_obs[] = $champ_etendu_a_inserer;
996
					$champs_etendus_obs[] = $champ_etendu_a_inserer;
1070
    			}
997
				}
1071
    		}
998
			}
1072
    	}
999
		}
Line 1073... Line 1000...
1073
    	
1000
 
1074
    	$insertion = self::$gestion_champs_etendus->ajouterParLots($champs_etendus_obs);
1001
		self::$gestion_champs_etendus->ajouterParLots($champs_etendus_obs);
1075
    	//TODO: que faire si l'insertion des champs étendus échoue ?
1002
		//TODO: que faire si l'insertion des champs étendus échoue ?
1076
    	return count($champs_etendus_obs);	 
1003
		return count($champs_etendus_obs);
Line 1077... Line 1004...
1077
    }
1004
	}
Line 1091... Line 1018...
1091
	return $ordered + $array;
1018
		return $ordered + $array;
1092
    }
1019
	}
Line 1093... Line 1020...
1093
 
1020
 
1094
    // retourne une BBox [N,S,E,O) pour un référentiel donné
1021
	// retourne une BBox [N,S,E,O) pour un référentiel donné
1095
    static function getReferentielBBox($referentiel) {
1022
	static function getReferentielBBox($referentiel) {
-
 
1023
		if ($referentiel == 'bdtfx') {
1096
	if($referentiel == 'bdtfx') return Array(
1024
			return Array(
1097
	    'NORD' => 51.2, // Dunkerque
1025
				'NORD' => 51.2, // Dunkerque
1098
	    'SUD' => 41.3, // Bonifacio
1026
				'SUD' => 41.3, // Bonifacio
1099
	    'EST' => 9.7, // Corse
1027
				'EST' => 9.7, // Corse
-
 
1028
				'OUEST' => -5.2); // Ouessan
1100
	    'OUEST' => -5.2); // Ouessan
1029
		}
1101
	return FALSE;
1030
		return FALSE;
Line 1102... Line 1031...
1102
    }
1031
	}
1103
 
1032
 
1104
    // ces valeurs ne sont pas inséré via les placeholders du PDO::preparedStatement
1033
	// ces valeurs ne sont pas inséré via les placeholders du PDO::preparedStatement
1105
    // et doivent donc être échappées correctement.
1034
	// et doivent donc être échappées correctement.
1106
    public function initialiser_colonnes_statiques() {
1035
	public function initialiser_colonnes_statiques() {
1107
	$this->colonnes_statiques = array_merge($this->colonnes_statiques,
1036
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
1108
						Array(
1037
			array(
1109
						    "ce_utilisateur" => self::quoteNonNull($this->id_utilisateur), // peut-être un hash ou un id
1038
				'ce_utilisateur' => self::quoteNonNull($this->id_utilisateur), // peut-être un hash ou un id
1110
						    "prenom_utilisateur" => self::quoteNonNull($this->utilisateur['prenom']),
1039
				'prenom_utilisateur' => self::quoteNonNull($this->utilisateur['prenom']),
1111
						    "nom_utilisateur" => self::quoteNonNull($this->utilisateur['nom']),
1040
				'nom_utilisateur' => self::quoteNonNull($this->utilisateur['nom']),
1112
						    "courriel_utilisateur" => self::quoteNonNull($this->utilisateur['courriel']),
-
 
1113
						));
1041
				'courriel_utilisateur' => self::quoteNonNull($this->utilisateur['courriel']),
Line 1114... Line 1042...
1114
 
1042
			));
1115
    }
1043
	}
1116
 
1044
 
Line 1151... Line 1079...
1151
    }
1079
	}
Line 1152... Line 1080...
1152
 
1080
 
1153
    // équivalent à Bdd2->proteger() (qui wrap PDO::quote),
1081
	// équivalent à Bdd2->proteger() (qui wrap PDO::quote),
1154
    // sans transformer NULL en ""
1082
	// sans transformer NULL en ""
1155
    static function quoteNonNull($chaine) {
1083
	static function quoteNonNull($chaine) {
-
 
1084
		if (is_null($chaine)) {
-
 
1085
			return 'NULL';
1156
	if(is_null($chaine)) return "NULL";
1086
		}
1157
	if(!is_string($chaine) && !is_integer($chaine)) {
1087
		if (!is_string($chaine) && !is_integer($chaine)) {
1158
	    die("erreur: " . __FILE__ . ':' . __LINE__);
1088
			die('erreur: ' . __FILE__ . ':' . __LINE__);
1159
	}
1089
		}
1160
	return Cel::db()->quote($chaine);
1090
		return Cel::db()->quote($chaine);
Line 1161... Line 1091...
1161
    }
1091
	}