Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-06-2008 10:19:25

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

[1.5] Utilisation des modules

Bonjour,

J'ai une petite question sur l'utilisation des modules.

Je suis en train de faire mon premier site sous ZF et actuellement mon arborescence actuelle ressemble à ça :

Code:

/app
    /controllers
        /ArticleController.php
        /ErrorController.php
        /IndexController.php
    /models
    /modules
        /admin
            /controllers
                /ArticleController.php
                /IndexController.php
            /models
            /views
    /plugins
    /wiews
/library
    /Zend
/public
    /admin
        /images
        /css
    /images
    /css
    /index.php
/var
    /cache
        /zend
    /log

Dans mon index.php j'ai défini un layout pour l'ensemble du site "public"

Code:

Zend_Layout::startMvc($configSite -> layout);

Il se trouve dans /app/views/scripts/gabarit_general.phtml

Dans le module d'admin j'ai un autre layout qui se trouve dans
/app/modules/admin/view/scripts/gabarit_general.phtml

Pour ce que j'ai compris des modules c'est comme un site dans un site.
Un module a ses propres controllers, leurs vues etc.

Quand je vais dans "www.monsite.com/admin/" le layout chargé est celui du module admin. J'en conclue donc qu'un module utilise par défaut sont propre layout et ignore celui du site global.

Mais peut-être que je me trompe smile Je vous laisse le soin de me reprendre !

Pour vérifier les accès à l'espace d'admin j'ai fait un petit plugin :

Code:

<?php

class IdentAdmin extends Zend_Controller_Plugin_Abstract {
    
    public function preDispatch (Zend_Controller_Request_Abstract $request) {
        
        $Module        = $request->getModuleName();
        $Controller    = $request->getControllerName();
        $Action        = $request->getActionName();
        
        if ( $Module == "admin" AND ( $Controller != "index" OR ( $Controller == "index" AND $Action == "index" ) ) ) {    
            $sessionAdmin = new Zend_Session_Namespace(NOM_SESSION_ADMIN);
            if ( !isset( $sessionAdmin -> administrateurLogge) ) {
                header("Location:/admin/login");
            }
        }
    }
}

?>

En gros si on est dans le module "admin" et dans un autre controller que "index" je test une session $sessionAdmin -> administrateurLogge et je redirige au besoin.

Est-ce une façon correcte de faire ?

Maintenant, ce que je souhaiterais, c'est remplacer mes controllers par des modules avec une arbo un peu comme ça :

Code:

/app
    /controllers
        /ErrorController.php
        /IndexController.php
    /models
    /modules
        /article
            /controllers
                /IndexController.php
                /AdminController.php
            /models
            /views
    /plugins
    /wiews

Comme ça quand je développe un nouveau site j'ai juste à récupérer le dossier "article" complet et je n'ai pas à récupérer des fichiers à droite, à gauche...

Mais voilà, je ne vois pas trop comment faire...

Comment faire en sorte que le IndexController d'un module charge le layout du site et non pas un layout dans "app/modules/article/view/scripts/layout.phtml" ?
Idem pour l'admin :-)

Comment éviter des urls du genre http://www.monsite.com/article/index/lire/uid/35 ?
Mais là je peux utiliser des routes...

Mon principe actuel fonctionne bien, c'est juste pour apprendre et aussi pour faciliter la récupération d'éléments déjà développés...

Merci d'avoir lu jusque là et bonne journée.

Cordialement,
Kaimite

Dernière modification par Kaimite (27-06-2008 10:23:35)

Hors ligne

 

#2 30-06-2008 10:20:39

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: [1.5] Utilisation des modules

Kaimite a écrit:

Maintenant, ce que je souhaiterais, c'est remplacer mes controllers par des modules avec une arbo un peu comme ça :

Code:

/app
    /controllers
        /ErrorController.php
        /IndexController.php
    /models
    /modules
        /article
            /controllers
                /IndexController.php
                /AdminController.php
            /models
            /views
    /plugins
    /wiews

Comme ça quand je développe un nouveau site j'ai juste à récupérer le dossier "article" complet et je n'ai pas à récupérer des fichiers à droite, à gauche...

