Subversion Repositories Applications.annuaire

Rev

Rev 294 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 aurelien 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * classe Controleur du module Carte.
5
 *
473 jpm 6
 * @package	 Collection
7
 * @category	Php5
8
 * @author	  Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author	  Aurélien Peronnet <aurelien@tela-botanica.org>
31 aurelien 10
 * @copyright   2010 Tela-Botanica
473 jpm 11
 * @license	 http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license	 http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
31 aurelien 13
 */
120 aurelien 14
class CartoControleur extends AppControleur {
31 aurelien 15
 
16
	// identifiant de la france pour l'accès direct
473 jpm 17
	private $id_france = 'fr';
31 aurelien 18
 
44 aurelien 19
	// nom du fond de carte en cours
473 jpm 20
	private $nom_fond = '';
44 aurelien 21
 
473 jpm 22
	private $niveau = 0;
31 aurelien 23
 
473 jpm 24
	// contient le tableau de données sur les continents une fois chargé
25
	private $donnees_continents = array();
31 aurelien 26
 
473 jpm 27
	// contient le tableau de données sur les pays une fois chargé
28
	private $donnees_pays = array();
31 aurelien 29
 
473 jpm 30
	// contient le tableau de données sur les departements une fois chargé
31
	private $donnees_departements = array();
32
 
33
	// contient le nombre total d'inscrits dans la zone en cours de consultation
34
	private $total_inscrits_zone = 0;
35
 
36
	//+----------------------------------------------------------------------------------------------------------------+
37
	// Méthodes
38
 
39
	/**
40
	 * Fonction d'affichage par défaut, elle appelle la cartographie
41
	 */
42
	public function executerActionParDefaut() {
43
		return $this->cartographier(1);
44
	}
45
 
46
	/**
47
	 * Cartographier un annuaire.
48
	 * @param int $id_annuaire l'identitifiant de l'annuaire à cartographier
49
	 * @param int $continent l'identitifiant du continent sur lequel on se trouve
50
	 * @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
51
	 * @return string la vue correspondante
52
	 */
53
	public function cartographier($id_annuaire, $continent= null , $pays = null) {
54
		// Initialisation de variable
55
		$donnees = array();
56
 
44 aurelien 57
		// la présence d'un pays (non) et d'un continent (ou non) détermine le niveau de carte à afficher
473 jpm 58
		$this->niveau = $this->calculerNiveau($continent, $pays);
31 aurelien 59
 
473 jpm 60
		// suivant le niveau, continent et pays, on renvoie un template html différent
61
		$fond = $this->renvoyerPrefixePourNiveau($this->niveau, $continent, $pays);
44 aurelien 62
 
63
		$carte = '';
64
 
65
		// chaque continent possède un fond de carte différent
473 jpm 66
		if ($this->niveau == 1) {
67
			$carte = $this->renvoyerSuffixePourContinent($this->niveau, $continent, $pays);
44 aurelien 68
		}
69
 
473 jpm 70
		// Création de la carte
71
		$options = array(
72
			'carte_nom' => $fond.$carte,
73
			'formule' => Cartographie::FORMULE_PROPORTIONNEL,
74
			'couleur_claire' => Config::get('carte_couleur_claire'),
75
			'couleur_foncee' => Config::get('carte_couleur_foncee'),
76
			'fond_fichier' => Config::get('carte_base_nom_'.$fond).$carte,
77
			'fond_dossier' => Application::getChemin().Config::get('carte_fonds_chemin'),
78
			'stock_dossier' => Config::get('carte_stockage_chemin'),
79
			'stock_url' => Config::get('carte_stockage_url'),
80
			'debug' => Config::get('carte_mode_debug'));
81
		$cartographie = Composant::fabrique('cartographie', $options);
44 aurelien 82
 
473 jpm 83
		$this->nom_fond = Config::get('carte_base_nom_'.$fond).$carte;
44 aurelien 84
 
473 jpm 85
		// Construction des données nécessaires à la cartographie
86
		$zones = $cartographie->getCarteZones();
87
		$this->chargerZonesNbre($id_annuaire,$zones, $this->niveau);
88
		$this->chargerZonesUrls($id_annuaire, $zones, $continent, $pays, $this->niveau);
56 aurelien 89
 
473 jpm 90
		$navigation = new NavigationControleur();
221 aurelien 91
		$donnees_navigation = $this->obtenirUrlsNavigation($id_annuaire, $continent, $pays, null);
294 aurelien 92
		$donnees['infos_pays'] = $donnees_navigation;
221 aurelien 93
		$donnees['navigation'] = $navigation->afficherBandeauNavigationCartographie($donnees_navigation);
294 aurelien 94
		$donnees['nb_resultats'] = $this->total_inscrits_zone;
56 aurelien 95
 
473 jpm 96
		$cartographie->setCarteZones($zones);
31 aurelien 97
 
473 jpm 98
		$cartographie->creerCarte();
99
		$donnees['map'] = $cartographie->getImageMap();
31 aurelien 100
 
473 jpm 101
		$resultat = $this->getVue('cartes/'.$fond, $donnees);
102
		return $resultat;
103
	}
31 aurelien 104
 
44 aurelien 105
	/**
106
	 * Charge le nombre d'inscrit par zone pour un annuaire donné
107
	 * @param int $id_annuaire l'identifiant de l'annuaire
108
	 * @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées)
109
	 * @param int $niveau le niveau de la carto (monde, continent, ou pays)
110
	 */
473 jpm 111
	private function chargerZonesNbre($id_annuaire, &$zones, $niveau = 0) {
112
		$metaModele = $this->getModele('AnnuaireModele');
113
		// on charge les inscrits pour le niveau donné
114
		$zones_infos = $this->chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau);
31 aurelien 115
 
473 jpm 116
		foreach ($zones as $id => &$infos) {
44 aurelien 117
			// si l'on a des données pour la zone, on renseigne le nombre d'inscrits
473 jpm 118
			if (isset($zones_infos[$id])) {
119
				$nbre = $zones_infos[$id];
120
				$infos['info_nombre'] = $nbre;
121
				$this->total_inscrits_zone += $nbre;
122
			} else {
123
				// sinon on le met à 0
124
				$infos['info_nombre'] = 0;
125
			}
126
		}
127
	}
