Subversion Repositories Applications.referentiel

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Classe Controleur générale partagée par les différents modules de l'application.
 *
 * @package             Referentiel
 * @category    Php5.2
 * @author              Jean-Pascal MILCENT <jpm@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$
 */
abstract class AppliControleur extends Controleur {
        
        const RENDU_TETE = 'tete';
        const RENDU_CORPS = 'corps';
        const RENDU_PIED = 'pied';
        
        // FIXME : voir s'il est plus intéressant d'utiliser une méthode dans les classes filles
        protected $url = null;
        private $parametres = array();
        private $sortie = array();
        private $messages = null;
        
        //+----------------------------------------------------------------------------------------------------------------+
        // Constructeur
        
        public function __construct()  {
                $registre = Registre::getInstance();
                $this->parametres = $registre->get('parametres');
                $this->url = $this->parametres['url'];
                parent::__construct();
        }
        
        //+----------------------------------------------------------------------------------------------------------------+
        // Accesseurs

        /**
         * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application.
         */
        public function getSortie() {
                return $this->sortie;
        }

        /**
         * Attribue à la bonne position de sortie un contenu.
         */
        protected function setSortie($position, $contenu, $fusionner = false) {
                if ($this->verifierExistencePosition($position)) {
                        if ($fusionner) {
                                $this->sortie[$position] .= $contenu;
                        } else {
                                $this->sortie[$position] = $contenu;
                        }
                }
        }
        
        /**
         * Retourne le tableau des messages
         */
        protected function getMessages() {
                return $this->messages;
        }
        /**
         * Ajoute un message
         */
        protected function addMessage($message) {
                if ('' != $message) {
                        $this->messages[] = $message;
                }
        }
        
        
        //+----------------------------------------------------------------------------------------------------------------+
        // Méthodes
        
        /**
         * Vérifie l'existence de la position indiquée pour son utilisation dans le tableau de sortie.
         * @param string la position à tester.
         * @return bool true si la position est valide, sinon false.
         */
        private function verifierExistencePosition($position) {
                $existe = true;
                if ($position != self::RENDU_TETE &&
                        $position != self::RENDU_CORPS &&
                        $position != self::RENDU_PIED) {
                        trigger_error("La position '$position' n'est pas une valeur prédéfinie.", E_USER_WARNING);
                        $existe = false;
                }
                return $existe;
        }
        
        /**
         * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie.
         */
        protected function executerAction($ClasseModule, $action) {
                $module = new $ClasseModule();
                $module->$action();
                $this->fusionnerSortie($module->getSortie());
                
        }
        
        /**
         * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre.
         * @param array le tableau à fusionner
         */
        private function fusionnerSortie($sortie) {
                $this->sortie = array_merge($this->sortie, $sortie);
        }
        
        protected function postraiterDonnees(&$tableau) {
                if (count($tableau) > 0) {
                        foreach ($tableau as $cle => &$valeur) {
                                if ($valeur == '') {
                                        $valeur = '&nbsp;';
                                } else if (is_string($valeur)) {
                                        $valeur = $this->remplacerEsperluette($valeur);
                                } else if (is_array($valeur)) {
                                        $this->postraiterDonnees($valeur);
                                }
                        }
                }
        }
        
        protected function traiterEsperluette(&$tableau) {
                if (count($tableau) > 0) {
                        foreach ($tableau as $cle => &$valeur) {
                                if (is_string($valeur)) {
                                        $valeur = $this->remplacerEsperluette($valeur);
                                } else if (is_array($valeur)) {
                                        $this->traiterEsperluette($valeur);
                                }
                        }
                }
        }
        
        private function remplacerEsperluette($txt) {
                $txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9a-f]+);)/i', '&amp;', $txt, -1);
                return $txt;
        }
        
}