Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 14-10-2008 03:40:19

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

[Zend_Layout][ZF1.6.1]Ilne me prend pas le bon fichier de layout

Je démarre un nouveau projet, et pour la première fois avec ZF1.6.1.

Mon problème est que quand je suis dans default::IndexController::indexAction il me prend bien la bonne view mais pour le rendu final il utilise le layout qui est dans administration !

Est-ce possible d'avoir des layouts dans une sous arborescence des models ?
Et si oui comment obliger IndexController::indexAction  du module default à prendre le layout qui est dans son arborescence ?
Ceci dit j'ai un doute sur ma déclaration des layouts dans initView du fichier initializer.php, je suis un peu largué là, merci de me mettre sur la voie.


Voila l'arborescence du projet :

Code:

+---application
¦   ¦   bootstrap.php
¦   ¦   Initializer.php
¦   ¦   
¦   +---administration
¦   ¦   +---controllers
¦   ¦   ¦       IndexController.php
¦   ¦   ¦       
¦   ¦   +---layouts
¦   ¦   ¦       main.phtml
¦   ¦   ¦       
¦   ¦   +---models
¦   ¦   +---views
¦   ¦       +---filters
¦   ¦       +---helpers
¦   ¦       +---scripts
¦   ¦           +---index
¦   ¦                   index.phtml
¦   ¦                   
¦   +---default
¦       ¦   user.ini
¦       ¦   
¦       +---controllers
¦       ¦       ErrorController.php
¦       ¦       IndexController.php
¦       ¦       
¦       +---helpers
¦       +---layouts
¦       ¦       main.phtml
¦       ¦       
¦       +---models
¦       +---views
¦           +---filters
¦           +---helpers
¦           +---scripts
¦               +---error
¦               ¦       error.phtml
¦               ¦       
¦               +---index
¦                       index.phtml
¦                       
+---bin
+---library
¦       translate.tmx
¦       
+---public
¦   ¦   .htaccess
¦   ¦   index.php
¦   ¦   
¦   +---images
¦   +---scripts
¦   +---styles

Mon fichier initializer.php :

Code:

<?php
/**
 * My new Zend Framework project
 * 
 * @author  
 * @version 
 */

require_once 'Zend/Controller/Plugin/Abstract.php';
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Request/Abstract.php';
require_once 'Zend/Controller/Action/HelperBroker.php';

/**
 * 
 * Initializes configuration depndeing on the type of environment 
 * (test, development, production, etc.)
 *  
 * This can be used to configure environment variables, databases, 
 * layouts, routers, helpers and more
 *   
 */
class Initializer extends Zend_Controller_Plugin_Abstract
{
    /**
     * @var Zend_Config
     */
    protected static $_config;

    /**
     * @var string Current environment
     */
    protected $_env;

    /**
     * @var Zend_Controller_Front
     */
    protected $_front;

    /**
     * @var string Path to application root
     */
    protected $_root;

    /**
     * Constructor
     *
     * Initialize environment, root path, and configuration.
     * 
     * @param  string $env 
     * @param  string|null $root 
     * @return void
     */
    public function __construct($env, $root = null)
    {
        $this->_setEnv($env);
        if (null === $root) {
            $root = realpath(dirname(__FILE__) . '/../');
        }
        $this->_root = $root;

        $this->initPhpConfig();
        
        $this->_front = Zend_Controller_Front::getInstance();
        
        // set the test environment parameters
        if ($env == 'test') {
            // Enable all errors so we'll know when something goes wrong. 
            error_reporting(E_ALL | E_STRICT);  
            ini_set('display_startup_errors', 1);  
            ini_set('display_errors', 1); 

            $this->_front->throwExceptions(true);  
        }
    }

    /**
     * Initialize environment
     * 
     * @param  string $env 
     * @return void
     */
    protected function _setEnv($env) 
    {
        $this->_env = $env;   
        $registry = Zend_Registry::getInstance();
        $niveau = 8;
        $logplace = 'f:/log';
        $redacteur = new Zend_Log_Writer_Stream($logplace.'/reservations.txt');
        $formater = new Zend_Log_Formatter_Simple('*%idsession%* %timestamp% %priorityName% (%priority%): %message% - %uri%'.PHP_EOL);
        $redacteur->setFormatter($formater);
        $logger = new Zend_Log($redacteur);
        $logger->setEventItem('uri', $_SERVER['REQUEST_URI']);
        $logger->setEventItem('idsession', Zend_Session::getId());
        $logfiltre = new Zend_Log_Filter_Priority($niveau);
        $logger->addFilter($logfiltre);
        $registry->set('logger', $logger);
        $logger->info('bootstrap '.Zend_Version::VERSION);     
    }
    

