Subversion Repositories eFlore/Applications.cel

Rev

Rev 1636 | Rev 1640 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1636 raphael 1
<?php
2
 
3
/**
4
* @category  PHP
5
* @package   jrest
6
* @author    Raphaël Droz <raphael@tela-botania.org>
7
* @copyright 2013 Tela-Botanica
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>
10
*/
11
 
12
/**
13
 * Service d'import de données d'observation du CEL au format XLS
14
 */
15
 
1638 raphael 16
// sont define()'d commme n° de colonne tous les abbrevs retournés par ExportXLS::nom_d_ensemble_vers_liste_de_colonnes()
1636 raphael 17
// préfixés par C_  cf: detectionEntete()
18
 
19
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
20
// TERM
21
error_reporting(-1);
22
ini_set('html_errors', 0);
23
ini_set('xdebug.cli_color', 2);
24
require_once('lib/PHPExcel/Classes/PHPExcel.php');
25
require_once('ExportXLS.php');
26
 
27
class MyReadFilter implements PHPExcel_Reader_IReadFilter {
1638 raphael 28
	public $exclues = array();
1636 raphael 29
	public function __construct() {}
1638 raphael 30
    public function readCell($colonne, $ligne, $worksheetName = '') {
31
		if(@$this->exclues[$colonne]) return false;
32
		if($ligne == 1) return false;
1636 raphael 33
		return true;
34
    }
35
}
36
 
37
class ImportXLS extends Cel  {
38
 
39
	static $ordre_BDD = Array(
40
		"ce_utilisateur",
41
		"prenom_utilisateur",
42
		"nom_utilisateur",
43
		"courriel_utilisateur",
44
		"ordre",
45
		"nom_sel",
46
		"nom_sel_nn",
47
		"nom_ret",
48
		"nom_ret_nn",
49
		"nt",
50
		"famille",
51
		"nom_referentiel",
52
		"zone_geo",
53
		"ce_zone_geo",
54
		"date_observation",
55
		"lieudit",
56
		"station",
57
		"milieu",
58
		"commentaire",
59
		"transmission",
60
		"date_creation",
61
		"date_modification",
62
		"latitude",
63
		"longitude");
64
 
65
	function ExportXLS($config) {
66
		parent::__construct($config);
67
	}
68
 
69
	function createElement($pairs) {
70
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
71
			echo '0'; exit;
72
		}
73
		if(!isset($_SESSION)) session_start();
74
        $this->controleUtilisateur($pairs['utilisateur']);
75
 
76
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($pairs['utilisateur']);
77
 
78
		$infos_fichier = array_pop($_FILES);
79
 
80
		/*$objPHPExcel = PHPExcel_IOFactory::load($infos_fichier['tmp_name']);
1638 raphael 81
		  $donnees = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);*/
1636 raphael 82
 
83
		/*$objReader = PHPExcel_IOFactory::createReader("Excel5");
84
		$objReader->setReadDataOnly(true);
85
		$objPHPExcel = $objReader->load($infos_fichier['tmp_name']);*/
86
 
1638 raphael 87
		//var_dump($donnees);
1636 raphael 88
 
89
		$objReader = PHPExcel_IOFactory::createReader("Excel5");
90
		$objReader->setReadDataOnly(true);
91
		$objPHPExcel = $objReader->load($infos_fichier['tmp_name']);
1638 raphael 92
		$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);
1636 raphael 93
 
1638 raphael 94
		$filtre_colonnes = new MyReadFilter();
95
		$filtre_colonnes->exclues = self::detectionEntete($donnees[1]);
96
		$objReader->setReadFilter($filtre_colonnes);
1636 raphael 97
 
98
		// recharge avec le filtre sur colonnes actif
99
		// (exclue les colonnes inutiles/inutilisables)
100
		$objPHPExcel = $objReader->load($infos_fichier['tmp_name']);
1638 raphael 101
		$donnees = $objPHPExcel->getActiveSheet()->toArray(NULL,FALSE,FALSE,TRUE);
102
		self::charger($donnees);
1636 raphael 103
	}
104
 
105
	static function detectionEntete($entete) {
106
		$colonnes_reconnues = Array();
1638 raphael 107
		$cols = ExportXLS::nom_d_ensemble_vers_liste_de_colonnes('standard');
1636 raphael 108
		foreach($entete as $k => $v) {
109
			$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
110
			foreach($cols as $col) {
111
				$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
1638 raphael 112
				$entete_officiel_abbrev = $col['abbrev'];
113
				if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
114
					define("C_" . strtoupper($entete_officiel_abbrev), $k);
1636 raphael 115
					$colonnes_reconnues[$k] = 1;
116
					break;
117
				}
118
			}
119
		}
