IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

Template de son choix, controllers, et Zend ?


Sujet :

Zend Framework PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Par défaut Template de son choix, controllers, et Zend ?
    Bonjour,

    Je suis débutant sur Zend et j'ai suivi ce tuto http://zend-framework.developpez.com...g/zf/template/ pour mettre en place un template dans Zend mais j'ai un soucis.
    J'ai la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    - application
         - default
              - controllers
              - views
              - models
         - news
              - controllers
              - views
              - models
         - administration
              - controllers
              - views
              - models
    - library
    - public
    + index.php
    Voici le contenu de mon fichier index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    /**
     * Bootstrap.
     */
     
    set_include_path(
    realpath('library')
    . PATH_SEPARATOR . realpath('application')
    . PATH_SEPARATOR . get_include_path()
    );
     
    // charge le loader général.
    require 'Zend/Loader.php';
     
    date_default_timezone_set('Europe/Paris');
     
    Zend_Loader::loadClass('Fast_Config');
    Fast_Config::load();//ou Fast_Config::load('mon fichier d\'environement'); 
    #Fast_Debug::show('reg',Zend_Registry::getInstance());
     
    Zend_Loader::loadClass('Fast_Controller_Front');
    Fast_Controller_Front::run('application/default/controllers');
    Comment je fais pour indiquer au contrôleur frontal où se trouvent les controleurs d'action ?
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Fast_Controller_Front::run( array(
    	'default'             => 'application/controllers', // controleur par défaut
    	'news'               => 'application/news/controllers', // controleur des news
    	'administration'   => 'application/administration/controllers',  // controleur zone admin
    ));
    mais ça ne marche pas...J'ai un fatal error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)'
    Auriez-vous une piste ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    As-tu créé un indexAction() dans ton controller ? N'oublie pas aussi que tu dois préfixer le nom de ta classe avec le nom du module, sauf dans le module default.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class News_IndexController extends Zend_Controller_Action

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Par défaut
    Oui, j'ai bien le indexAction dans AdministrationController.php situé dans /application/administration/controllers.
    Voici son contenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    Zend_Loader::loadClass("Zend_Controller_Action");
     
    class AdministrationController extends Zend_Controller_Action
    {
     
       public function init()
       {
          parent::init();
          $this->view->module     = $this->_request->getModuleName();
          $this->view->controller = $this->_request->getControllerName();
          $this->view->action     = $this->_request->getActionName();
          $this->view->baseUrl    = $this->_request->getBaseUrl();
       }
     
       public function indexAction()
       {
          $this->view->message = "test de message";
          Fast_Debug::show('Un exemple de debug avec la variable view', $this->view);
       }
     
    }
    Et le message d'erreur lorsque j'essaie d'accéder à http://localhost/intranet/administration/:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (administration)' in /var/Zend/framework/library/Zend/Controller/Dispatcher/Standard.php:249 Stack trace: #0 /var/Zend/framework/library/Zend/Controller/Front.php(914): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 /var/www/htdocs/intranet/library/Fast/Controller/Front.php(81): Zend_Controller_Front->dispatch() #2 /var/www/htdocs/intranet/index.php(39): Fast_Controller_Front::run('application/def...') #3 {main} thrown in /var/Zend/framework/library/Zend/Controller/Dispatcher/Standard.php on line 249
    Pourtant, http://localhost/intranet/ marche parfaitement...
    Help please!

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    Si Administration est un module, la classe à laquelle tu accèdes par http://localhost/intranet/administration/ doit s'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Administration_IndexController extends Zend_Controller_Action
    et contenir la méthode indexAction().
    En effet, dans ton url :
    module = administration,
    controller = index (par défaut)
    action = index (par défaut)

    Pour déclarer les modules dans le bootstrap, voici comment je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->addModuleDirectory('../application');

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Par défaut
    Super, ça marche!
    Merci.

    Mais j'ai un autre problème.
    Lorsque j'utilise le module "administration", je souhaite utiliser la vue qui lui est attachée.
    Voici mon bootstrap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    /**
     * Bootstrap.
     *
     * Point d'entrée unique de l'application, ce script fixe l'environnement
     * de travail par rapport aux fichiers de configuration disponibles et
     * lance un Front Controller qui est le moteur principal de l'application
     * qui tourne sous le design pattern MVC tel qu'implémenté par
     * Zend Framework.
     */
     
    // chemin des librairies
    set_include_path(
    realpath('library')
    . PATH_SEPARATOR . realpath('application')
    . PATH_SEPARATOR . get_include_path()
    );
    // charge le loader général.
    require 'Zend/Loader.php';
     
    /*
    * Par défaut on n'affiche pas les messages d'erreurs, surtout en production,
    * pour ne pas donner des pistes é d'éventuels curieux malfaisants.
    * Par contre les erreurs sont toujours rapportées, méme si elles ne sont pas
    * affichées afin de faciliter la maintenance par lecture des logs.
    * Il est conseillé d'utiliser un fichier de configuration pour fixer le niveau
    * de rapport.
    */
     
    date_default_timezone_set('Europe/Paris');
     
    Zend_Loader::loadClass('Fast_Config');
     
    Fast_Config::load();//ou Fast_Config::load('mon fichier d\'environement');
    #Fast_Debug::show('reg',Zend_Registry::getInstance());
     
    // instancie un front contrôleur amélioré ou standard et lui indique le chemin des contrôleurs d'action
    Zend_Loader::loadClass('Fast_Controller_Front');
    Fast_Controller_Front::run('application/default/controllers');
    La classe "Fast_Controller_Front"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    <?php
    /** Zend_Loader */
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Controller_Front');
     
    /**
     * Contr�leur principal permettant d'invoquer un moteur de template pour les rendus.
     *
     * @author Patrick Dubois
     * @author Jean-Yves Terrien
     *
     * @uses Zend_Controller_Front
     * @package Fast_Controller
     */
    class Fast_Controller_Front extends Zend_Controller_Front
    {
     
       private $_view;
     
       public static function setViewEngine ($name = null) {
          $className = ucfirst($name);
          if (null == $className) {
             $className = 'Zend_View';
             $suffix = 'phtml';
          } else {
     
             if (substr($className, 0, 10) != 'Fast_View_') {
                $className = 'Fast_View_' . $className;
             }
          }
          try {
             Zend_Loader::loadClass($className);
             self::$_instance->_view = new $className();
             self::$_instance->_templateEngine = strtolower($name);
             if (!isset($suffix)) $suffix = self::$_instance->_view->getSuffix();
             self::$_instance->_view->setEncoding(Fast_Registry::getParameters()->get('encoding', 'ISO-8859-1'));
             self::$_instance->_view->setEscape(Fast_Registry::getParameters()->get('escape', 'htmlentities'));
     
             $viewManager = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
             $viewManager->setView(self::$_instance->_view)->setViewSuffix($suffix);
          } catch (Exception $e) {
             Zend_Loader::loadClass('Fast_Exception_View');
             throw new Fast_Exception_View('Invalid View Engine: '. $className);
          }
       }
       /**
         * Convenience feature, calls setControllerDirectory()->setRouter()->dispatch()
         *
         * In PHP 5.1.x, a call to a static method never populates $this -- so run()
         * may actually be called after setting up your front controller.
         *
         * @param string|array $controllerDirectory Path to Zend_Controller_Action
         *   controller classes or array of such paths
         * @return void
         * @throws Zend_Controller_Exception if called from an object instance
         */
       public static function run( $controllerDirectory )
       {
          // choix du moteur de template
          $config = Fast_Registry::getConfiguration();
          $parameters = Fast_Registry::getParameters();
          if ($parameters&&$config) {
             $engine = $parameters->fast->get('templateEngine', null);
             $controller = self::getInstance();	
    		 Fast_Controller_Front::setViewEngine($engine);
    		 $controller->throwExceptions(true);
            $controller->setControllerDirectory( $controllerDirectory);
     
    		// Modifié par mes soins
    		$controller->addModuleDirectory('application');
    		$router = $controller->getRouter();
    		$router->addRoute( 'mod', new Zend_Controller_Router_Route(':module/:controller/:action/*') );
     
             Zend_Loader::loadClass('Zend_Session');
             Zend_Session::start();
     
             $controller->setBaseUrl($config->app->baseUrl);
             $controller->dispatch();
     
          } else {
             Zend_Controller_Front::run('application/controllers');
          }
       }
     
       /**
        *
        * @todo Vérifier pertinence et usage de cette méthode
        *
        * @return Moteur de rendu
        */
       public function getView()
       {
          if (isset(self::$_instance->_view)) {
             return self::$_instance->_view;
          } else {
             return null;
          }
       }
    }
    Et la classe "Fast_View_Ets"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    <?php
     
    Zend_Loader::loadClass('Fast_View');
     
    /**
     *
     * Evaluation des modèles de vue via le moteur de templates Easy Templates System.
     *
     * @author Patrick Dubois
     * @author Jean Yves Terrien
     *
     */
    class Fast_View_Ets extends Fast_View
    {
     
       /* arbre interne des données de la vue. */
       protected $_ets = null;
       /* suffixe des fichers templates */
       protected $_suffix = 'html';
     
       /**
         * Constructeur
         */
       public function __construct()
       {
          parent::__construct();
          $this->_ets = new stdClass();
          #Fastidf_Debug::show('Fastidf_Ets', $this);
          $this->_ets->_mainTemplate = null;
          $this->_ets->_content = null;
          $path = dirname(dirname(dirname(dirname(__FILE__)))) . '/application/default/views/ets/';
          $this->setScriptPath($path);
          $this->_ets->_templatesDir = $path;
       }
     
       /**
          @function getSuffix()
          @return string le suffixe des fichier de templates
       */
       public function getSuffix() {
          return $this->_suffix;   
       }
     
       /**
         * Assign a variable to the view
         *
         * @param string $key The variable name.
         * @param mixed $val The variable value.
         * @return void
         */
       public function __set($key, $val) {
          if ('_' != substr($key, 0, 1)) {
             #Fastidf_Debug::show('__set '. $key, $val);
             $this->_ets->$key = $val;
             return;
          }
          throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this);
       }
     
       /**
         * E_NOTICE for nonexistent values
         *
         * @param  string $key
         * @return null|mixed $key value
         */
       public function __get($key)
       {
          if ($this->__isset($key)) {
             return $this->_ets->$key;
          }  else {
             Zend_Loader::loadClass('Fast_Exception_View');
             throw new Fast_Exception_View('Template\'s key "' . $key . '" does not exist');
          }
     
          return null;
       }
     
       /**
        * @function __isset()
        * is set $key data var
        * @param string $key key name     
        * @return boolean        
        */   
       public function __isset($key)
       {
          return isset($this->_ets->$key);
       }
     
       /**
        * @function __unset()
        * unset $key data var
        * @param string $key key name     
        * @return void        
        */   
       public function __unset($key)
       {
          unset($this->_ets->$key);
       }
     
       /**
        * @function clearVars()
        * unset all data vars
        * @return void        
        */   
       public function clearVars()
       {
          $this->_ets = new stdClass();
       }
     
       /**
       * Assign variables
       *
       */
       public function assign($spec, $value = null) {
          if (!is_array($spec)) {
             $spec = array($spec=>$value);
          }
          foreach ($spec as $key=>$val) {
             if ('_' == substr($key, 0, 1)) {
                throw new Zend_View_Exception('Setting private var is not allowed', $this);
             }
             if ($this->_ets == null) {
                throw new Zend_View_Exception('ETS not defined', $this);
             }
             $this->_ets->$key = $val;
          }
          return;
       }
     
       public function setMainTemplate($tpl)
       {
          $this->_ets->_mainTemplate = $tpl;
       }
     
       public function setScriptPath($path)
       {
          parent::setScriptPath($path);
       }
     
       /**
         * Includes the view script in a scope with only public $this variables.
         *
         * @param string The view script to execute.
         */
       protected function _run()
       {
          // récupère le chemin complet du template demandé
          $name = func_get_arg(0);
          // le template principal est considéré à la racine des templates de l'application (ou du module).
          if (!isset($this->_ets->_mainTemplate))
             $this->setMainTemplate(str_replace(chr(92), '/', dirname(dirname($name)) . '/main.html'));
          // initialiser ets
          require_once("TemplatesEngines/Ets/Ets.php");
          // on indique à l'arbre de données d'Ets quel est le template à inclure
          $this->_ets->_content = str_replace(chr(92), '/', $name);
          $this->_ets->_templatesDir = dirname(dirname($name)) . '/';
          // rendu de la page
          printt($this->_ets, $this->_ets->_mainTemplate);
       }
    }
    Dans cette dernière, on peut voir le chemin de la vue du controller par défaut à charger qui est codé en dur dans le constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $path = dirname(dirname(dirname(dirname(__FILE__)))) . '/application/default/views/ets/';
    Quel que soit le module, cette vue sera toujours chargée.
    Comment charger dans l'ordre :
    1. la vue liée au module, si celle-ci existe ?
    2. la vue par défaut si la vue liée au module n'existe pas ?

    Merci pour vos lumières.

Discussions similaires

  1. Lier le menu Edition à la colonne de son choix
    Par Pascool dans le forum SharePoint
    Réponses: 1
    Dernier message: 22/04/2008, 16h23
  2. Réponses: 8
    Dernier message: 30/10/2007, 10h20
  3. Réponses: 4
    Dernier message: 25/10/2007, 17h18
  4. lister ses fichiers xls dans le repertoire de son choix ?
    Par alucard_xs dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/10/2007, 14h31
  5. Réponses: 10
    Dernier message: 12/08/2006, 23h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo