Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-08-2009 12:19:43

stefy31
Membre
Lieu: Lyon
Date d'inscription: 20-08-2009
Messages: 14
Site web

[1.9] Aide sur chargement des layouts - Zend Application - Bootstrap

Bonjour,

je suis en train d'essayer de migrer une application développée sous Zend 1.6 vers 1.9 et je découvre petit à petit toutes les nouveautés.
J'ai décidé de mettre à jour le bootstrap, mais ça me semble + compliqué que prévu....

Voici la structure de mon application :

Code:

+ application
        + configs
               + application.ini
        + modules
               + admin
                    + controllers
                    + models
                    + views
                    Bootstrap.php
               + default
                    + controllers
                    + models
                    + views
                    Bootstrap.php
        Bootstrap.php
+ library
+public
        index.php

Mon fichier appication.ini

Code:

[production]
phpSettings.display_startup_errors                 = 0
phpSettings.display_errors                         = 0
phpsettings.date.timezone                         = "Europe/Paris"
includePaths.library                             = APPLICATION_PATH "/../library"
bootstrap.path                                 = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class                                 = "Bootstrap"

resources.frontController.moduleDirectory                 = APPLICATION_PATH "/modules"
resources.frontController.env                    = APPLICATION_ENVIRONMENT

resources.modules[]                                 = 

resources.frontController.controllerDirectory.default         = APPLICATION_PATH "/modules/default/controllers"
resources.frontController.controllerDirectory.admin         = APPLICATION_PATH "/modules/admin/controllers"

autoloaderNamespaces[]                             = "Ekiwi_"

resources.layout.layoutPath     =    APPLICATION_PATH "/modules/default/views/layouts"
resources.layout.layout        =    main
admin.resources.layout.layoutPath    =    APPLICATION_PATH "/modules/admin/views/layouts"
admin.resources.layout.layout        =    layout

[testing : production]
phpSettings.display_startup_errors                 = 1
phpSettings.display_errors                         = 1

[development : production]
phpSettings.display_startup_errors                 = 1
phpSettings.display_errors                         = 1
phpSettings.error_reporting                     = 8191

resources.db.adapter                            =    "pdo_mysql"
resources.db.params.host                        =    localhost
resources.db.params.username                    =    root
resources.db.params.password                    =    root
resources.db.params.dbname                        =    zfimmo
resources.db.params.dbprefix                    =    ekw_
resources.db.params.port                        =    8889
resources.db.isDefaultTableAdpater                =    true

Voici mon Boostrap.php général (celui à la racine de application):

Code:

<?php 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAppAutoLoad()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace'    =>    'Ekiwi',
            'basePath'    =>    dirname(__FILE__),
        ));
        return $autoloader;
    }
    
    protected function _initLayoutHelper()
    {
        $this->bootstrap('frontController');
        $layout = Zend_Controller_Action_HelperBroker::addHelper(
            new Ekiwi_Controller_Action_Helper_LayoutLoader());
    }    
}

Et voici mon action helper pour le chargement du layout :
EKiwi/Controller/Action/Helper/LayoutLoader

Code:

<?php 

class Ekiwi_Controller_Action_Helper_LayoutLoader
    extends Zend_Controller_Action_Helper_Abstract
{

    public function preDispatch()
    {
        $bootstrap = $this->getActionController()
                         ->getInvokeArg('bootstrap');
        $config = $bootstrap->getOptions();
        $module = $this->getRequest()->getModuleName();
        
        echo "<br>module = $module";
        
        if (isset($config[$module]['resources']['layout']['layout'])) {
            
            
            $layoutScript =
                 $config[$module]['resources']['layout']['layout'];
            $this->getActionController()
                 ->getHelper('layout')
                 ->setLayout($layoutScript);
        }
    }

}

Mon problème est le suivant:
mon application ne détecte pas le module.
Elle croit toujours qu'elle est dans le module default, et je charge donc toujours le même layout.
Il y a visiblement quelque chose que je n'ai pas compris.

Les deux adresses suivantes :
http://localhost:8888/BOOTSTRAP_TEST/public/admin
http://localhost:8888/BOOTSTRAP_TEST/public/

m'affichent toujours "module=default"

Auriez-vous une idée?

Merci pour votre aide smile

Hors ligne

 

#2 20-08-2009 13:44:20

stefy31
Membre
Lieu: Lyon
Date d'inscription: 20-08-2009
Messages: 14
Site web

Re: [1.9] Aide sur chargement des layouts - Zend Application - Bootstrap

