Subversion Repositories eFlore/Applications.cel

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Service exportant les dernières observations publiques du CEL.
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 *
 * Cas d'utilisation et documentation :
 * @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidget
 *
 * Paramètres :
 * //TODO: décider des paramètres
 *
 * @author Aurélien Peronnet <aurelien@tela-botanica.org>
 * @license     GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license     CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @version     $Id$
 * @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
 */
class Export extends WidgetCommun {
        
        const DS = DIRECTORY_SEPARATOR;
        const SERVICE_DEFAUT = 'export';
        private $export_url = null;
        private $eflore_url_tpl = null;
        /** Si spécifié, on ajoute une barre de navigation inter-applications */
        private $bar;
        /** pré-chargement du champ "projet" (pour les fainéants) - @TODO étendre à tous les champs ? */
        protected $projet;
        
        /**
         * Méthode appelée par défaut pour charger ce widget.
         */
        public function executer() {
                $retour = null;
                extract($this->parametres); // aaaargh mon pauvre cœur :'(

                if (!isset($mode)) {
                        $mode = self::SERVICE_DEFAUT;
                }
                $this->bar = (isset($bar)) ? $bar : false;
                $this->projet = (isset($projet)) ? $projet : '';

                $methode = $this->traiterNomMethodeExecuter($mode);
                if (method_exists($this, $methode)) {
                        $retour = $this->$methode();
                } else {
                        $this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
                }

                if (is_null($retour)) {
                        $contenu = 'Un problème est survenu : '.print_r($this->messages, true);
                } else {
                        $urlWsCommune = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'LocationSearch');
                        $retour['donnees']['url_ws_autocompletion_commune'] = $urlWsCommune;

                        $urlWsNomSci = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'NameSearch');
                        $retour['donnees']['url_ws_autocompletion_nom_sci'] = $urlWsNomSci;

                        $retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], '');
                        $retour['donnees']['url_export'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelWidgetExport');
                        $retour['donnees']['url_script_navigation'] = sprintf($this->config['chemins']['baseURLRessources'], 'tb/reseau/navigation.js');

                        $retour['donnees']['bar'] = $this->bar;
                        $retour['donnees']['projet'] = $this->projet;
                        
                        $retour['donnees']['liste_pays'] = $this->obtenirListePays();

                        $retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] == "prod");

                        $squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
                        $contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
                }

                $this->envoyer($contenu);
        }
        
        private function executerAjax() {
                $widget = $this->executerObservation();
                $widget['squelette'] = 'export_ajax';
                return $widget;
        }
        
        private function executerExport() {
                $widget = array('squelette' => 'export', 'donnees' => array());
                extract($this->parametres);
                $max_obs = (isset($max_obs) && preg_match('/^[0-9]+,[0-9]+$/', $max_obs)) ? $max_obs : '10';
                return $widget;
        }
        
        private function traiterParametres() {
                $parametres_export = '?';
                $criteres = array('utilisateur', 'commune', 'dept', 'taxon', 'commentaire', 'date', 'projet', 'programme', 'identiplante');
                foreach($this->parametres as $nom_critere => $valeur_critere) {
                        if (in_array($nom_critere, $criteres)) {
                                $valeur_critere = str_replace(' ', '%20', $valeur_critere);
                                $parametres_export .= $nom_critere.'='.$valeur_critere.'&';
                        }
                }
                
                if ($parametres_export == '?') {
                        $parametres_export = '';
                } else {
                        $parametres_export = rtrim($parametres_export, '&');
                }
                return $parametres_export;
        }
        
        protected function obtenirListePays() {
                $url = $this->config['chemins']['infosPaysUrl'];
                $liste_pays = json_decode(file_get_contents($url), true);
                
                $pays_fmt = array();
                foreach($liste_pays['resultat'] as $pays) {
                        // Les pays renvoyé par le web service sont tous en majuscule
                        $nom = mb_convert_case($pays['nom'], MB_CASE_TITLE, 'UTF-8');
                        
                        // Cas spécial de la france qui différencie france métropolitaine et "DOM TOM"
                        if($pays['code'] == "FR") {                             
                                $pays_fmt[] = array('code_iso_3166_1' => 'FR,FX,GF,PF,TF', 'nom' => 'France (tout)');
                                $pays_fmt[] = array('code_iso_3166_1' => 'FR,FX', 'nom' => 'France métropolitaine');
                        } else {
                                $pays_fmt[] = array('code_iso_3166_1' => $pays['code'], 'nom' => $nom);
                        }               
                }
                
                // Tri par nom plutot que par code
                usort($pays_fmt, array($this, "trierPays"));
                return $pays_fmt;
        }
        
        protected function trierPays($a, $b) {
                return strcmp($a['nom'], $b['nom']);
        }

}
?>