Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-11-2010 15:10:24

Hannibal
Nouveau membre
Date d'inscription: 19-11-2010
Messages: 6

Application Modulaire: definir un module par defaut autre que DEFAULT

Bonjour à tous,

Je suis comment tout  le nouveau, j'ai un problème que j'arrive pas à résoudre.

Voilà j'ai pris en compte une application en php4, ça me plait pas de rester sans migrer pour profiter de php5 et l'objet. j'ai décidé d'utiliser ZF en plus.

Et par manque de  temps, j'ai décidé de faire cohabiter l'ancien architecture et ZF ensemble le temps de tout refaire.
Mais je suis obligé de développer des nouveaux modules, avec ZF  biensur ^^

Voilà mon histoire ...

Mon problème: donc j'ai une appli sous cette forme avec zend

Code:

--> dir_patch
    -->Bibliotheque
    -->Modules_ancien
    --> ....

    -->Application 
        --> Configs
        --> Helpers
        --> Layouts
        --> Modules
            -->albums
                -->Controllers
                     -->ErrorController.php
                     -->IndexController.php
                -->Forms
                -->models
                -->views
                -->Bootstrap.php
            -->default
                -->Controllers
                     -->ErrorController.php
                     -->IndexController.php
                -->Forms
                -->models
                -->views
                -->Bootstrap.php
        -->Bootstrap.php
        --> .....

Le dossier Modules_ancien contient les anciens modules en php5 qui sont appelés par un menu en javascript, ça fait un include de la page index.php de chaque module dans la page index principale.


Donc jusqu'au là c'est bon je peux appeler ma page ZF /public/index.php sans problème, par contre si je veux
lancer mon module albums, ça marche pas, le URL de lancement d'un module ZF est '.. /public/albums', alors que include prend en charge que page.php.


Donc j'ai pensé changer le module par default dans le bootstrap.php comment ça :

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDefaultNamespace()
    {       
           $this->bootstrap('frontController');
           $fc = $this->getResource('frontController'); 
           
           $fc->setDefaultModule('albums');
               
           $defaultModule = $fc->getControllerDirectory($fc->getDefaultModule());
        //$front->setParam('useDefaultControllerAlways', true);              
        
        new Zend_Application_Module_Autoloader(array(
                'namespace' => '', // pas de namespace
                'basePath'  => APPLICATION_PATH . $defaultModule,
            ));
              
        return $moduleLoader;
    }
}

ça me donne une erreur :

Code:

An error occurred
Page not found
Exception information:
Message: Invalid controller class ("IndexController") 

Stack trace:
#0 C:\www\osiaflow\library\Zend\Controller\Dispatcher\Standard.php(262): Zend_Controller_Dispatcher_Standard->loadClass('IndexController')
#1 C:\www\osiaflow\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#2 C:\www\osiaflow\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#3 C:\www\osiaflow\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#4 C:\www\osiaflow\public\index.php(38): Zend_Application->run()
#5 {main}  
Request Parameters:
array (
  'module' => 'albums',
  'controller' => 'index',
  'action' => 'index',
)

Je sais pas si il y a une autre solution pour lancer un autre module avant de passer par celui par défaut.

Cdt

Dernière modification par Hannibal (29-11-2010 08:50:25)

Hors ligne

 

#2 19-11-2010 17:47:03

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: Application Modulaire: definir un module par defaut autre que DEFAULT

Hors ligne

 

#3 22-11-2010 12:56:01

Hannibal
Nouveau membre
Date d'inscription: 19-11-2010
Messages: 6

Re: Application Modulaire: definir un module par defaut autre que DEFAULT

probitaille a écrit:

http://framework.zend.com/manual/en/zend.controller.modular.html

Merci pour ta réponse,

J'ai essayé cette solution, mon bootstrap :

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
     protected function _initDefaultNamespace()
    {       
        
          $front = Zend_Controller_Front::getInstance();
    $front->setDefaultModule('albums');
        
    $moduleLoader = new Zend_Application_Module_Autoloader(array(
                'namespace' => '', // pas de namespace
                'basePath'  => APPLICATION_PATH
            ));
    
            return $moduleLoader;
    }
}

donc il lance bien mon module albums avec /public/index.php mais ça m'a obligé à créer un IndexController.php pour le module albums sans 'Albums_'

Code:

class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        /* Initialize action controller here **/
        $this->view->headTitle('Mon application avec Zend_Application (Utilisateur par défaut)');
    }

    public function indexAction()
    {
        // action body
        $albums = new Albums_Model_DbTable_Albums();
        $this->view->albums = $albums->fetchAll();
    }
.....

et la suite affiche une erreur :

Code:

Fatal error: Class 'Albums_Model_DbTable_Albums' not found in C:\www\osiaflow\application\modules\albums\controllers\IndexController.php on line 14

Hors ligne

 

#4 22-11-2010 22:05:43

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: Application Modulaire: definir un module par defaut autre que DEFAULT

