Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-01-2008 01:07:15

mip
Nouveau membre
Date d'inscription: 22-01-2008
Messages: 4

[Zend_Layout][1.0.3] un template pour chaque module

Je débute avec le Zend Framework. J'ai commencé à suivre les différents tutoriaux présents sur le site développez.com. Mon problème est le suivant : je souhaite créer un template pour chaque module présent sur mon site. Actuellement, j'ai seulement un module admin (pour l'administration du site) et default (pour le site) mais  je ne sais pas comment creer un template different a l'aide du composant Zend_Layout. Voici un morceau de mon index.php :

Code:

$frontController = Zend_Controller_Front::getInstance();
$frontController->setRouter($router);
$frontController->setControllerDirectory(array(
                            'default' => ROOT_DIR .'/zend_layout/app/default/controllers',
                            'admin' => ROOT_DIR .'/zend_layout/app/admin/controllers'
                        ));
                        
$frontController->setRequest(new Zend_Controller_Request_Http());
$frontController->throwExceptions(true);
Zend_Layout::startMvc(array(
                        'layoutPath' => ROOT_DIR .'/zend_layout/app/default/views/layouts/',
                        'layout' => 'template'
                      )    
                    );

Quelqu'un aurait t-il une solution ? Merci

Dernière modification par mip (24-01-2008 01:08:26)

Hors ligne

 

#2 29-01-2008 20:56:46

nemesisTHEone
Nouveau membre
Date d'inscription: 29-01-2008
Messages: 7

Re: [Zend_Layout][1.0.3] un template pour chaque module

normalement, si tu ne spécifie pas le 'layoutPath', le comportement par default du Zend_Layout est celui que tu décris.
il suffit de mettre le fichier template.phtml dans pathVersTonModule/views/scripts/
donc dans ton server tu auras un truc du genre
/zend_layout/app/admin/views/scripts/template.phtml
/zend_layout/app/default/views/scripts/template.phtml

Hors ligne

 

#3 30-01-2008 00:45:30

mip
Nouveau membre
Date d'inscription: 22-01-2008
Messages: 4

Re: [Zend_Layout][1.0.3] un template pour chaque module

Merci beaucoup pour ta reponse nemesisTHEone. Effectivement ta solution fonctionne bien mais est t-il possible de specifier un autre chemin tel que  :
/zend_layout/app/admin/views/un_autre_repertoire/template.html
/zend_layout/app/default/views/un_autre_repertoire/template.html

Hors ligne

 

#4 30-01-2008 09:19:20

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Layout][1.0.3] un template pour chaque module

As tu essayer de fournir un tableau à clé pour le layout path?

Code:

Zend_Layout::startMvc(array(
                        'layoutPath' => array(
                            'default' => ROOT_DIR .'/zend_layout/app/default/views/monrep/',
                            'module1'=> ROOT_DIR .'/zend_layout/app/module1/views/monrep/'
                        ),
                        'layout' => 'template'));

Je ne sais pas si ça marche mais ça coute rien d'essayer smile
                      )   
                    );

Hors ligne

 

#5 30-01-2008 11:52:35

mip
Nouveau membre
Date d'inscription: 22-01-2008
Messages: 4

Re: [Zend_Layout][1.0.3] un template pour chaque module

Oui j'ai deja essayé de faire comme ca mais la propriété $_layoutPath de la classe Layout accepte seulement une chaine de caractere

Code:

class Zend_Layout
{
  ....

/**
     * Layout view script path
     * @var string
     */
    protected $_layoutPath;
  ....
}

Hors ligne

 

#6 15-03-2008 13:32:04

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Layout][1.0.3] un template pour chaque module

Et hop un petit code pour faire ça! (ça marche pour moi)