31 aurelien 128
 
44 aurelien 129
	/**
130
	 * Charge les des zones pour un annuaire donné
131
	 * @param int $id_annuaire l'identifiant de l'annuaire
132
	 * @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées)
133
	 * @param int $continent l'identitifiant du continent sur lequel on se trouve
473 jpm 134
	 * @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
44 aurelien 135
	 * @param int $niveau le niveau de la carto (monde, continent, ou pays)
136
	 */
473 jpm 137
	private function chargerZonesUrls($id_annuaire, &$zones, $continent = null, $pays = null, $niveau = 0) {
31 aurelien 138
 
473 jpm 139
		$url = new URL(Config::get('url_base'));
56 aurelien 140
 
473 jpm 141
		$url->setVariableRequete('id_annuaire', $id_annuaire);
31 aurelien 142
 
473 jpm 143
		foreach ($zones as $id => &$infos) {
31 aurelien 144
 
473 jpm 145
			switch ($niveau) {
44 aurelien 146
				// niveau 0 de la carte : on affiche tous les continents
147
				// l'url va pointer vers un continent en particulier
148
				case 0:
149
					$url->setVariableRequete('m', 'annuaire_afficher_carte');
150
					$url->setVariableRequete('continent', $id);
151
				break;
31 aurelien 152
 
44 aurelien 153
				// niveau 1, on est sur un continent en particulier : on affiche le détail du continent demandé
154
				// l'url pointe sur des pays
155
				case 1:
156
					$url->setVariableRequete('continent', $continent);
31 aurelien 157
 
44 aurelien 158
					// si le pays c'est la france alors l'url pointera vers la carte des départements
159
					if($id == $this->id_france) {
160
						$url->setVariableRequete('m', 'annuaire_afficher_carte');
161
					} else {
162
						// sinon l'url pointe vers la liste des inscrits de ce pays
163
						$url->setVariableRequete('m', 'annuaire_inscrits_carto');
164
					}
165
					$url->setVariableRequete('pays', $id);
31 aurelien 166
 
44 aurelien 167
				break;
31 aurelien 168
 
44 aurelien 169
				// niveau 2, si on a cliqué sur la france pour afficher les départements :
56 aurelien 170
				case 2:
171
					$url->setVariableRequete('m','annuaire_inscrits_carto');
44 aurelien 172
					$url->setVariableRequete('continent', $continent);
173
					$url->setVariableRequete('pays', $pays);
174
					$url->setVariableRequete('departement', $id);
175
				break;
176
			}
473 jpm 177
			$infos['url'] = sprintf($url, $id);
178
		}
179
	}
31 aurelien 180
 
44 aurelien 181
	/**
182
	 * Renvoie le niveau auquel on se trouve suivant la présence ou non de certains paramètres
183
	 * @param int $continent l'identitifiant du continent sur lequel on se trouve
473 jpm 184
	 * @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
44 aurelien 185
	 */
473 jpm 186
	private function calculerNiveau($continent, $pays) {
31 aurelien 187
 
188
		// le niveau 0 c'est la carte de base
473 jpm 189
		$niveau = 0;
31 aurelien 190
 
191
		// le niveau 1 on consulte un continent en particulier (ex. Amérique du Sud)
192
		if($continent != null) {
473 jpm 193
			$niveau = 1;
194
		}
31 aurelien 195
 
196
		// le niveau 2 c'est un pays en particulier (ce cas là n'arrive que pour la france)
473 jpm 197
		if($pays != null) {
198
			$niveau = 2;
199
		}
31 aurelien 200
 
473 jpm 201
		return $niveau;
202
	}
31 aurelien 203
 
44 aurelien 204
	/**
205
	 * Renvoie le type de template à utiliser suivant le niveau de certains paramètres
206
	 * @param int $niveau le niveau de la carto
207
	 * @return string le type de template
208
	 */
473 jpm 209
	private function renvoyerPrefixePourNiveau($niveau) {
210
		switch ($niveau) {
211
			case 0:
212
				$fond = 'continents';
213
			break;
31 aurelien 214
 
473 jpm 215
			case 1:
31 aurelien 216
				$fond = 'pays';
473 jpm 217
			break;
31 aurelien 218
 
473 jpm 219
			case 2 :
31 aurelien 220
				$fond = 'france';
221
			break;
222
 
223
			default:
44 aurelien 224
				$fond = '';
31 aurelien 225
			break;
473 jpm 226
		}
31 aurelien 227
 
473 jpm 228
		return $fond;
229
	}
31 aurelien 230
 
44 aurelien 231
	/**
232
	 * Renvoie le suffixe de fond de carte à utiliser pour un continent donné
233
	 * @param int $niveau le niveau de la carto
234
	 * @param int $niveau l'identifiant de continent
235
	 * @return string le suffixe
236
	 */
473 jpm 237
	private function renvoyerSuffixePourContinent($niveau, $continent) {
31 aurelien 238
 
473 jpm 239
		switch ($continent) {
240
			case 1:
44 aurelien 241
				$carte = '_afrique';
242
			break;
243
 
473 jpm 244
			case 2:
44 aurelien 245
				$carte = '_nord_amerique';
246
			break;
247
 
473 jpm 248
			case 3:
44 aurelien 249
				$carte = '_asie';
250
			break;
251
 
473 jpm 252
			case 4:
44 aurelien 253
				$carte = '_europe';
254
			break;
255
 
473 jpm 256
			case 5:
44 aurelien 257
				$carte = '_oceanie';
473 jpm 258
			break;
44 aurelien 259
 
473 jpm 260
			case 6:
44 aurelien 261
				$carte = '_sud_amerique';
473 jpm 262
			break;
44 aurelien 263
 
473 jpm 264
			case 7:
44 aurelien 265
				$carte = '_moyen_orient';
473 jpm 266
			break;
44 aurelien 267
 
473 jpm 268
			default:
269
				$carte = '';
270
			break;
271
		}
44 aurelien 272
 
473 jpm 273
		return $carte;
274
	}
