Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-04-2009 11:00:01

wam_baloo
Nouveau membre
Date d'inscription: 28-04-2009
Messages: 8

MVC personnalisé

Bonjour,

nouvel utilisateur du Zend Framework dans un cadre professionnel, j'ai pour tâche la réalisation d'un projet relativement complexe.

Pour respecter les normes de développement de l'entreprise et respecter aussi la structure de l'application imposée, voici les contraintes que je n'arrive pas à résoudre :
    - structure modulaire :
application/
    modules/
        module1/
            controleur.php
            vues/
        module2/
            controleur.php
            vues/

Voici la structure à respecter. Il faut aussi que le nom des actions de chaque contrôleur ne porte pas de suffixe (suffixe "Action" par défaut dans le Zend Framework). Il faut aussi que le nom des fichiers contrôleurs soit toujours le même, soit "controleur.php", et que le nom de la classe du contrôleur (par défaut ici "Modules1_IndexController") soit tout simplement conforme à ceci : "Module1Controller".

J'ai regardé dans la documentation Zend, et également directement les fichiers de codes du Front_Controller de Zend, et la seule solution que j'ai trouvé pour répondre à mes attentes est de modifier directement cette partie de la librairie Zend (méthodes "formatControllerName" et "formatActionName" de la classe abstraite "Zend_Controller_Dispatcher_Abstract").

Cela m'ennuie de modifier la librairie Zend pour des questions de maintenabilité ultérieur (en cas de mise à jour du framework par exemple). Je pense qu'il doit exister des méthodes de paramétrage pour ce cas mais je ne les ai pas trouvé.

Merci par avance pour l'aide que vous pourrez m'apporter.

Hors ligne

 

#2 28-04-2009 16:51:51

Djules
Membre
Date d'inscription: 29-03-2009
Messages: 52
Site web

Re: MVC personnalisé

Vois la section 12.11. Utilisation de conventions de dossiers modulaires de la doc, tu trouveras surement les méthodes de re-nommage des controllers, modules, etc ...

Hors ligne

 

#3 28-04-2009 17:01:33

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: MVC personnalisé

il faut surcharger le dispatcher

par contre si tu ne mets pas Action dans tes action et que tu n emets rien toutes les méthodes publique de ta classe controller seront exposées comme action donc impossible d'avoir des méthode de travail partagées par plusieurs action et contrôleurs

A+JYT

Hors ligne

 

#4 29-04-2009 11:56:03

wam_baloo
Nouveau membre
Date d'inscription: 28-04-2009
Messages: 8

Re: MVC personnalisé

Merci pour cette réponse. En effet, j'ai surchargé le dispatcher et ça fonctionne à merveille. J'ai un dernier petit souci cependant. Mon application n'affiche que le template du module défaut. Il passe bien par mon action, mais n'affiche pas son template mais le template du module défaut.

Ce que j'aimerai faire, c'est récupérer dans mon index.php le nom du module appelé. J'ai essayé la méthode suivante :

Code:

$moduleName = $frontController->getRequest()->getModuleName();

Mais il m'affiche un message comme quoi j'appelle la méthode "getModuleName" sur un non-objet.

Comment puis-je récupérer le nom de mon module appelé dans mon index ?

Hors ligne

 

#5 29-04-2009 12:33:52

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: MVC personnalisé

Bonjour,

Dans ton index (bootstrap je suppose) tu ne peux pas encore connaitre le module appelé via Zend, seulement à la Mano en fonction de l'url.

Tu peux le faire qu'à partir du moment où le dispatcher du frontcontroller a commencé son boulot. Via un plugin de controlleur par exemple, dans lequel tu pourras connaitre les infos nécessaires durant toutes les phases du dispatching.

J'ai pas trop de temps là pour donner plus de détails, tu devrais trouver toutes les infos nécessaires sur les plugins dans les forums ou dans la doc ZF.



A+ benjamin.

Dernière modification par Delprog (29-04-2009 12:35:38)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#6 29-04-2009 14:57:26

wam_baloo
Nouveau membre
Date d'inscription: 28-04-2009
Messages: 8

Re: MVC personnalisé

Je suis en train d'écrire mon plugin mais j'ai encore quelques petits soucis. Voici le code de mon plugin :

Code:

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

class Wsa_Controller_Plugin_AutoView extends Zend_Controller_Plugin_Abstract {

    public function __construct() {
    }

    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        if (null === $viewRenderer->view) {
            $viewRenderer->initView();
        }
        $view = $viewRenderer->view;
        $view->addScriptPath(MODULE_DIR . DIRECTORY_SEPARATOR . $request->getModuleName() . DIRECTORY_SEPARATOR . 'vues');
    }
}

Et voici le code de mon index (pas encore découpé en bootstrap pour l'instant) :

Code:

$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new Wsa_Controller_Plugin_AutoView);
$frontController->setDispatcher(new Wsa_Controller_Dispatcher_Standard);

$frontController->setModuleControllerDirectoryName('');
$frontController->addModuleDirectory(MODULE_DIR);

Zend_Layout::startMvc(array(
                        'layoutPath' => APP_DIR . DIRECTORY_SEPARATOR . 'vues',
                        'layout' => 'index'
                            )
                        );

$view = new Zend_View(); // Initialisation de la vue principale
//$view->setScriptPath(MODULE_DIR . DIRECTORY_SEPARATOR . 'default' . DIRECTORY_SEPARATOR . 'vues'); // repertoire par défaut des vues
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
$viewRenderer->setView($view)
             ->setViewBasePathSpec(':moduleDir/vues') // facultatif => comportement par défaut
             ->setViewScriptPathSpec(':action.:suffix')// par défaut : :controller/:action.:suffix
             ->setViewScriptPathNoControllerSpec(':controller/:action.:suffix') // facultatif => comportement par défaut
             ->setResponseSegment('body');
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

$frontController->throwExceptions(true);

// run!
$frontController->dispatch();

Ca pourrait presque fonctionner sauf que ça a exactement le même comportement qu'à la base, ça affiche toujours le template du module défaut sad

Si je suis passé à côté de quelque chose de gros comme une maison, merci de me faire signe !

Hors ligne

 

#7 29-04-2009 15:02:52

wam_baloo
Nouveau membre
Date d'inscription: 28-04-2009
Messages: 8

Re: MVC personnalisé

C'est bon j'ai trouvé smile Il suffisait tout simplement de supprimer les trois lignes suivantes pour laisser le comportement de ZF par défaut :

Code:

->setViewBasePathSpec(':moduleDir/vues') // facultatif => comportement par défaut
->setViewScriptPathSpec(':action.:suffix')// par défaut : :controller/:action.:suffix
->setViewScriptPathNoControllerSpec(':controller/:action.:suffix') // facultatif => comportement par défaut

Voilou si ça peut aider...

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