Mais voilà, je ne vois pas trop comment faire...

Comment faire en sorte que le IndexController d'un module charge le layout du site et non pas un layout dans "app/modules/article/view/scripts/layout.phtml" ?
Idem pour l'admin :-)

Salut j'ai personnellement essayé plusieurs techniques : avec 1 ou 2 bootstrap et en isolant ou pas les contrôleurs back/front. J'ai finalement opter pour 2 fichier de bootstraps qui font appelles à la même classe de bootstrap. Il y en a un à la racine du répertoire public et un dans un sous répertoire admin pour le backoffice.

Pour les template j'utilise Zend_Layout et un système de thèmes. J'ai donc un thème pour le front et un thème pour le back. D'où cette organisation de mes fichiers :


/application
    ...
    /layouts
        /admin
            /index.phtml
            /l2col.phtml
            /l3col.phtml
            /menu.phtml
        /default
            /index.phtml
            /l2col.phtml
            /l3col.phtml
    /modules
        /contacts
        /default
        ...
        /users
    /public
        /admin
            index.php
            .htacess
        /themes
            /_common
                /javascript
            /admin
                /css
                /images
                /javascript
            /default
                /css
                /images
                /javascript
        index.php
        .htacess
Bootstrap.php

Puis dans chaque fichier de bootstrap quand j'instancis ma class de bootstrap je lui passe en argument quel thème je veux utiliser.


Si l'on veut utiliser un seul fichier de bootstrap il faut alors créer une route du type :

Code:

new Zend_Controller_Router_Route('admin/:module/:controller/:action/*',
        array(
             'module'     => 'properties',
             'controller' => 'index',
             'action'     => 'index',
             '_isAdmin' => true)
        );

Et un plugin de front contrôleur qui viendra vérifié sur "route shut down" si la variable de request isAdmin === true et choisir le bon thème en fonction.


On peut aussi isoler les contrôleurs spécifiques à l'admin dans un répertoire backend

Code:

/modules
        /articles
            /controllers
                /ArticleController.php
                /backend
                    /IndexController.php
                    /views
            /models
            /views

Puis détecter dans le bootstrap si l'on est en mode admin et le spécifier au frontController :

Code:

$this->_front->setModuleControllerDirectoryName('backend/controllers');

Voilà je te laisse expérimenter,

@+

Hors ligne

 

#3 30-06-2008 14:25:59

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] Utilisation des modules

Merci pour la réponse.

Je vais regarder ça et je te tiens au courant smile

Cordialement,
Kaimite

Hors ligne

 

#4 30-06-2008 23:39:04

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] Utilisation des modules

Merci,

ça marche super bien ! c'est nickel.
J'ai mis un second bootstrap dans mon dossier public et tout marche bien.

Juste une autre petite question smile

Comment faire pour avoir un helper qui soit commun à tous mes modules ?

J'ai fait un petit helper tout bête pour afficher une pagination simpli :

Code:

<?php
class Zend_View_Helper_Paginer {
    function Paginer ($nbPages, $debutUrl, $nomVar) {
        $Request = Zend_Controller_Front::getInstance() -> getRequest();
        
        if ( isset ( $Request -> $nomVar )  ) {
            $pageEnCours = $Request -> $nomVar;
        }
        else {
            $pageEnCours = 1;
        }
        
        $codeRetour = '<p class="Pagination">&lt; ' . "\n";
        
        for ( $i = 1; $i <= $nbPages; $i++ ) {
            
            if ( $i == 1 ) { $urlSuite = $debutUrl; } else { $urlSuite = $debutUrl . "/" . $nomVar . "/" . $i; }
            if ( $i == $pageEnCours ) { $classNav = ' class="enCours"'; } else { $classNav = ""; }
            $codeRetour .= '<a href="' . $urlSuite . '"' . $classNav . '>' . $i . '</a>';
        }
        
        $codeRetour .= ' &gt;</p>' . "\n";
        return $codeRetour;
    }
}
?>

Et dans ma vue :

Code:

<?php

if ( $this -> nbPages > 1 ) {
    echo $this -> Paginer($this -> nbPages, $this -> urlBasePagination, "page");
}

?>

Avant il était dans "/app/views/helper" et je pouvais l'appeler dans n'importe quelle vue.

Maintant je l'ai mis dans "/app/modules/default/views/helpers" et j'obtiens un message suivant :

Code:

helper 'Paginer' not found in path

Que dois-je faire ?

Merci pour ton aide.

Cordialement,
Kaimite

Hors ligne

 

#5 01-07-2008 09:13:01

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: [1.5] Utilisation des modules

Salut,

Je place les helpers que j'ai en commun dans la library comme ceux du ZF sauf que je suis dans mon namespace (Mmx). Il faut juste le signaler à la vue dans ton bootstrap avec Zend_View::addHelperPath().

J'ai quelques chose qui ressemble à ça:

Code:

// View
        require 'Zend/View.php';
        require 'Zend/Controller/Action/Helper/ViewRenderer.php';
        $view    = new Zend_View(array('encoding' => 'UTF-8'));
        $view->setEncoding('utf-8');
        $view->doctype('XHTML1_TRANSITIONAL');
        // set commmon view vars
        $view->urlRoot   = 'http://'.$_SERVER['HTTP_HOST'].$appConfig->url->base;
        $view->urlMaster  = 'http://'.$appConfig->url->master;
        $view->urlAssets = 'http://'.$appConfig->url->assets;
        $view->urlTheme  = $view->urlAssets.'/themes/'.$bootstrapConfig->theme;
        $view->urlImages = $view->urlTheme.'/images';
        $view->urlSwf    = $view->urlTheme.'/swf';
        $view->urlMedias = $view->urlAssets.'/medias';
        $view->urlCss    = $view->urlTheme.'/css';
        $view->urlJs     = $view->urlTheme.'/javascript';
        $view->addHelperPath(self::$_rootPath.'/library/Mmx/View/Helper', 'Mmx_View_Helper');
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        $viewRenderer->setView($view);

Hors ligne

 

#6 01-07-2008 22:38:34

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] Utilisation des modules

Bonsoir et encore merci pour tes réponse !

Tout fonctionne bien (pour le moment !).

Juste une autre petite question :

$view->addHelperPath(self::$_rootPath.'/library/Mmx/View/Helper', 'Mmx_View_Helper');

A quoi correspond le fameux Mmx_View_Helper car quoi que je mette ça fonctionne.

Sur la doc ils parlent de préfixe de class mais comme je l'ai dit, quoi que je mette ça fonctionne smile

Bonne soirée.

Cordialement, Kaimite

Hors ligne

 

#7 03-07-2008 12:09:37

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: [1.5] Utilisation des modules

Kaimite a écrit:

$view->addHelperPath(self::$_rootPath.'/library/Mmx/View/Helper', 'Mmx_View_Helper');

A quoi correspond le fameux Mmx_View_Helper car quoi que je mette ça fonctionne.

Étrange... C'est le préfix de class qui va servire à former le nom complet de la class de ton helper.
Donc si dans ta vue tu fait $this->pager(), Zend_View va instancier la classe Mmx_View_Helper_Pager (si le helper n'a pas encore été appelé).

Voir Zend_View_Abstract ligne 986

De mon côté si je met n'importe quoi ça ne marche plus.

Dernière modification par 2mx (03-07-2008 13:37:22)

Hors ligne

 

#8 03-07-2008 12:35:59

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] Utilisation des modules

Heuuu j'vais du consommer un peu trop de quelque chose !

En fait j'ai testé sur une page qui ne demandais le helper (pas assez d'articles pour paginer).

Effectivement si je met "toto" ça marche pas smile

Je sais chuis chiant mais j'ai encore une petite question.

Pour mon admin j'ai des vues communes à chaque module. Comme les listings par exemple.

J'ai essayé de faire ça dans le bootstrap de l'admin :

Code:

$view = new Zend_View(array('encoding' => 'iso-8859-1'));
$view -> setEncoding('iso-8859-1');
$view -> addScriptPath(MODULES_DIR . "/default/admin/views/communes");

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view);