120
 
121
		// eg: 'I' => "rien"
122
		$colonnesID_non_reconnues = array_diff_key($entete, $colonnes_reconnues);
123
 
124
		$colonnes_automatiques = array_filter($cols, function($v) {	return !$v['importable']; });
125
		// ne conserve que le nom long pour matcher avec la ligne XLS d'entête
126
		array_walk($colonnes_automatiques, function(&$v) {	$v = $v['nom']; });
127
		$colonnesID_a_exclure = array_intersect($entete, $colonnes_automatiques);
1638 raphael 128
		// TODO: pourquoi ne pas comparer avec les abbrevs aussi
1636 raphael 129
 
130
		return array_merge($colonnesID_non_reconnues, $colonnesID_a_exclure);
131
	}
132
 
133
	static function charger($donnees) {
134
		// TODO: chunkfilter
1638 raphael 135
		$morceaux = 30;
1636 raphael 136
		$i = 2;
1638 raphael 137
		$fin = $i + $morceaux;
138
		while($i < $fin && isset($donnees[$i])) {
139
			$enregistrement = self::chargerLigne($donnees[$i]);
140
			$req = implode(', ', self::sortArrayByArray($enregistrement, self::$ordre_BDD));
1636 raphael 141
			$i++;
142
		}
143
	}
144
 
145
	// TODO: bouger les valeurs fixes comme valeurs de self::$ordre_BDD
146
	// et compter sur un array_merge()
147
 
148
	// TODO, théoriquement, l'ordre des index peut-être changé si nécessaire car
149
	// nous utilisons self::sortArrayByArray()
150
	static function chargerLigne($ligne) {
151
		// en premier car le résultat est utile pour
152
		// traiter longitude et latitude (traiterLonLat())
153
		$referentiel = self::identReferentiel($ligne[C_REFERENTIEL]);
154
 
155
		return Array(
156
			"ce_utilisateur" => XXX,
157
			"prenom_utilisateur" => XXX,
158
			"nom_utilisateur" => XXX,
159
			"courriel_utilisateur" => XXX,
160
			"ordre" => YYY,
161
			"nom_sel" => TODO,
162
			"nom_sel_nn" => TODO,
163
			"nom_ret" => TODO,
164
			"nom_ret_nn" => TODO,
165
			"nt" => TODO,
166
			"famille" => TODO,
167
			"nom_referentiel" => $referentiel,
168
			"zone_geo" => TODO,
169
			"ce_zone_geo" => TODO,
170
			"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION]),
171
			"lieudit" => trim($ligne[C_LIEUDIT]),
172
			"station" => trim($ligne[C_STATION]),
173
			"milieu" => trim($ligne[C_MILIEU]),
174
			"commentaire" => trim($ligne[C_COMMENTAIRE]),
175
 
176
			// XXX: fixe
1638 raphael 177
			"transmission" => 0, // cf commentaire dans ExportXLS::nom_d_ensemble_vers_liste_de_colonnes()
1636 raphael 178
			"date_creation" => date("Y-m-d H:i:s"),
179
			"date_modification" => date("Y-m-d H:i:s"),
180
 
181
			"latitude" => self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel),
182
			"longitude" => self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel)
183
		);
184
	}
185
 
186
	static function traiterDateObs($date) {
187
		return NULL; // TODO
188
	}
189
 
190
	static function identReferentiel($referentiel) {
191
		return NULL; // TODO
192
	}
193
 
194
	static function traiterLonLat($lon = NULL, $lat = NULL, $referentiel = 'bdtfx:v1.01') {
195
		// verifier format decimal +
196
		// + limite france si bdtfx ou bdtxa
197
	}
198
 
199
	// http://stackoverflow.com/questions/348410/sort-an-array-based-on-another-array
200
	static function sortArrayByArray($array,$orderArray) {
201
		$ordered = array();
202
		foreach($orderArray as $key) {
203
			if(array_key_exists($key, $array)) {
204
				$ordered[$key] = $array[$key];
205
				unset($array[$key]);
206
			}
207
		}
208
		return $ordered + $array;
209
	}
210
}