16,8 → 16,11 |
|
|
// identifiant de la france pour l'accès direct |
private $id_france = 2; |
private $id_france = 'fr'; |
|
// nom du fond de carte en cours |
private $nom_fond = ''; |
|
//+----------------------------------------------------------------------------------------------------------------+ |
// Méthodes |
|
30,30 → 33,46 |
|
/** |
* Cartographier un annuaire. |
* @param int $id_annuaire l'identitifiant de l'annuaire à cartographier |
* @param int $continent l'identitifiant du continent sur lequel on se trouve |
* @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent) |
* @return string la vue correspondante |
*/ |
public function cartographier($id_annuaire, $continent= null , $pays = null, $departement = null) { |
public function cartographier($id_annuaire, $continent= null , $pays = null) { |
// Initialisation de variable |
$donnees = array(); |
|
// la présence d'un pays (non) et d'un continent (ou non) détermine le niveau de carte à afficher |
$niveau = $this->calculerNiveau($continent, $pays); |
$fond = $this->renvoyerTemplatePourNiveau($niveau); |
|
// suivant le niveau, continent et pays, on renvoie un template html différent |
$fond = $this->renvoyerPrefixePourNiveau($niveau, $continent, $pays); |
|
$carte = ''; |
|
// chaque continent possède un fond de carte différent |
if($niveau == 1) { |
$carte = $this->renvoyerSuffixePourContinent($niveau, $continent, $pays); |
} |
|
// Création de la carte |
$options = array( |
'carte_nom' => $fond, |
'carte_nom' => $fond.$carte, |
'formule' => Cartographie::FORMULE_PROPORTIONNEL, |
'couleur_claire' => Config::get('carte_couleur_claire'), |
'couleur_foncee' => Config::get('carte_couleur_foncee'), |
'fond_fichier' => Config::get('carte_base_nom_'.$fond), |
'fond_fichier' => Config::get('carte_base_nom_'.$fond).$carte, |
'fond_dossier' => Application::getChemin().Config::get('carte_fonds_chemin'), |
'stock_dossier' => Config::get('carte_stockage_chemin'), |
'stock_url' => Config::get('carte_stockage_url'), |
'debug' => Config::get('carte_mode_debug')); |
$cartographie = Composant::fabrique('cartographie', $options); |
|
$this->nom_fond = Config::get('carte_base_nom_'.$fond).$carte; |
|
// Construction des données nécessaires à la cartographie |
$zones = $cartographie->getCarteZones(); |
$this->chargerZonesNbre($id_annuaire, $zones, $continent, $pays, $niveau); |
$this->chargerZonesNbre($id_annuaire,$zones, $niveau); |
$this->chargerZonesUrls($id_annuaire, $zones, $continent, $pays, $niveau); |
$cartographie->setCarteZones($zones); |
|
64,23 → 83,40 |
return $resultat; |
} |
|
private function chargerZonesNbre($id_annuaire, &$zones, $niveau = 0, $zone_id = 0) { |
/** |
* Charge le nombre d'inscrit par zone pour un annuaire donné |
* @param int $id_annuaire l'identifiant de l'annuaire |
* @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées) |
* @param int $niveau le niveau de la carto (monde, continent, ou pays) |
*/ |
private function chargerZonesNbre($id_annuaire, &$zones, $niveau = 0) { |
|
$metaModele = $this->getModele('AnnuaireModele'); |
$zones_infos = $this->chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau, $zone_id); |
// on charge les inscrits pour le niveau donné |
$zones_infos = $this->chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau); |
|
foreach ($zones as $id => &$infos) { |
|
// si l'on a des données pour la zone, on renseigne le nombre d'inscrits |
if (isset($zones_infos[$id])) { |
|
$nbre = $zones_infos[$id]; |
$infos['info_nombre'] = $nbre; |
} else { |
// sinon on le met à 0 |
$infos['info_nombre'] = 0; |
} |
} |
} |
|
/** |
* Charge les des zones pour un annuaire donné |
* @param int $id_annuaire l'identifiant de l'annuaire |
* @param array $zones les zones à cartographier (attention, passage par référence, donc les zones sont modifiées) |
* @param int $continent l'identitifiant du continent sur lequel on se trouve |
* @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent) |
* @param int $niveau le niveau de la carto (monde, continent, ou pays) |
*/ |
private function chargerZonesUrls($id_annuaire, &$zones, $continent = null, $pays = null, $niveau = 0) { |
|
$url = new URL(Config::get('url_base')); |
90,37 → 126,37 |
foreach ($zones as $id => &$infos) { |
|
switch ($niveau) { |
// niveau 0 de la carte : on affiche tous les continents |
// l'url va pointer un continent en particulier |
case 0: |
$url->setVariableRequete('m', 'annuaire_afficher_carte'); |
$url->setVariableRequete('continent', $id); |
break; |
// niveau 0 de la carte : on affiche tous les continents |
// l'url va pointer vers un continent en particulier |
case 0: |
$url->setVariableRequete('m', 'annuaire_afficher_carte'); |
$url->setVariableRequete('continent', $id); |
break; |
|
// niveau 1, on est sur un continent en particulier : on affiche le détail du continent demandé |
// l'url pointe sur des pays |
case 1: |
$url->setVariableRequete('continent', $continent); |
// niveau 1, on est sur un continent en particulier : on affiche le détail du continent demandé |
// l'url pointe sur des pays |
case 1: |
$url->setVariableRequete('continent', $continent); |
|
// si le pays c'est la france alors l'url pointera vers la carte des départements |
if($id == $this->id_france) { |
$url->setVariableRequete('m', 'annuaire_afficher_carte'); |
} else { |
// sinon l'url pointe vers la liste des inscrits de ce pays |
$url->setVariableRequete('m', 'annuaire_inscrits_carto'); |
} |
$url->setVariableRequete('pays', $id); |
// si le pays c'est la france alors l'url pointera vers la carte des départements |
if($id == $this->id_france) { |
$url->setVariableRequete('m', 'annuaire_afficher_carte'); |
} else { |
// sinon l'url pointe vers la liste des inscrits de ce pays |
$url->setVariableRequete('m', 'annuaire_inscrits_carto'); |
} |
$url->setVariableRequete('pays', $id); |
|
break; |
break; |
|
// niveau 2, si on a cliqué sur la france pour afficher les départements : |
case 1: |
$methode = 'annuaire_afficher_carte'; |
$url->setVariableRequete('continent', $continent); |
$url->setVariableRequete('pays', $pays); |
$url->setVariableRequete('departement', $id); |
break; |
} |
// niveau 2, si on a cliqué sur la france pour afficher les départements : |
case 1: |
$methode = 'annuaire_afficher_carte'; |
$url->setVariableRequete('continent', $continent); |
$url->setVariableRequete('pays', $pays); |
$url->setVariableRequete('departement', $id); |
break; |
} |
$infos['url'] = sprintf($url, $id); |
} |
|
127,6 → 163,11 |
$url->unsetVariablesRequete(array('id_location','m','id_annuaire')); |
} |
|
/** |
* Renvoie le niveau auquel on se trouve suivant la présence ou non de certains paramètres |
* @param int $continent l'identitifiant du continent sur lequel on se trouve |
* @param string $pays l'identitifiant du pays sur lequel on se trouve (normalement seulement la france si présent) |
*/ |
private function calculerNiveau($continent, $pays) { |
|
// le niveau 0 c'est la carte de base |
134,24 → 175,29 |
|
// le niveau 1 on consulte un continent en particulier (ex. Amérique du Sud) |
if($continent != null) { |
$niveau++; |
$niveau = 1; |
} |
|
// le niveau 2 c'est un pays en particulier (ce cas là n'arrive que pour la france) |
if($pays != null) { |
$niveau++; |
$niveau = 2; |
} |
|
return $niveau; |
} |
|
private function renvoyerTemplatePourNiveau($niveau) { |
/** |
* Renvoie le type de template à utiliser suivant le niveau de certains paramètres |
* @param int $niveau le niveau de la carto |
* @return string le type de template |
*/ |
private function renvoyerPrefixePourNiveau($niveau) { |
switch ($niveau) { |
case 0: |
$fond = 'continents'; |
break; |
|
case 999: |
case 1: |
$fond = 'pays'; |
break; |
|
160,7 → 206,7 |
break; |
|
default: |
$fond = 'france'; |
$fond = ''; |
break; |
} |
|
167,31 → 213,136 |
return $fond; |
} |
|
private function chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau, $zone_id) { |
/** |
* Renvoie le suffixe de fond de carte à utiliser pour un continent donné |
* @param int $niveau le niveau de la carto |
* @param int $niveau l'identifiant de continent |
* @return string le suffixe |
*/ |
private function renvoyerSuffixePourContinent($niveau, $continent) { |
|
switch ($continent) { |
case 1: |
$carte = '_afrique'; |
break; |
|
case 2: |
$carte = '_nord_amerique'; |
break; |
|
case 3: |
$carte = '_asie'; |
break; |
|
case 4: |
$carte = '_europe'; |
break; |
|
case 5: |
$carte = '_oceanie'; |
break; |
|
case 6: |
$carte = '_sud_amerique'; |
break; |
|
case 7: |
$carte = '_moyen_orient'; |
break; |
|
default: |
$carte = ''; |
break; |
} |
|
return $carte; |
} |
|
/** |
* renvoie tous les noms templates pour chaque zone du monde |
* @return array un tableau associatif indexé par les identifiants de zone et contenant les noms de templates |
*/ |
private function renvoyerTousTemplates() { |
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'); |
} |
|
/** |
* Charge la liste des inscrits par zone pour un niveau géographique donné |
* @param int $id_annuaire l'identifiant de l'annuaire |
* @param int $niveau le niveau où l'on se situe |
* @return array un tableau associatif indexé par les identifiants de zone et contenant le nombre d'inscrits pour chaque zone |
*/ |
private function chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau) { |
|
$nb_inscrits = array(); |
|
if($niveau == 0) { |
// si on est au niveau des continents |
$zones_ids = array(); |
// il faut faire la somme des inscrits par zones géographique |
$templates = $this->renvoyerTousTemplates(); |
} else { |
// sinon on appelle la fonction pour la zone demandée |
$zones_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$this->nom_fond); |
} |
|
$annuaire_controleur = new AnnuaireControleur(); |
|
switch ($niveau) { |
// niveau de la carte du monde |
case 0: |
$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParContinent($id_annuaire, $zone_id); |
// pour chacun des continents, on fait la somme des membres de sa zone |
foreach($templates as $id_continent => $template) { |
$zones_continent_ids = $this->chargerZonesParCsv(Application::getChemin().Config::get('carte_fonds_chemin').$template); |
$nb_inscrits[$id_continent] = array_sum($annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_continent_ids)); |
} |
break; |
|
case 999: |
$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zone_id); |
// niveau de la carte des pays d'un continent |
case 1: |
$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zones_ids); |
break; |
|
// détail d'un pays |
case 2 : |
$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire); |
break; |
|
// action par défaut, on renvoie les departements |
// TODO: changer ça, ça n'a pas de sens |
default: |
$nb_inscrits = array(); |
$nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire); |
|
break; |
} |
|
return $nb_inscrits; |
} |
|
/** |
* Récupère les identifiants de zone dans un fichier csv donné |
* @param string $nom_csv chemin vers le fichier csv (sans extension) qui contient les données |
* @return array un tableau contenant les identifiants des zones |
*/ |
private function chargerZonesParCsv($nom_csv) { |
|
$fichier_csv = $nom_csv.'.csv'; |
$zones_id = array(); |
|
if (($handle = fopen($fichier_csv, 'r')) !== false) { |
$ligne = 0; |
|
while (($donnees = fgetcsv($handle, 1000, ',')) !== false) { |
|
if($ligne != 0 && trim($donnees[0]) != '') { |
$zones_id[] = "'".$donnees[0]."'"; |
} |
$ligne++; |
} |
fclose($handle); |
} |
|
return $zones_id; |
} |
} |
?> |