Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 :
/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"
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 Je vous laisse le soin de me reprendre !
Pour vérifier les accès à l'espace d'admin j'ai fait un petit plugin :
<?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 :
/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
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 /wiewsComme ç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 :
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
/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 :
$this->_front->setModuleControllerDirectoryName('backend/controllers');
Voilà je te laisse expérimenter,
@+
Hors ligne
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
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 :
<?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">< ' . "\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 .= ' ></p>' . "\n"; return $codeRetour; } } ?>
Et dans ma vue :
<?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 :
helper 'Paginer' not found in path
Que dois-je faire ?
Merci pour ton aide.
Cordialement,
Kaimite
Hors ligne
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:
// 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
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
Bonne soirée.
Cordialement, Kaimite
Hors ligne
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
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
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 :
$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 :
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
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
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
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
Cordialement,
Kaimite
Hors ligne
Essaie :
// Choisir une vue différente $this->_helper->viewRenderer->setRender('list'); // ou en plus concis $this->_helper->viewRenderer('list');
Hors ligne
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 :
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
En tout cas merci pour tout tu m'a permis de bien avancer
Hors ligne