    /**
     * Initialize Data bases
     * 
     * @return void
     */
    public function initPhpConfig()
    {
        
    }
    
    /**
     * Route startup
     * 
     * @return void
     */
    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
           $this->initDb();
        $this->initHelpers();
        $this->initView();
        $this->initPlugins();
        $this->initRoutes();
        $this->initControllers();
    }
    
    /**
     * Initialize data bases
     * 
     * @return void
     */
    public function initDb()
    {
        
    }

    /**
     * Initialize action helpers
     * 
     * @return void
     */
    public function initHelpers()
    {
        // register the default action helpers
        Zend_Controller_Action_HelperBroker::addPath('../application/default/helpers', 'Zend_Controller_Action_Helper');
    }
    
    /**
     * Initialize view 
     * 
     * @return void
     */
    public function initView()
    {
        // Bootstrap layouts
        $option = array(array(
            'layout' => 'main',
            'layoutPath' => $this->_root .'/application/default/layouts',
            'contentKey' => 'content',
        ),
            'layout' => 'main',
            'layoutPath' => $this->_root .'/application/administration/layouts',
            'contentKey' => 'content',
        );
        Zend_Layout::startMvc($option);
        
        
    }
    
    /**
     * Initialize plugins 
     * 
     * @return void
     */
    public function initPlugins()
    {
        
    }
    
    /**
     * Initialize routes
     * 
     * @return void
     */
    public function initRoutes()
    {
    
    }

    /**
     * Initialize Controller paths 
     * 
     * @return void
     */
    public function initControllers()
    {
        $this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default');
        $this->_front->addControllerDirectory($this->_root . '/application/administration/controllers', 'administration');
    }
}
?>

et enfin indexController.php :

Code:

<?php

/**
 * IndexController - The default controller class
 * 
 * @author
 * @version 
 */

require_once 'Zend/Controller/Action.php';
require_once 'Zend/Form.php';
require_once 'Zend/Translate.php';
require_once 'Zend/Validate.php';
require_once 'Zend/Validate/NotEmpty.php';
require_once 'Zend/Config/Ini.php';

class IndexController extends Zend_Controller_Action 
{

     public function getForm() {
        // En utilisant un fichier ini : Attention aux limites imposées.
        $config = new Zend_Config_Ini('../application/default/user.ini', 'element');
        $form   = new Zend_Form($config->user->login);
        
        /*$translate = new Zend_Translate('tmx', '../library/translate.tmx', 'fr');
        $form->setDefaultTranslator($translate);*/
        return $form;
    }
    /**
     * The default action - show the home page
     */
    public function indexAction() 
    {
        $this->view->pied = 'Pied de page';
        if (!$this->getRequest()->isPost()) {
            $this->view->form = $this->getForm();
        }
        else {
            $form = $this->getForm();
            if (!$form->isValid($_POST)) {
                // Failed validation; redisplay form
                $this->view->form = $form;
                return;
            }
        }
    }
}

Hors ligne

 

#2 14-10-2008 08:58:10

_Fuse_
Membre
Lieu: Aquitaine
Date d'inscription: 10-07-2008
Messages: 92

Re: [Zend_Layout][ZF1.6.1]Ilne me prend pas le bon fichier de layout

Salut,

Oui, il est possible d'avoir des layouts dans l'arbo des models.
Perso, j'ai créer un repertoire layouts dans le dossier views.

Tu peus procéder ainsi :

Dans le bootstrap tu renseigne le chemin vers ton dossier de layouts:

Code:

// setup the layout
Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR . '/application/views/layouts',));

Par défaut se sera le script de layout "layout.phtml" qui sera executé.

Si maintenant tu veus l'obligé à prendre un autre script de layout->
Tu renseigne le code de ton controlleur comme ceci:

Code:

public function init(){
   $this->_helper->layout()->setLayout('layout2');
}

