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