J'ai fait une recherche lorsque je suis tomber sur le même problème que toi, et la seule chose que j'ai trouver était de faire un bootstrap pour chaque module afin de régler des paramètres spécigiques:

Code:

class Albums_Bootstrap extends Zend_Application_Module_Bootstrap

{
    /**
     * Bootstrap autoloader for application resources
     * 
     * @return Zend_Application_Module_Autoloader
     */
     
    protected function _initAppAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Albums',
            'basePath' => dirname(__FILE__),
        ));
        return $autoloader;
    }
 
    protected function _initModule()
    {
        
    }

}

Ce bootstrap.php ce trouverai donc dans "C:\www\osiaflow\application\modules\albums\"

Il te permet de spécifié le NameSpace que tu veux donner à test fichiers "Ex: Albums_IndexController"

Pour l'instant, mon application fonctionne de cette façon mais j'ai trouvé un défault dans le profilage de mon code.
Si je suis dans le module ex: "Albums_IndexController", l'autoloader va quand même aller vérifier dans TOUS les modules s'il y a pas un "Albums_IndexController". Ce qui rend l'application plus lourd, avec l'augmentation de module et de fichiers.

Je n'ai pas trouvé d'alternative pour le moment.

Attention, il y a une répercution sur les ressources ACL également. Tu devras les définir comme ceci: "Albums_index" (module_controller) et ce pour chaque controller de l'application. (Là aussi je cherche une meilleure méthode)

Dernière modification par probitaille (22-11-2010 22:07:53)

Hors ligne

 

#5 23-11-2010 09:03:09

Hannibal
Nouveau membre
Date d'inscription: 19-11-2010
Messages: 6

Re: Application Modulaire: definir un module par defaut autre que DEFAULT

Je viens de tester ta solution,

j'ai changé mon Bootstrap avec ton code sans modifier le nom de controller comme tu me l'as dit ici

Attention, il y a une répercution sur les ressources ACL également. Tu devras les définir comme ceci: "Albums_index" (module_controller) et ce pour chaque controller de l'application. (Là aussi je cherche une meilleure méthode)

le module que j'ai défini par défault me donne la même erreur plus haut et les autres modules fonctionnent.

et si je modifie les controleurs par Albums_IndexController.php

ça me donne :

Code:

Message: Invalid controller specified (index) 

Stack trace:
#0 C:\www\osiaflow\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 C:\www\osiaflow\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#2 C:\www\osiaflow\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#3 C:\www\osiaflow\public\index.php(46): Zend_Application->run()
#4 {main}  Request Parameters:
array (
  'module' => 'albums',
  'controller' => 'index',
  'action' => 'index',
)

Je vois pas quoi j'ai raté pour que ça marche comme chez toi?!

Merci

Hors ligne

 

#6 23-11-2010 17:30:28

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: Application Modulaire: definir un module par defaut autre que DEFAULT

Hum, pourtant, ton erreur indique qu'il cherche bien dans module albums le controller Index....

Essaie ceci dans ton controller principal :

Code:

// Recuperation d'une instance du controleur frontal (singleton)
$frontController = Zend_Controller_Front::getInstance();

$frontController->addModuleDirectory(APPLICATION_PATH.'/modules');

Si vraiment ça fonctionne pas, tu peux définir clairement tes répertoires de controllers...par contre, c'est pas l'idéal car ça enlève de la flexibilité à ton application (Il reconnait pas automatique tes controllers) :

Code:

$frontController->setControllerDirectory(array(
    'default' => APPLICATION_PATH .'/modules/default/controllers/',
    'albums'    => APPLICATION_PATH .'/modules/albums/controllers/'
));

Update : Génère un erreur dans ton Albums_Bootstrap pour voir s'il arrive à le lire vraiment ?

Dernière modification par probitaille (23-11-2010 17:31:25)

Hors ligne

 

#7 24-11-2010 08:42:48

Hannibal
Nouveau membre
Date d'inscription: 19-11-2010
Messages: 6

Re: Application Modulaire: definir un module par defaut autre que DEFAULT

J'ai rajouté les lignes comme tu me l'as dit,

J'ai enlevé un point-virgule dans albums_bootstrap, ça me fait une erreur :

Code:

Parse error: syntax error, unexpected '}' in C:\www\osiaflow\application\modules\albums\Bootstrap.php on line 17

et si je change le nom de la fonction IndexAction dans Index_controller de Albums, ça provoque une erreur si je mets ça :

Code:

class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        /* Initialize action controller here **/
        $this->view->headTitle('Mon application avec Zend_Application (Utilisateur par défaut)');
    }

    public function ndexAction()
    {
        // action body
        //$this->_response->appendBody('Bievenue');
        $albums = new Albums_Model_DbTable_Albums();
        $this->view->albums = $albums->fetchAll();
    }

Code:

Exception information:
Message: Action "index" does not exist and was not trapped in __call()

et si je provoque la même erreur dans la classe "Albums_IndexController",  ça me donne le même souci de controller introvable :

Code:

Message: Invalid controller class ("IndexController")

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