++

Hors ligne

 

#3 14-10-2008 11:59:13

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: [Zend_Layout][ZF1.6.1]Ilne me prend pas le bon fichier de layout

Bonjour,

merci pour ta réponse.
En fait je n'ai pas de problème à avoir mon répertoire des layout où je le souhaite.
Mon problème est d'en avoir plusieurs, un par module (j'avais écrit model à tort), donc plusieurs répertoires de layout.

Dans le bootstrap j'ai déclaré mes répertoires de layout mais il va toujours prendre le répertoire administration :

Code:

 public function initView()
    {
        // Bootstrap layouts
        $option = array(array(
            'layout' => 'main01',
            'layoutPath' => $this->_root .'/application/default/layouts',
            'contentKey' => 'content',
        ),
            'layout' => 'main02',
            'layoutPath' => $this->_root .'/application/administration/layouts',
            'contentKey' => 'content',
        );
        Zend_Layout::startMvc($option);
}

Et si j'utilise :

Code:

$this->_helper->layout()->setLayout('main01');

Il me dit qu'il ne le trouve pas dans le répertoire 'administration'.
Je pense que ma déclaration dans le bootstrap est mauvaise.

Hors ligne

 

#4 14-10-2008 12:33:25

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Layout][ZF1.6.1]Ilne me prend pas le bon fichier de layout

Salut,

Je ne crois pas qu'on puisse déclarer un dossier "layout" par module à Zend_Layout.

Par contre si tu ne passes aucune option à la fonction "startMvc", il ira chercher automatiquement les layouts dans le dossier "views/scripts" du module concerné.

Par ex, si tu as une architecture modulaire du genre:

Code:

application/
    config/
    toto/        
        controllers/           
        models/
        views/
            helpers/           
            scripts/
                auth/               
                error/
                index/
                main01.phtml
                main02.phtml
    default/
        controllers/           
        models/
        views/
            helpers/           
            scripts/
                auth/               
                error/
                index/
                main01.phtml
                main02.phtml
library/
public/    
    images/
    css/
    js/
        index.php

et que dans une action tu indiques :

Code:

$this->_helper->layout()->setLayout('main01');

Il va aller chercher automatiquement le layout 'main01.phtml' dans le dossier 'views/scripts' du module dans lequel se trouve ton action.

Attention par contre, si tu procèdes de cette manière et que tu ne précises pas le layout à utiliser, il s'attendra à trouver un 'layout.phtml' dans le dossier 'views/scripts' du module.

A+ benjamin

Dernière modification par Delprog (14-10-2008 12:35:53)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 14-10-2008 17:33:51

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: [Zend_Layout][ZF1.6.1]Ilne me prend pas le bon fichier de layout

Merci delprog,

en effet tu as raison, avec plusieurs modules il semble que l'on doive mettre les layout dans les répertoires script respectifs.
Ce n'est pas un problème mais cela va à l'encontre de l'arborescence créé automatiquement quand on crée un nouveau projet Zend Framework à partir de Zend Studio, qui lui crée un répertoire spécifique pour les layout.

Hors ligne

 

#6 14-10-2008 17:58:18

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Zend_Layout][ZF1.6.1]Ilne me prend pas le bon fichier de layout

Si tu veux vraiment une arbo personnalisée, je pense que tu peux passer un plugin à ton 'frontcontroller' qui change le chemin des layouts à la volée en fonction du module en request.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#7 20-10-2008 17:59:03

barbarno
Nouveau membre
Date d'inscription: 17-10-2008
Messages: 7

Re: [Zend_Layout][ZF1.6.1]Ilne me prend pas le bon fichier de layout

Bonjour à tous,

Pour ma part et aprés avoir essayé plusieurs méthodes de rangement de mes layouts, je vais à l'encontre de ce que ZEND STUDIO crée et je met mes layouts à la racine des scripts de chaque module.

Le plus gros avantage que j'en retire , c'est de ne pas être obligé de lui dire ou ils se trouvent.
Et en définitive, ca parait assez logique de mettre les layouts un cran au-dessus des views.

C'est peut être pas une solutions qui conviendra à tous, mais elles fonctionne sans que l'on est besoin de coder la moindre la ligne.

(et moi j'aime bien quand ca fonctionne tout seul... ;-) )

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