Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je débute avec Zend et j'ai un petit problème. Dans un controleur, j'aimerai appeler une méthode d'un autre controleur. Voici mon code :
class MusicienController extends Zend_Controller_Action { public function initAction(){ $this->_forward('deb', 'index',null); // code html <head>...</head><body> $this->render('init'); // contenu de ma page $this->_forward('fin', 'index', null); // code de fin </body></html> } }
J'essaye donc d'appeler les methodes 'deb' et 'fin' de mon controleur 'index' alors que je suis dans le controleur 'Musicien'. Mais ça ne fonctionne pas, j'obtiens cette erreur :
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in C:\Program Files\ZendFramework-1.5\Zendlibrary\Zend\Controller\Dispatcher\Standard.php:198 Stack trace: #0 C:\Program Files\ZendFramework-1.5\Zendlibrary\Zend\Controller\Front.php(927): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\Program Files\ZendFramework-1.5\Zendlibrary\Zend\Controller\Front.php(223): Zend_Controller_Front->dispatch() #2 C:\Documents and Settings\antoine\Mes documents\workspace\MusicContact\html\index.php(4): Zend_Controller_Front::run('../application/...') #3 {main} thrown in C:\Program Files\ZendFramework-1.5\Zendlibrary\Zend\Controller\Dispatcher\Standard.php on line 198
Mais quand j'inverse l'appel des 'forward' ça fonctionne :
public function initAction(){ $this->render('init'); $this->_forward('fin', 'index', null); $this->_forward('deb', 'index',null); }
Mais le code de la page générée ne correspond pas à ce que je veux obtenir....quelqu'un à une explication à me donner? ou alors je suis pas assez bon pour le Framework MVC de Zend?
J'avais cru comprendre que l'appel à des 'forward' ajoutait à la réponse html tous les segments de code générés par les différentes méthodes appelées...
Merci,
a+
Hors ligne
Par défault le zf inclus un plugin error_handler qui s'il y'a a des erreurs internes (exceptions) appel un ErrorController qui devrait être présent par default. (cherche là: http://framework.zend.com/manual/fr/zen … ugins.html)
C'est pour ça que ton erreur contient : 'Invalid controller specified (error)'
Alors tu peux le créer avec l'action error, mais ça ne résoudra pas ton problème.
Si tu veux voir la vrai erreur il faut spécifié à ton front controller de remonter les exceptions pour que tu puisse la voir: $frontConttroller->throwExceptions(true) qui n'est pas activé par default (puisqu'il y'a la le plugin de gestion d'erreurs).
Hors ligne
ok, merci pour la réponse...mais ca ne marche toujours pas. Voici maintenant le code que je tape :
class MusicienController extends Zend_Controller_Action { public function initAction(){ // $this->_forward('deb', 'index',null); //la vue contient <html><head></head><body> $this->render(); // doit afficher "bonjour" $this->_forward('fin', 'index', null); //la vue contient </body></html> } }
la page retournée contient bien le code html de 'deb' et de 'fin' mais pas le code "bonjour" de la méthode 'init'...donc $this->render() ne renvoie rien, ne fonctionne pas?
et je n'ai plus de message d'erreur...
Bon, je dois pas avoir tout compris...mais entre le pre dispatch, post dispatch, le request....je suis un peu paumé ....
merci si vous avez une idée/réponse,
a+
Hors ligne
Je ne pense pas que l'utilisation de _forward() soit une bonne idée pour la gestion du header/footer.
Regarde du côté de Zend_Layout ou encore des plugins.
Hors ligne
merci, j'avais noté qu'il y avait mieux pour gérer les header et footer
Mais si on ne se focalise pas sur le contenu des méthodes 'deb' et 'fin', comment on fait pour recomposer une page html à partir de plusieurs méthodes de plusieurs controler?
a+
Hors ligne
Zend_Layout comme j'ai dis plus haut. Dispo dans la version 1.5 (en preview non stable).
Je te conseille de voir sur le SVN du zf ou de prendre la dernière snapshot.
Hors ligne
Oui appeler deux fois _forward de suite n'a pas de sens logique.
_forward() ne fait que modifier la requête pour le prochain jeton de dispatching, il n'execute pas la requête directement.
Donc un appel à _forward('foo');
Puis plus bas dans la même action _forward('bar'); va écraser l'appel précédent.
Ce n'est qu'en fin d'action que la requête est redispatchée avec un nouveau jeton.
Hors ligne