Bon, j'avance doucement et laborieusement, mais j'avance...
j'arrive maintenant à charger le bon layout, merci google.

voici les modifications que j'ai apportées :

Code:

<?php 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAppAutoLoad()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace'    =>    'Ekiwi',
            'basePath'    =>    dirname(__FILE__),
        ));
        return $autoloader;
    }
    
    /** 
     * Chargement des routes
     */
    protected function _initRequest()
    {
        $this->bootstrap('frontController');
        $frontController = $this->getResource('frontController');
        $router = $frontController->getRouter();
        $router->addConfig(new Zend_Config_Ini(APPLICATION_PATH . '/configs/routes.ini'), 'routes');
        $request = new Zend_Controller_Request_Http();
        
        $router->route($request);
        return $request;
    }
    
    /**
     * Chargement du layout approprié
     * @return unknown_type
     */
    protected function _initLayoutHelper()
    {
        $layout = Zend_Controller_Action_HelperBroker::addHelper(
            new Ekiwi_Controller_Action_Helper_LayoutLoader());
    }        
}

J'ai ajouté une fonction _initRequest qui initialise l'objet requête à partir d'un fichier "routes.ini", puis je retourne a requête afin de pouvoir l'utiliser ailleurs.

Puis mon action_helper ressemble désormais à ça :

Code:

<?php 

class Ekiwi_Controller_Action_Helper_LayoutLoader
    extends Zend_Controller_Action_Helper_Abstract
{

    public function preDispatch()
    {
        $bootstrap = $this->getActionController()
                         ->getInvokeArg('bootstrap');
        $config = $bootstrap->getOptions();
        
        $request = $bootstrap->getResource('request');
        $module = $request->getModuleName();

        if (isset($config[$module]['resources']['layout']['layout']) && isset($config[$module]['resources']['layout']['layoutPath'])) {
            $layoutScript = $config[$module]['resources']['layout']['layout'];
            $layoutPath = $config[$module]['resources']['layout']['layoutPath'];
            $this->getActionController()
                 ->getHelper('layout')
                 ->setLayoutPath($layoutPath)
                 ->setLayout($layoutScript);
        }
    }

Où je récupère l'objet requête initialisé et non plus en faisant  "$this->getRequest()".


Désormais je charge le bon layout!

mais je charge toujours le script de vue de mon module par défaut.....
il y a encore du travail.

toutefois je ne suis pas très convaincue de cette façon de faire...
Je me suis inspirée d'un bout de code trouvé sur un autre forum, vous en pensez quoi ?

Hors ligne

 

#3 20-08-2009 17:20:10

stefy31
Membre
Lieu: Lyon
Date d'inscription: 20-08-2009
Messages: 14
Site web

Re: [1.9] Aide sur chargement des layouts - Zend Application - Bootstrap

j'ai trouvé quelque chose qui me permet (enfin) d'arriver à appeler le controller et l'action que je veux, et de customiser mes layouts...
je reste persuadée qu'il y a plus simple et que je suis passée à côté de quelque chose d'évident, donc n'hésitez pas....

mon boostrap principal exécute une _initRequest() qui me permet d'initialiser mon objet requête en lui passant mes paramètres de route.
le problème était que le trio de données 'module / controller / action ' n'était pas passé au frontController lors du dispatch, donc ça ne servait pas à grand chose. Mon application continuait obstinément à appeler le controller et l'action du module par défaut.
en épluchant le code zend, je me suis apercue que le dispatch() exécuté lors du run() du bootstrap ne passe aucun objet requête en paramètre. ce qui ne me choque pas en soi, mais du coup, mon objet requête personnalisé était perdu.

j'ai donc réimplémenté la fonction run() de mon dispatch() comme suit :

Code:

public function run()
    {
        $front   = $this->getResource('FrontController');
        $default = $front->getDefaultModule();
        if (null === $front->getControllerDirectory($default)) {
            throw new Zend_Application_Bootstrap_Exception(
                'No default controller directory registered with front controller'
            );
        }

        $front->setParam('bootstrap', $this);
        $front->dispatch($this->getResource('request'));
    }

ou la seule différence avec la fonction run() parente est la ligne :
$front->dispatch($this->getResource('request'));

et là, enfin, ça fonctionne.

J'espère comprendre un peu mieux tout ça bientôt et partir sur quelque chose de plus net, car je suis sûre d'être passée à côté de quelque chose, mais en attendant, ça me permet d'aller plus loin que le seul dispatch....

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages