Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai une question concernant l'arborescence à adopter sur un projet.
Contexte :
Il s'agit d'un ensemble de questionnaires. Les questionnaires ont le même fonctionnement global (etape1, etape2, ... etapen), avec possibilité de revenir en arrière. Les questionnaires sont indépendants les uns des autres, mais utilisent des fonctionnalités communes (insertion en base, librairies communes pour la validation des champs obligatoires).
Le volume de questionnaires remplis est assez important.
Question :
J'aimerais utiliser le Zend Framework, qui me semble bien adapté pour ce contexte, mais j'ai 2 solutions possibles au niveau de l'arborescence.
Dans les 2 solutions, la librairie Zend sera commune à tous les questionnaires.
1) Chaque questionnaire correspond à une utilisation distincte du Zend Framework, dans des répertoires différents, et donc un index.php (bootstrap) spécifique.
/lib
/Zend
/Autre
/models
+table.php
/questionnaires
/questionnaire1
+index.php (bootstrap)
/controller
/default
+Etape1Controller.php
+Etape2Controller.php
/view
/default
+etape1.tpl
+etape2.tpl
/questionnaire2
+index.php (bootstrap)
/controller
/default
+Etape1Controller.php
+Etape2Controller.php
/view
/default
+etape1.tpl
+etape2.tpl
2) Un seul fichier index.php, toujours appelé pour tous les questionnaires, chaque questionnaire correspondant à un module, et les etapes étant les actions de ces modules.
/lib
/Zend
/Autre
/models
+table.php
/questionnaires
+index.php
/controller
/questionnaire1
+Etape1Controller.php
+Etape2Controller.php
/questionnaire2
+Etape1Controller.php
+Etape2Controller.php
+Etape3Controller.php
/view
/questionnaire1
+etape1.tpl
+etape2.tpl
/questionnaire2
+etape1.tpl
+etape2.tpl
+etape3.tpl
La seconde solution me semble plus agréable à utiliser et plus "jolie", mais je me pose surtout des questions au niveau des performances.
Chaque questionnaire ayant un volume assez important par jour, si tout arrive sur la meme page index.php, est ce que ca peut avoir une influence négative sur les perf, ou bien est ce que je me pose des questions pour rien?
Merci d'avance !
Hors ligne
La seconde solution me semble plus agréable à utiliser et plus "jolie", mais je me pose surtout des questions au niveau des performances.
Chaque questionnaire ayant un volume assez important par jour, si tout arrive sur la meme page index.php, est ce que ca peut avoir une influence négative sur les perf, ou bien est ce que je me pose des questions pour rien?
Cela ne pas vraiment de réelle impact sur les perfs, à mon sens. Ce sera même plus facilement maintenable d'avoir qu'un seul et unique bootstrap plutôt que plusieurs (d'ailleurs, je crois même que ce ne soit pas possible d'avoir plusieurs bootstrap pour une même application : étant donné que le mod rewrite est censé rédiriger toute requête vers ton bootstrap : index.php.
La seconde solution me semble en effet la plus approprié à ta problèmatique.
Simon
Hors ligne
Bonjour,
Merci de ta réponse. Je pense également que la solution 2 est plus facile à maintenir. Ma seule crainte était pour les perfs, mais si il n'y a pas de problème, je vais partir sur cette solution.
Merci,
Laurent
Hors ligne
Je pense que tu en fait un peu trop pour ta deuxieme solution.
Jette un coup d'oeil à ça:
/lib
/Zend
/Autre
/application
/models
+table.php
/controller
/questionnaire1Controller.php
+Etape1Action()
+Etape2Action()
/questionnaire2Controller.php
+Etape1Action()
+Etape2Action()
+Etape3Action()
/view
/questionnaire1
+etape1.tpl
+etape2.tpl
/questionnaire2
+etape1.tpl
+etape2.tpl
+etape3.tpl
/public
/css
/img
+index.php
C'est plus comme ça que ça marche il me semble
Cf le viewRenderer...
Hors ligne
Saeba a écrit:
/lib
/Zend
/Autre
/models
+table.php
/questionnaires
+index.php
/controller
/questionnaire1
+Etape1Controller.php
+Etape2Controller.php
/questionnaire2
+Etape1Controller.php
+Etape2Controller.php
+Etape3Controller.php
/view
/questionnaire1
+etape1.tpl
+etape2.tpl
/questionnaire2
+etape1.tpl
+etape2.tpl
+etape3.tpl
Alors moi j'aurai une question : quelle sera l'url correspondante à questionnaire1/Etape1 ??
Est ce que questionnaire1 et questionnaire2 sont ce que l'on appelle des modules ??
Cordialement,
Elkolonel.
Hors ligne
url: questionnaire1/etape1/index
On peux dire que ouais ça passerait pour des modules dans cette conf, mais ce qui est bête c'est que les controllers ne comporteront qu'une action (index)... Mieux vaut ma proposition au dessus je pense utilisant juste des controllers avec une action/étape.
Hors ligne
Mr.MoOx a écrit:
url: questionnaire1/etape1/index
On peux dire que ouais ça passerait pour des modules dans cette conf, mais ce qui est bête c'est que les controllers ne comporteront qu'une action (index)... Mieux vaut ma proposition au dessus je pense utilisant juste des controllers avec une action/étape.
Mr.MoOx,
Merci de ta réponse également.
J'avais mis les questionnaires chacun dans un répertoire, car je peux avoir des fichiers spécifiques à un questionnaire particulier, par exemple une initialisation ou autre.
Par contre tu as raison, mon arbo était pas super. Mais je m'étais également mal exprimé dans mon schéma.
/questionnaire1
+Etape1Controller.php
+Etape2Controller.php
Ca correspondait en fait à un dossier questionaire 1, avec 2 fichiers controleurs : Etape1Controlleur.php et Etape2Controlleur.php, qui peuvent chacun contenir plusieurs fonctions (init, index, mais aussi ajout(), maj(), ou autre).
Je vais par contre reprendre ton arbo globale :
/lib
/Zend
/Autre
/application
/models
+table.php
/controller
/questionnaire1
+Etape1Controller.php ====> Fichier qui gere l'etape1
+ indexAction() ====> Fonction
+ majAction() ====> Fonction
+Etape2Controller.php ====> Fichier qui gere l'etape 2
+fichierspecifique.php ====> Fichier spécifique pour le questionnaire 1
/view
/questionnaire1
+etape1.tpl
+etape2.tpl
/questionnaire2
+etape1.tpl
+etape2.tpl
+etape3.tpl
/public
/css
/img
+index.php
Pour les url : http://adresse/questionnaire1/etape1/index ==> etape1 du module questionnaire1
Merci de ton aide.
Laurent
Edit :
Je viens de comprendre en fait, j'ai un niveau de profondeur en plus que toi Mr.MoOx il me semble.
Toi tu as un seul controlleur par questionnaire (questionnaire1Controller.php), qui a plusieurs fonctions (etape1, etape2, ...).
==> http://adresse/questionnaire1/etape1, http://adresse/questionnaire1/etape2
Moi de mon coté, j'ai plusieurs controlleurs par questionnaire, chaque controlleur correspondant à une etape.
Dans chacun de ces controlleurs, j'ai la fonction index par défaut, mais je peux mettre d'autres fonction spécifiques à une etape.
http://adresse/questionnaire1/etape1/index, http://adresse/questionnaire1/etape1/autreaction, http://adresse/questionnaire1/etape2/index, http://adresse/questionnaire1/etape2/encoreuneautre
laurent
Dernière modification par Saeba (06-02-2008 18:20:59)
Hors ligne
Bon si je reprends la doc :
// Régler plusieurs répertoires de modules d'un seul coup : $front->setControllerDirectory(array( 'default' => '../application/controllers', 'blog' => '../modules/blog/controllers', 'news' => '../modules/news/controllers', )); // Ajouter le répertoire de module 'foo' : $front->addControllerDirectory('../modules/foo/controllers', 'foo');
mais moi je souhaite utiliser ceci comme arborescence
/config
/controllers
/library
/models
/modules
|__ Backoffice
|_ controllers
|_ AccountController.php
|_ IndexController.php
|__ Front
|_ controllers
donc j'essaye de placer cela dans mon bootstrap :
// setup controller $frontController = Zend_Controller_Front::getInstance(); $frontController->throwExceptions(true); $frontController->setControllerDirectory(array( 'backoffice' => $global->path->root . 'modules/Backoffice/controllers/', 'default' => $global->path->root . 'controllers/Front/') ); $frontController->addControllerDirectory($global->path->root . 'modules/Backoffice/controllers','backoffice'); $frontController->setModuleControllerDirectoryName('controllers'); $frontController->addModuleDirectory($global->path->root . 'modules/');
mais cela ne semble pas concluant lorsque je rentre cette adresse http://monserveurweb.fr/index.php/backoffice/:
array(3) {
["backoffice"] => string(60) "/home/http/modules/Backoffice/controllers"
["default"] => string(47) "/home/http/controllers/Front"
["Backoffice"] => string(60) "/home/http/modules/Backoffice/controllers"
}
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Backoffice_IndexController")' in /home/http/library/Zend/Controller/Dispatcher/Standard.php:300 Stack trace: #0 /home/http/library/Zend/Controller/Dispatcher/Standard.php(212): Zend_Controller_Dispatcher_Standard->loadClass('IndexController') #1 /home/http/library/Zend/Controller/Front.php(929): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #2 /home/http/index.php(116): Zend_Controller_Front->dispatch() #3 {main} thrown in /home/http/library/Zend/Controller/Dispatcher/Standard.php on line 300
Quelqu'un peu t-il me dépatouiller ou me mettre sur la voie...
Cordialement,
elkolonel
Dernière modification par elkolonel (07-02-2008 02:44:16)
Hors ligne
Si tu lis bien le message d'erreur (les 2 permières lignes suffisent), tu comprendras d'où viens le soucis.
Regarde la doc concernant le routage (par default) et aussi l'utiliseation des controllers (et donc des noms des controller quand ils sont dnas un module.
Hors ligne
Hello,
Alors quelques modifications s'imposent :
j'ai modifié l'arborescence comme suit :
/config
/controllers
/library
/models
/modules
|__ Backoffice
|_ controllers
|_ AccountController.php
|_ IndexController.php
|_ views
|_ scripts
|_ account
|_ index.phtml
|_ index
|_ index.phtml
|__ Front
|_ controllers
|_ IndexController.php
|_ views
|_ scripts
|_ index
|_ index.phtml
Modification du code du bootstrap :
$frontController->setRouter($router); $frontController->setControllerDirectory(array( 'Backoffice' => $global->path->root . 'modules/Backoffice/controllers/', 'default' => $global->path->root . 'modules/Front/controllers/') );
Pour le Front, tout marche correctement. Par contre lorsque je tape :
version 1 : http://monserveurweb.fr/index.php/backoffice/ ou
version 2 : http://monserveurweb.fr/index.php/Backoffice/
Cela ne fonctionne pas. J'obtiens l'erreur suivante :
Pour la version 1
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (backoffice)'
Pour la version 2
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Backoffice_IndexController")
Est ce mon url qui n'est pas formée correctement ou est ce un problème au niveau du bootstrap ??
Je rappelle que pour la partie Front tout fonctionne correctement.
Merci de votre assistance. En attendant je cherche ;-).
Cordialement,
Dernière modification par elkolonel (07-02-2008 14:05:52)
Hors ligne
Alors j'ai essayé différentes choses :
$frontController->addModuleDirectory($global->path->root . 'modules/');
$frontController->setRouter($router); $frontController->setControllerDirectory(array( 'default' => $global->path->root . 'modules/Front/controllers', 'Backoffice' => $global->path->root . 'modules/Backoffice/controllers'),'Backoffice' );
Mais rien n'y fait pour le moment. Je continue de lire la doc et d'essayer d'appliquer ce que j'y trouve, mais à mon avis pour le moment je fais fausse route ;-)
J'obtiens toujours les mêmes erreurs, la partie Front fonctionne toujours.
Cordialement,
Hors ligne
Je crois que je viens de trouver une piste intéressante :
http://framework.zend.com/manual/en/zen … irectories
Je creuse et je vous tiens au courant.
Cordialement,
Hors ligne
La classe présente dans ton fichier AccountController.php doit s'appeller Backoffice_AccountController, idem avec IndexController.php qui doit contenir la classe Backoffice_IndexController. C'est peut être ça.
Hors ligne
En effet, c'est ce que je viens de découvrir. J'avais complètement omis le mode de fonctionnement de ZF.
Toutefois, j'ai adapté mon bootstrap de l manière suivante :
$frontController->setControllerDirectory(array( 'default' => $global->path->root . 'modules/front/controllers') ); // Define module path $frontController->addModuleDirectory($global->path->root . 'modules');
Ensuite j'ai renommé mes répertoires de module afin qu'ils soient en minuscules (backoffice,front)
Et cela marche.
Merci beaucoup, mais c'est vrai qu'il faut bien formater son esprit et sa façon de voir dans la philosophie ZF.
Cordialement,
Hors ligne
Bonsoir.
Je voulais juste relever le fait que le tableau pour la définitions des répertoires n'est pas nécessaire. D'autant plus que tu n'as qu'un seul répertoire
setControllerDirectory( '/path/to/controller/directory' );
Un détail
Cordialement,
Hors ligne
salut,
je travail sur un projet dont l'arboresence est semblable a la tienne c'est a dire un backoffice et frontoffice.
Voici mon arboresence :
-projet
-application
-model
*Theme.php
*Niveau.php
....
-modules
-admin
-controllers
*IndexController.php
*ThemeController.php
*NiveauController.ph
....
-views
-scripts
-index
-niveau
-theme
-espace
-controllers
*IndexController.php
-views
-scripts
-index
-library
-public
-index.php
et donc le bootsrap j'ai mis ceci
$frontController->setControllerDirectory(array( 'admin' => './application/modules/admin/controllers', 'default' => './application/modules/espace/controllers', 'espace' => './application/modules/espace/controllers'));
mais seule l'url http://localhost/projet/ fonctionnne (elle me renvoi vers le module espace)
par contre l'url http://localhost/projet/espace me retourne cette erreur
Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Espace_IndexController")
Et de meme pour l'url http://localhost/projet/admin
Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Admin_IndexController")
Merci de m'aider
Hors ligne
alors pa de solution ???
Hors ligne
Mr.MoOx a écrit:
Si, elle est plus haut dans le post. Lis bien.
Ou alors comprends ton message d'erreur qui est pourtant très simple.
je suis encore un debutant dans zf et ca sera plus facile pour moi de m'aider a resoudre ce probleme
Hors ligne
Ton problème set le même que ici: http://www.z-f.fr/forum/viewtopic.php?pid=4387#p4387 (7 posts plus haut je donne la technique)
-espace
-controllers
*IndexController.php
Dans un module les controllers doivent être préfixé par le nom du module, d'où ton erreur:
Invalid controller class ("Espace_IndexController")
Ton fichier doit bien s'appeller IndexController.php, mais la class à l'intérieur doit s'appeller Espace_IndexController.
Hors ligne
Merci beaucoup ca marche impeccablement
Hors ligne
J'ai encore une question d'arborescence
La répertoire 'application' peut on s'en passer ? (pas le contenu du répertoire, mais juste le contenant)
J'imagine que oui si le nécessaire est fait dans le bootstrap, cela dit, est ce que cela ne perturbe pas ensuite le fonctionnement du ZF ?
Cordialement,
Dernière modification par elkolonel (26-06-2008 09:42:09)
Hors ligne
Merci Mr.MoOx...
Hors ligne