Subversion Repositories eFlore/Applications.cel

Rev

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

<?php
/**
* PHP Version 5
*
* @category  PHP
* @package   jrest
* @author       aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version   $$id$$
* @link   /doc/jrest/
*/

class JrestService {

        protected $config;
        protected $script_time;
        protected $max_exec_time;

        public function JrestService($config) {
                $this->config = config;
                $this->script_time = microtime(true);
                $this->max_exec_time = ini_get('max_execution_time');
        }

        public function isAdmin($id) {
                $admins = $this->config['jrest_admin']['admin'];
                $admin_tab = explode(',',$admins);

                if (in_array($id,$admin_tab)) {
                        return true;
                } else {
                        return false;
                }
        }

        public function controleUtilisateur($id) {
                if ($_SESSION['user']['name'] == '') {
                        //cas de la session temporaire, on ne fait rien de particulier
                } else {
                        if (!$this->isAdmin($_SESSION['user']['name']) && $_SESSION['user']['name'] != $id) {
                                // cas d'usurpation d'identité
                                print 'Accès interdit';
                                exit();
                        }
                }
        }

        public function logger($index,$chaine) {
                if(!class_exists('Log')) {
                        include_once('Log.php');
                        Log::getInstance();
                }

                Log::setCheminLog($this->config['log']['cheminlog']);
                Log::setTimeZone($this->config['log']['timezone']);
                Log::setTailleMax($this->config['log']['taillemax']);

                Log::ajouterEntree($index,$chaine);
        }

        public function verifierOuRelancerExecution() {

                if((microtime(true) - $this->script_time) > ($this->max_exec_time - 5)*100) {
                        set_time_limit(2);
                        $this->logger('JRestService','Durée du script augmentée :'.microtime(true).' - '.$this->script_time.'.) > ('.$this->max_exec_time.' - 5)*1000000');
                        return true;
                }
                return false;
        }
        
        /**
     * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
     * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
     *
     * @param String $fichier   le chemin du fichier du squelette
     * @param Array  $donnees   un tableau associatif contenant les variables a injecter dans le squelette.
     *
     * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
     */
    public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
        $sortie = false;
        if (file_exists($fichier)) {
            // Extraction des variables du tableau de données
            extract($donnees);
            // Démarage de la bufferisation de sortie
            ob_start();
            // Si les tags courts sont activés
            if ((bool) @ini_get('short_open_tag') === true) {
                // Simple inclusion du squelette
                include $fichier;
            } else {
                // Sinon, remplacement des tags courts par la syntaxe classique avec echo
                $html_et_code_php = self::traiterTagsCourts($fichier);
                // Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
                $html_et_code_php = '?>'.$html_et_code_php;
                // Interprétation du html et du php dans le buffer
                echo eval($html_et_code_php);
            }
            // Récupèration du contenu du buffer
            $sortie = ob_get_contents();
            // Suppression du buffer
            @ob_end_clean();
        } else {
            $msg = "Le fichier du squelette '$fichier' n'existe pas.";
            trigger_error($msg, E_USER_WARNING);
        }
        // Retourne le contenu
        return $sortie;
    }
   
    /**
     * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
     *
     * @param String $chemin_squelette le chemin du fichier du squelette
     *
     * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
     */
    private static function traiterTagsCourts($chemin_squelette) {
        $contenu = file_get_contents($chemin_squelette);
        // Remplacement de tags courts par un tag long avec echo
        $contenu = str_replace('<?=', '<?php echo ',  $contenu);
        // Ajout systématique d'un point virgule avant la fermeture php
        $contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
        return $contenu;
    }
}
?>