Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

<?php
/**
 * @author Mathias Chouet <mathias@tela-botanica.org>
 * @license     GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @copyright Copyright (c) 2016, Tela Botanica (accueil@tela-botanica.org)
 */
class Savapa extends WidgetCommun {

        const DS = DIRECTORY_SEPARATOR;
        const SERVICE_DEFAUT = 'savapa';
        /** Si spécifié, on ajoute une barre de navigation inter-applications */
        private $bar;
        /** liste des requetes (dans requetes.json) */
        protected $requetes;
        
        /**
         * Méthode appelée par défaut pour charger ce widget.
         */
        public function executer() {
                $retour = null;
                //extract($this->parametres); // aaaargh mon pauvre cœur :'(
                $this->bar = (isset($bar)) ? $bar : false;

                // chargement de la config
                $fichierConfig = dirname(__FILE__) . self::DS . "config.json";
                try {
                        $this->configJson = json_decode(file_get_contents($fichierConfig), true);
                } catch (Exception $ex) {
                        return "Veuillez remplir un fichier [config.json] à la racine du widget";
                }
                //var_dump($this->config);

                // connexion à la base
                // @TODO remplaer par un WS mais le cas ne s'y prête pas
                $dsn = "mysql:dbname=" . $this->configJson['bd']['base']
                        . ";host=" . $this->configJson['bd']['hote']
                        . ";port=" . $this->configJson['bd']['port'];
                $bd = new PDO($dsn, $this->configJson['bd']['utilisateur'], $this->configJson['bd']['mdp']);

                // exécution en file indienne (attention au temps)
                foreach ($this->configJson['requetes'] as &$req) {
                        $this->filtrerRequete($req['sql']); // TRÈS important
                        $r = $bd->query($req['sql']);
                        $donneesBrutes = $r->fetchAll(PDO::FETCH_ASSOC);
                        $labels = array();
                        $donnees = array();
                        foreach($donneesBrutes as $e) {
                                if ($e["periode"] != null) {
                                        $labels[] = $e["periode"];
                                        $donnees[] = $e["nombre"];
                                }
                        }
                        $req['resultat'] = array(
                                'labels' => $labels,
                                'donnees' => $donnees
                        );
                }

                // données
                $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']['requetes'] = $this->configJson['requetes'];
                //$retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] == "prod");

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

        // empêche de tout péter
        protected function filtrerRequete($r) {
                $instructions = array("INSERT", "UPDATE", "DELETE", "TRUNCATE", "DROP", "ADD");
                foreach ($instructions as $i) {
                        if (stripos($r, $i) !== false) {
                                throw new Exception('Les instructions ' . implode(', ', $instructions) . 'sont interdites, galopin !');
                        }
                }
        }
}
?>