Subversion Repositories Applications.annuaire

Rev

Rev 31 | Rev 56 | 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
 */
15
class CartoControleur extends Controleur {
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 = '';
23
 
31 aurelien 24
    //+----------------------------------------------------------------------------------------------------------------+
25
    // Méthodes
26
 
27
    /**
28
     * Fonction d'affichage par défaut, elle appelle la cartographie
29
     */
30
    public function executerActionParDefaut() {
31
        return $this->cartographier(1);
32
    }
33
 
34
    /**
35
     * Cartographier un annuaire.
44 aurelien 36
     * @param int $id_annuaire l'identitifiant de l'annuaire à cartographier
37
     * @param int $continent l'identitifiant du continent sur lequel on se trouve
38
     * @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
31 aurelien 39
     * @return string la vue correspondante
40
     */
44 aurelien 41
    public function cartographier($id_annuaire, $continent= null , $pays = null) {
31 aurelien 42
        // Initialisation de variable
43
        $donnees = array();
44
 
44 aurelien 45
		// la présence d'un pays (non) et d'un continent (ou non) détermine le niveau de carte à afficher
31 aurelien 46
        $niveau = $this->calculerNiveau($continent, $pays);
47
 
44 aurelien 48
        // suivant le niveau, continent et pays, on renvoie un template html différent
49
        $fond = $this->renvoyerPrefixePourNiveau($niveau, $continent, $pays);
50
 
51
		$carte = '';
52
 
53
		// chaque continent possède un fond de carte différent
54
		if($niveau == 1) {
55
        	$carte = $this->renvoyerSuffixePourContinent($niveau, $continent, $pays);
56
		}
57
 
31 aurelien 58
        // Création de la carte
59
        $options = array(
44 aurelien 60
            'carte_nom' => $fond.$carte,
31 aurelien 61
            'formule' => Cartographie::FORMULE_PROPORTIONNEL,
62
            'couleur_claire' => Config::get('carte_couleur_claire'),
63
            'couleur_foncee' => Config::get('carte_couleur_foncee'),
44 aurelien 64
            'fond_fichier' => Config::get('carte_base_nom_'.$fond).$carte,
31 aurelien 65
            'fond_dossier' => Application::getChemin().Config::get('carte_fonds_chemin'),
66
            'stock_dossier' => Config::get('carte_stockage_chemin'),
67
            'stock_url' => Config::get('carte_stockage_url'),
68
            'debug' => Config::get('carte_mode_debug'));
69
        $cartographie = Composant::fabrique('cartographie', $options);
44 aurelien 70
 
71
        $this->nom_fond = Config::get('carte_base_nom_'.$fond).$carte;
72
 
31 aurelien 73
        // Construction des données nécessaires à la cartographie
74
        $zones = $cartographie->getCarteZones();
44 aurelien 75
        $this->chargerZonesNbre($id_annuaire,$zones, $niveau);
31 aurelien 76
        $this->chargerZonesUrls($id_annuaire, $zones, $continent, $pays, $niveau);
77
        $cartographie->setCarteZones($zones);
78
 
79
        $cartographie->creerCarte();
80
        $donnees['map'] = $cartographie->getImageMap();
81
 
82
        $resultat = $this->getVue('cartes/'.$fond, $donnees);
83
        return $resultat;
84
    }
85
 
44 aurelien 86
	/**
87
	 * Charge le nombre d'inscrit par zone pour un annuaire donné
88
	 * @param int $id_annuaire l'identifiant de l'annuaire
89
	 * @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées)
90
	 * @param int $niveau le niveau de la carto (monde, continent, ou pays)
91
	 */
92
    private function chargerZonesNbre($id_annuaire, &$zones, $niveau = 0) {
31 aurelien 93
 
94
        $metaModele = $this->getModele('AnnuaireModele');
44 aurelien 95
        // on charge les inscrits pour le niveau donné
96
        $zones_infos = $this->chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau);
31 aurelien 97
 
98
        foreach ($zones as $id => &$infos) {
99
 
44 aurelien 100
			// si l'on a des données pour la zone, on renseigne le nombre d'inscrits
31 aurelien 101
            if (isset($zones_infos[$id])) {
102
 
103
                $nbre = $zones_infos[$id];
104
                $infos['info_nombre'] = $nbre;
105
            } else {
44 aurelien 106
            	// sinon on le met à 0
31 aurelien 107
                $infos['info_nombre'] = 0;
108
            }
109
        }
110
    }