44 aurelien 275
 
276
	/**
277
	 * renvoie tous les noms templates pour chaque zone du monde
278
	 * @return array un tableau associatif indexé par les identifiants de zone et contenant les noms de templates
279
	 */
473 jpm 280
	private function renvoyerTousTemplates() {
281
		return array(1 => 'pays_afrique', 2 => 'pays_nord_amerique', 3 => 'pays_asie', 4 => 'pays_europe', 5 => 'pays_oceanie', 6 => 'pays_sud_amerique', 7 => 'pays_moyen_orient');
282
	}
44 aurelien 283
 
284
	/**
285
	 * Charge la liste des inscrits par zone pour un niveau géographique donné
286
	 * @param int $id_annuaire l'identifiant de l'annuaire
287
	 * @param int $niveau le niveau où l'on se situe
288
	 * @return array un tableau associatif indexé par les identifiants de zone et contenant le nombre d'inscrits pour chaque zone
289
	 */
473 jpm 290
	private function chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau) {
291
		if ($niveau == 0) {
44 aurelien 292
			// si on est au niveau des continents
293
			$zones_ids = array();
294
			// il faut faire la somme des inscrits par zones géographique
295
			$templates = $this->renvoyerTousTemplates();
296
		} else {
297
			// sinon on appelle la fonction pour la zone demandée
298
			$zones_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$this->nom_fond);
299
		}
300
 
31 aurelien 301
		$annuaire_controleur = new AnnuaireControleur();
473 jpm 302
		$nb_inscrits = array();
31 aurelien 303
		switch ($niveau) {
473 jpm 304
			case 0 : // niveau de la carte du monde
305
				// pour chacun des continents, on fait la somme des membres de sa zone
306
				foreach ($templates as $id_continent => $template) {
307
					$zones_continent_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$template);
308
					$nb_inscrits[$id_continent] = array_sum($annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_continent_ids));
309
				}
310
				break;
311
			case 1 : // niveau de la carte des pays d'un continent
44 aurelien 312
				$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_ids);
473 jpm 313
				break;
314
			case 2 : // détail d'un pays
31 aurelien 315
				$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire);
473 jpm 316
				break;
31 aurelien 317
		}
473 jpm 318
		return $nb_inscrits;
319
	}
31 aurelien 320
 
473 jpm 321
	public function obtenirUrlsNavigation($id_annuaire ,$continent = null, $pays = null, $departement = null) {
322
		$url_carte_monde = new URL(Config::get('url_base'));
323
		$url_carte_monde->setVariableRequete('id_annuaire', $id_annuaire);
221 aurelien 324
		$url_carte_monde->setVariableRequete('m', 'annuaire_afficher_carte');
473 jpm 325
		$donnees = array();
326
		$donnees['url_carte_monde'] =  $url_carte_monde;
327
		$donnees['nom_carte_monde'] =  'Carte du monde';
328
 
329
		if ($continent != null && trim($continent) != '') {
330
			$infos_continents = $this->chargerInformationsContinentCsv();
331
			$url_continent = new URL(Config::get('url_base'));
332
			$url_continent->setVariableRequete('id_annuaire', $id_annuaire);
221 aurelien 333
			$url_continent->setVariableRequete('m', 'annuaire_afficher_carte');
334
			$url_continent->setVariableRequete('continent', $continent);
473 jpm 335
			$donnees['url_continent'] =  $url_continent;
336
			$donnees['nom_continent'] =  $infos_continents[$continent][2];
337
		}
338
 
339
		if ($pays != null && trim($pays) != '') {
340
			$templates_continents = $this->renvoyerTousTemplates();
341
			$infos_continents = $this->chargerInformationsPaysDuContinentsCsv($templates_continents[$continent]);
342
			$infos_pays = $infos_continents[$pays];
343
			$url_pays = new URL(Config::get('url_base'));
344
			$url_pays->setVariableRequete('id_annuaire', $id_annuaire);
345
			if ($pays == $this->id_france) {
221 aurelien 346
				$url_pays->setVariableRequete('m', 'annuaire_afficher_carte');
347
			} else {
348
				// sinon l'url pointe vers la liste des inscrits de ce pays
349
				$url_pays->setVariableRequete('m', 'annuaire_inscrits_carto');
350
			}
351
			$url_pays->setVariableRequete('continent', $continent);
352
			$url_pays->setVariableRequete('pays', $pays);
473 jpm 353
			$donnees['url_pays'] =  $url_pays;
354
			$donnees['nom_pays'] =  $infos_pays[2];
355
		}
356
 
357
		if ($departement != null && trim($departement) != '') {
358
			$infos_departement = $this->chargerInformationsDepartementsFranceCsv();
359
			$url_departement = new URL(Config::get('url_base'));
360
			$url_departement->setVariableRequete('id_annuaire', $id_annuaire);
221 aurelien 361
			$url_departement->setVariableRequete('m', 'annuaire_afficher_carte');
362
			$url_departement->setVariableRequete('continent', $continent);
363
			$url_departement->setVariableRequete('departement', $departement);
364
			$url_departement->setVariableRequete('pays', $pays);
473 jpm 365
			$donnees['url_departement'] =  $url_departement;
366
			$donnees['nom_departement'] =  $infos_departement[$departement][2];
367
		}
44 aurelien 368
 
473 jpm 369
		$donnees['nb_resultats'] = $this->total_inscrits_zone;
370
		return $donnees;
371
	}