Utilisation: simple pour le cas des modules
$frontController->registerPlugin(new Rx_Controller_Plugin_LayoutFromRoute());
Exemple pour un layout par controller (on sait jamais hein?)
$frontController->registerPlugin(new Rx_Controller_Plugin_LayoutFromRoute(array('pieceOfRoute'=>'controller'));
On peux remplacer controller par action mais bon la je doute que ça serve beaucoup smile
Si vous avez un bug, je vous remercie de m'en prevenir! (mon mail est juste à côté)

Code:

<?php
/**
 * Rewix extension for Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://www.rewix.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to contact@rewix.com so we can send you a copy immediately.
 *
 * @category   Rx
 * @package    Rx_Controller_Plugin
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */

require_once 'Zend/Controller/Plugin/Abstract.php';

/**
 * Rx_Controller_Plugin_LayoutFromRoute
 * It's a plugin for set the layout from the module name
 *
 * @category   Rx
 * @package    Rx_Controller_Plugin
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */
class Rx_Controller_Plugin_LayoutFromRoute extends Zend_Controller_Plugin_Abstract
{
    /**
     * Partie de la route devant être prise du sous domaine...
     *
     * @var String
     */
    private $_pieceOfRoute;
    
    public function __construct(array $options = array('pieceOfRoute'=>'module')) {
        extract($options);
        $this->_pieceOfRoute = $pieceOfRoute;
    }

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        switch($this->_pieceOfRoute) {
            case 'module':
            case 'controller':
            case 'action':
                $fnNameEnd = ucfirst($this->_pieceOfRoute).'Name';
                $fnGet = 'get'.$fnNameEnd;
                $name = $request->$fnGet();
                break;
                
            //TODO?
            //case 'param':
                //$name = $request->getParam();
                //break;
            default:
                $name = 'default';
        }
        $layout = Zend_Layout::getMvcInstance();
        $path = $layout->getLayoutPath();
        $suffix = $layout->getViewSuffix();
        if (file_exists($path.'/'.$name.'.'.$suffix)) {
            $layout->setLayout($name);
        }
        if ($name=='default') $name = 'www'; //A voir...
        $layout->assign('moduleName', $name);
    }
}

Dernière modification par Mr.MoOx (11-04-2008 12:13:35)

Hors ligne

 

#7 20-03-2008 03:04:53

xorax
Membre
Lieu: Lyon
Date d'inscription: 30-10-2007
Messages: 12
Site web

Re: [Zend_Layout][1.0.3] un template pour chaque module

bien vu smile

Je cherche dans le même genre mais avec réorganisation de la structure :
app
--module
  --controllers
  --views
  --layouts

le problème c'est qu'on est obligé de faire un
dirname(Zend_Controller_Front::getInstance()->getControllerDirectory())
pour pouvoir récupérer le repertoire du module (le repertoire views est determiné de la même manière apparement).

Je trouve pas ça très clean, aucun moyen de prendre directement le path du module.

j'as pensé à un truck du style (pour reprendre ta classe):

Code:

class X_Controller_Plugin_LayoutPathFromModule extends Zend_Controller_Plugin_Abstract
{
    private $_layoutDir;
   
    public function __construct(array $options = array('layoutDir'=>'layouts')) {
        extract($options);
        $this->_layoutDir = $layoutDir;
    }

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        $dir =  Zend_Controller_Front::getInstance()->getControllerDirectory($request->getModuleName());
        $dir = dirname($dir).'/'.$this->_layoutDir;
        Zend_Layout::getMvcInstance()->setLayoutPath($dir);
    }
}

ça marche mais (au dela du fait que ça me semble pas clean) j'aurais aussi aimer mettre le path layouts dans le répertoire views/.
J'ai pas encore regarder de quoi dépend le path du répertoire views.
est-il toujours au même niveau que controller/ ?

Hors ligne

 

#8 07-04-2008 12:56:18

lethak
Membre
Lieu: France
Date d'inscription: 05-04-2008
Messages: 168

Re: [Zend_Layout][1.0.3] un template pour chaque module

il est possible de spécifier tout cela avec Zend_Config.

j'utilise le fichier config(ini) suivant:

Code:

    [layout]
    ; Zend_Config
        
        layoutPath = "layouts/Orange"
        layout = "layout"
        
        ;mvcSuccessfulActionOnly = true
        ;contentKey = "CONTENT"

bootstrap (index.php):

Code:

$CONFIG = new Zend_Config_Ini(CONFIG_PATH.MAIN_CONFIG_FILE, null);
Zend_Layout::startMvc($CONFIG->layout);

j'utilise cette arbo:

http://img254.imageshack.us/img254/1977/zflayoutarboij6.jpg


j'en profite pour poser une question, est il possible de changer de layout en fonction de l'action ou l'on se trouve ?


IT Dev @Twitter

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