111
 
44 aurelien 112
	/**
113
	 * Charge les des zones pour un annuaire donné
114
	 * @param int $id_annuaire l'identifiant de l'annuaire
115
	 * @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées)
116
	 * @param int $continent l'identitifiant du continent sur lequel on se trouve
117
     * @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
118
	 * @param int $niveau le niveau de la carto (monde, continent, ou pays)
119
	 */
31 aurelien 120
    private function chargerZonesUrls($id_annuaire, &$zones, $continent = null, $pays = null, $niveau = 0) {
121
 
122
    	$url = new URL(Config::get('url_base'));
123
    	$url->setVariableRequete('id_annuaire', $id_annuaire);
124
 
125
        $url->setVariableRequete('m', 'annuaire_recherche_inscrit_carto');
126
        foreach ($zones as $id => &$infos) {
127
 
128
        	switch ($niveau) {
44 aurelien 129
				// niveau 0 de la carte : on affiche tous les continents
130
				// l'url va pointer vers un continent en particulier
131
				case 0:
132
					$url->setVariableRequete('m', 'annuaire_afficher_carte');
133
					$url->setVariableRequete('continent', $id);
134
				break;
31 aurelien 135
 
44 aurelien 136
				// niveau 1, on est sur un continent en particulier : on affiche le détail du continent demandé
137
				// l'url pointe sur des pays
138
				case 1:
139
					$url->setVariableRequete('continent', $continent);
31 aurelien 140
 
44 aurelien 141
					// si le pays c'est la france alors l'url pointera vers la carte des départements
142
					if($id == $this->id_france) {
143
						$url->setVariableRequete('m', 'annuaire_afficher_carte');
144
					} else {
145
						// sinon l'url pointe vers la liste des inscrits de ce pays
146
						$url->setVariableRequete('m', 'annuaire_inscrits_carto');
147
					}
148
					$url->setVariableRequete('pays', $id);
31 aurelien 149
 
44 aurelien 150
				break;
31 aurelien 151
 
44 aurelien 152
				// niveau 2, si on a cliqué sur la france pour afficher les départements :
153
				case 1:
154
					$methode = 'annuaire_afficher_carte';
155
					$url->setVariableRequete('continent', $continent);
156
					$url->setVariableRequete('pays', $pays);
157
					$url->setVariableRequete('departement', $id);
158
				break;
159
			}
31 aurelien 160
            $infos['url'] = sprintf($url, $id);
161
        }
162
 
163
        $url->unsetVariablesRequete(array('id_location','m','id_annuaire'));
164
    }
165
 
44 aurelien 166
	/**
167
	 * Renvoie le niveau auquel on se trouve suivant la présence ou non de certains paramètres
168
	 * @param int $continent l'identitifiant du continent sur lequel on se trouve
169
     * @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent)
170
	 */
31 aurelien 171
    private function calculerNiveau($continent, $pays) {
172
 
173
		// le niveau 0 c'est la carte de base
174
    	$niveau = 0;
175
 
176
		// le niveau 1 on consulte un continent en particulier (ex. Amérique du Sud)
177
		if($continent != null) {
44 aurelien 178
    		$niveau = 1;
31 aurelien 179
    	}
180
 
181
		// le niveau 2 c'est un pays en particulier (ce cas là n'arrive que pour la france)
182
    	if($pays != null) {
44 aurelien 183
    		$niveau = 2;
31 aurelien 184
    	}
185
 
186
    	return $niveau;
187
    }
188
 
44 aurelien 189
	/**
190
	 * Renvoie le type de template à utiliser suivant le niveau de certains paramètres
191
	 * @param int $niveau le niveau de la carto
192
	 * @return string le type de template
193
	 */
194
    private function renvoyerPrefixePourNiveau($niveau) {
31 aurelien 195
    	switch ($niveau) {
196
    		case 0:
197
    			$fond = 'continents';
198
    		break;
199
 
44 aurelien 200
    		case 1:
31 aurelien 201
				$fond = 'pays';
202
    		break;
203
 
204
    		case 2 :
205
				$fond = 'france';
206
			break;
207
 
208
			default:
44 aurelien 209
				$fond = '';
31 aurelien 210
			break;
211
    	}
212
 
213
    	return $fond;
214
    }
215
 