Et maintenant que je suis sur : http://www.monsite.com/admin/

J'ai le message suivant :

Code:

script 'index/index.phtml' not found in path (/Users/pilou/Sites/zf-test/app/modules/default/admin/views/communes/)

Pourtant selon la doc addScriptPath permet d'ajouter un chemin de plus pour chercher les vues.

Je ne vois pas pourquoi il cherche uniquement dans mes vues communes.

Merci encore pour ton aide.

Cordialement,
Kaimite

Hors ligne

 

#9 03-07-2008 13:46:54

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: [1.5] Utilisation des modules

Kaimite a écrit:

Pour mon admin j'ai des vues communes à chaque module. Comme les listings par exemple.

Est ce que tu a envisagé l'utilisation d'un partial

Kaimite a écrit:

J'ai essayé de faire ça dans le bootstrap de l'admin :

Code:

$view = new Zend_View(array('encoding' => 'iso-8859-1'));
$view -> setEncoding('iso-8859-1');
$view -> addScriptPath(MODULES_DIR . "/default/admin/views/communes");

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view);

Et maintenant que je suis sur : http://www.monsite.com/admin/

J'ai le message suivant :

Code:

script 'index/index.phtml' not found in path (/Users/pilou/Sites/zf-test/app/modules/default/admin/views/communes/)

Pourtant selon la doc addScriptPath permet d'ajouter un chemin de plus pour chercher les vues.

Je ne vois pas pourquoi il cherche uniquement dans mes vues communes.

Là je ne vois pas vraiment ...

Hors ligne

 

#10 03-07-2008 14:08:03

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] Utilisation des modules

Je ne connais pas les "partials" Je vais regarder sur la doc.

Hors ligne

 

#11 03-07-2008 14:32:13

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] Utilisation des modules

Voici une méthode que j'ai trouvé :

$this -> view -> setBasePath(MODULES_DIR . "/default/admin/views");
$this -> render('liste', null, true);

Je suis sur que ça existe dans ZF mais je ne trouve pas comment faire pour indiquer le chemin directe du fichier de la vue pour une action précise.

J'ai essayé

$this -> render(MODULES_DIR . "/default/admin/views/liste.phtml");

mais j'obtiens

Code:

script 'index//users/pilou/sites/zf-test/app/modules/default/admin/views/liste-phtml.phtml' not found in path (/Users/pilou/Sites/zf-test/app/modules/article/admin/views/scripts/)

ça dois surement être tout con mais je ne vois pas sad

Cordialement,
Kaimite

Hors ligne

 

#12 03-07-2008 15:59:14

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: [1.5] Utilisation des modules

Essaie :

Code:

// Choisir une vue différente
$this->_helper->viewRenderer->setRender('list');
// ou en plus concis
$this->_helper->viewRenderer('list');

Hors ligne

 

#13 03-07-2008 16:34:07

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] Utilisation des modules

J'obtiens un message d'erreur :

script 'index/xxx.phtml' not found in path (/Users/pilou/Sites/zf-test/app/modules/article/admin/views/scripts/)

Mais voilà ce que j'ai fait :

Dans le bootstrap :

Code:

require 'Zend/View.php';
require 'Zend/Controller/Action/Helper/ViewRenderer.php';

$view = new Zend_View(array('encoding' => 'iso-8859-1'));
$view -> setEncoding('iso-8859-1');
$view -> addHelperPath(KAIMITE_DIR . '/View/Helper', 'Kaimite_View_Helper');
$view -> addScriptPath(MODULES_DIR . "/default/admin/views/scripts");
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer -> setView($view);

Et je met toutes mes vues communes dans la partie "admin" du module "default".
Comme ça je peux le conbiner avec un
$this->_helper->viewRenderer('list');

Tant que le fichier se trouve dans "app/modules/default/admin/views/script/index"

Comme ça, ça fonctione, ça ne me parait pas trop bidouille et je peux continuer à avancer sur mon site smile

En tout cas merci pour tout tu m'a permis de bien avancer smile

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