294 aurelien 372
 
473 jpm 373
	public function chargerInformationsContinentCsv() {
374
		$nom_csv = Application::getChemin().Config::get('carte_fonds_chemin').'continents';
375
		return $this->chargerInformationsCompletesParCsv($nom_csv);
376
	}
221 aurelien 377
 
473 jpm 378
	public function chargerInformationsPaysDuContinentsCsv($continent) {
379
		$nom_csv = Application::getChemin().Config::get('carte_fonds_chemin').$continent;
380
		return $this->chargerInformationsCompletesParCsv($nom_csv);
381
	}
221 aurelien 382
 
473 jpm 383
	public function chargerInformationsDepartementsFranceCsv() {
384
		$nom_csv = Application::getChemin().Config::get('carte_fonds_chemin').'france';
385
		return $this->chargerInformationsCompletesParCsv($nom_csv);
386
	}
387
 
388
	public function chargerInformationsCompletesParCsv($nom_csv) {
389
		$fichier_csv = $nom_csv.'.csv';
390
		$infos = array();
391
 
221 aurelien 392
		if (($handle = fopen($fichier_csv, 'r')) !== false) {
393
			$ligne = 0;
394
			while (($donnees = fgetcsv($handle, 1000, ',')) !== false) {
395
				if($ligne != 0 && trim($donnees[0]) != '') {
396
					$infos[$donnees[0]] = $donnees;
397
				}
398
				$ligne++;
399
			}
400
			fclose($handle);
401
		}
402
		return $infos;
473 jpm 403
	}
221 aurelien 404
 
44 aurelien 405
	/**
406
	 * Récupère les identifiants de zone dans un fichier csv donné
407
	 * @param string $nom_csv chemin vers le fichier csv (sans extension) qui contient les données
408
	 * @return array un tableau contenant les identifiants des zones
409
	 */
473 jpm 410
	private function chargerZonesParCsv($nom_csv) {
44 aurelien 411
		$fichier_csv = $nom_csv.'.csv';
412
		$zones_id = array();
413
		if (($handle = fopen($fichier_csv, 'r')) !== false) {
414
			$ligne = 0;
415
			while (($donnees = fgetcsv($handle, 1000, ',')) !== false) {
416
				if($ligne != 0 && trim($donnees[0]) != '') {
417
					$zones_id[] = "'".$donnees[0]."'";
418
				}
419
				$ligne++;
420
			}
421
			fclose($handle);
422
		}
423
		return $zones_id;
473 jpm 424
	}
425
}