Subversion Repositories Applications.annuaire

Rev

Rev 56 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * classe Controleur du module Carte.
 *
 * @package     Collection
 * @category    Php5
 * @author      Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author      Aurélien Peronnet <aurelien@tela-botanica.org>
 * @copyright   2010 Tela-Botanica
 * @license     http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
 * @license     http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
 * @version     SVN: $Id$
 */
class CartoControleur extends Controleur {


        // identifiant de la france pour l'accès direct
    private $id_france = 2;

    //+----------------------------------------------------------------------------------------------------------------+
    // Méthodes

    /**
     * Fonction d'affichage par défaut, elle appelle la cartographie
     */
    public function executerActionParDefaut() {
        return $this->cartographier(1);
    }

    /**
     * Cartographier un annuaire.
     * @return string la vue correspondante
     */
    public function cartographier($id_annuaire, $continent= null , $pays = null, $departement = null) {
        // Initialisation de variable
        $donnees = array();

        $niveau = $this->calculerNiveau($continent, $pays);
        $fond = $this->renvoyerTemplatePourNiveau($niveau);

        // Création de la carte
        $options = array(
            'carte_nom' => $fond,
            '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_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);
        // Construction des données nécessaires à la cartographie
        $zones = $cartographie->getCarteZones();
        $this->chargerZonesNbre($id_annuaire, $zones, $continent, $pays, $niveau);
        $this->chargerZonesUrls($id_annuaire, $zones, $continent, $pays, $niveau);
        $cartographie->setCarteZones($zones);

        $cartographie->creerCarte();
        $donnees['map'] = $cartographie->getImageMap();

        $resultat = $this->getVue('cartes/'.$fond, $donnees);
        return $resultat;
    }

    private function chargerZonesNbre($id_annuaire, &$zones, $niveau = 0, $zone_id = 0) {

        $metaModele = $this->getModele('AnnuaireModele');
        $zones_infos = $this->chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau, $zone_id);

        foreach ($zones as $id => &$infos) {

            if (isset($zones_infos[$id])) {

                $nbre = $zones_infos[$id];
                $infos['info_nombre'] = $nbre;
            } else {
                $infos['info_nombre'] = 0;
            }
        }
    }

    private function chargerZonesUrls($id_annuaire, &$zones, $continent = null, $pays = null, $niveau = 0) {

        $url = new URL(Config::get('url_base'));
        $url->setVariableRequete('id_annuaire', $id_annuaire);

        $url->setVariableRequete('m', 'annuaire_recherche_inscrit_carto');
        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 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);

                        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);
        }

        $url->unsetVariablesRequete(array('id_location','m','id_annuaire'));
    }

    private function calculerNiveau($continent, $pays) {

                // le niveau 0 c'est la carte de base
        $niveau = 0;

                // le niveau 1 on consulte un continent en particulier (ex. Amérique du Sud)
                if($continent != null) {
                $niveau++;
        }

                // le niveau 2 c'est un pays en particulier (ce cas là n'arrive que pour la france)
        if($pays != null) {
                $niveau++;
        }

        return $niveau;
    }

    private function renvoyerTemplatePourNiveau($niveau) {
        switch ($niveau) {
                case 0:
                        $fond = 'continents';
                break;

                case 999:
                                $fond = 'pays';
                break;

                case 2 :
                                $fond = 'france';
                        break;

                        default:
                                $fond = 'france';
                        break;
        }

        return $fond;
    }

    private function chargerNombreInscritsParNiveauGeographique($id_annuaire, $niveau, $zone_id) {

                $nb_inscrits = array();

                $annuaire_controleur = new AnnuaireControleur();

                switch ($niveau) {
                case 0:
                        $nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParContinent($id_annuaire, $zone_id);
                break;

                case 999:
                                $nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParPays($id_annuaire, $zone_id);
                break;

                case 2 :
                                $nb_inscrits = $annuaire_controleur->chargerNombreAnnuaireListeInscritsParDepartement($id_annuaire);
                        break;

                        default:
                                $nb_inscrits = array();
                        break;
                }

        return $nb_inscrits;
    }
}
?>