Subversion Repositories Applications.annuaire

Rev

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