Subversion Repositories Applications.annuaire

Rev

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