44 aurelien 216
	/**
217
	 * Renvoie le suffixe de fond de carte à utiliser pour un continent donné
218
	 * @param int $niveau le niveau de la carto
219
	 * @param int $niveau l'identifiant de continent
220
	 * @return string le suffixe
221
	 */
222
    private function renvoyerSuffixePourContinent($niveau, $continent) {
31 aurelien 223
 
44 aurelien 224
    	switch ($continent) {
225
    		case 1:
226
				$carte = '_afrique';
227
			break;
228
 
229
    		case 2:
230
				$carte = '_nord_amerique';
231
			break;
232
 
233
    		case 3:
234
				$carte = '_asie';
235
			break;
236
 
237
    		case 4:
238
				$carte = '_europe';
239
			break;
240
 
241
    		case 5:
242
				$carte = '_oceanie';
243
    		break;
244
 
245
    		case 6:
246
				$carte = '_sud_amerique';
247
    		break;
248
 
249
    		case 7:
250
				$carte = '_moyen_orient';
251
    		break;
252
 
253
    		default:
254
    			$carte = '';
255
    		break;
256
    	}
257
 
258
    	return $carte;
259
    }
260
 
261
	/**
262
	 * renvoie tous les noms templates pour chaque zone du monde
263
	 * @return array un tableau associatif indexé par les identifiants de zone et contenant les noms de templates
264
	 */
265
    private function renvoyerTousTemplates() {
266
    	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');
267
    }
268
 
269
	/**
270
	 * Charge la liste des inscrits par zone pour un niveau géographique donné
271
	 * @param int $id_annuaire l'identifiant de l'annuaire
272
	 * @param int $niveau le niveau où l'on se situe
273
	 * @return array un tableau associatif indexé par les identifiants de zone et contenant le nombre d'inscrits pour chaque zone
274
	 */
275
    private function chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau) {
276
 
31 aurelien 277
		$nb_inscrits = array();
278
 
44 aurelien 279
		if($niveau == 0) {
280
			// si on est au niveau des continents
281
			$zones_ids = array();
282
			// il faut faire la somme des inscrits par zones géographique
283
			$templates = $this->renvoyerTousTemplates();
284
		} else {
285
			// sinon on appelle la fonction pour la zone demandée
286
			$zones_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$this->nom_fond);
287
		}
288
 
31 aurelien 289
		$annuaire_controleur = new AnnuaireControleur();
290
 
291
		switch ($niveau) {
44 aurelien 292
			// niveau de la carte du monde
31 aurelien 293
    		case 0:
44 aurelien 294
    			// pour chacun des continents, on fait la somme des membres de sa zone
295
    			foreach($templates as $id_continent => $template) {
296
    				$zones_continent_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$template);
297
    				$nb_inscrits[$id_continent] = array_sum($annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_continent_ids));
298
    			}
31 aurelien 299
    		break;
300
 
44 aurelien 301
			// niveau de la carte des pays d'un continent
302
    		case 1:
303
				$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_ids);
31 aurelien 304
    		break;
305
 
44 aurelien 306
			// détail d'un pays
31 aurelien 307
    		case 2 :
308
				$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire);
309
			break;
310
 
44 aurelien 311
			// action par défaut, on renvoie les departements
312
			// TODO: changer ça, ça n'a pas de sens
31 aurelien 313
			default:
44 aurelien 314
				$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire);
315
 
31 aurelien 316
			break;
317
		}
318
 
319
    	return $nb_inscrits;
320
    }
44 aurelien 321
 
322
	/**
323
	 * Récupère les identifiants de zone dans un fichier csv donné
324
	 * @param string $nom_csv chemin vers le fichier csv (sans extension) qui contient les données
325
	 * @return array un tableau contenant les identifiants des zones
326
	 */
327
    private function chargerZonesParCsv($nom_csv) {
328
 
329
		$fichier_csv = $nom_csv.'.csv';
330
		$zones_id = array();
331
 
332
		if (($handle = fopen($fichier_csv, 'r')) !== false) {
333
			$ligne = 0;
334
 
335
			while (($donnees = fgetcsv($handle, 1000, ',')) !== false) {
336
 
337
				if($ligne != 0 && trim($donnees[0]) != '') {
338
					$zones_id[] = "'".$donnees[0]."'";
339
				}
340
				$ligne++;
341
			}
342
			fclose($handle);
343
		}
344
 
345
		return $zones_id;
346
    }
31 aurelien 347
}
348
?>