2009-12-05 4 views
3

Je souhaite afficher une page comportant 2 formulaires. Le formulaire supérieur est unique à cette page, mais le formulaire inférieur peut déjà être rendu à partir d'un autre contrôleur. J'utilise le code suivant pour appeler l'action de l'autre forme, mais continuer à obtenir cette erreur:Contrôleurs ZEND - Comment appeler une action d'un contrôleur différent

 
"Message: id is not specified" 

#0 .../library/Zend/Controller/Router/Rewrite.php(441): Zend_Controller_Router_Route->assemble(Array, true, true) 

Mon code:

Premier contrôleur:

abc_Controller 
public function someAction() 
{ 

    $this->_helper->actionStack('other','xyz'); 

} 

Deuxième contrôleur:

xyz_Controller 
public function otherAction() 
{ 
// code 
} 

Résultats souhaités:

Lorsque j'appelle/abc/some, je veux rendre le contenu "some" avec le contenu xyz/other. Je pense que j'ai suivi le document correctement (http://framework.zend.com/manual/en/zend.controller.actionhelpers.html) mais je ne trouve aucune aide sur la raison de cette erreur. Quand je trace le code (en utilisant XDebug), l'action xyz/other se termine bien mais quand l'action abc/some arrive à la fin, l'erreur est lancée quelque part pendant le dispatch ou le routage.

Toute aide est grandement appréciée.

+1

Le ActionStack helper vous permet d'envoyer des requêtes au plug-in du contrôleur frontal d'ActionStack, vous aidant ainsi à créer une file d'actions à exécuter pendant la requête. L'assistant vous permet d'ajouter des actions en spécifiant de nouveaux objets de requête ou des ensembles de modules d'action-contrôleur. http://framework.zend.com/manual/fr/zend.controller.plugins.html#zend.controller.plugins.standard.actionstack – tawfekov

+0

les params pour _helper-> actionStack() sont les suivants: public function direct ($ action, $ controller = null, $ module = null, tableau $ params = array()) – max4ever

Répondre

1

Vous pouvez créer un nouvel objet avec le second contrôleur et appeler sa méthode (mais ce n'est pas la meilleure solution).

Vous pouvez étendre votre premier contrôleur avec le second et appeler le $this->methodFromSecond(); - il affichera également la deuxième forme avec son modèle.

BTW - quel type de code voulez-vous exécuter dans les deux contrôleurs?

+0

En fait, créer le deuxième contrôleur du premier contrôleur était ma première tentative. Il renvoie exactement la même erreur. Comme pour l'exécution, le premier contrôleur rend un formulaire simple - une seule zone de texte (nombre d'articles à acheter), le second contrôleur appelle l'autre formulaire (un formulaire de carte de crédit utilisé dans d'autres parties du système). – user225195

+0

Utilisez-vous Zend_Form? Si oui, vous pouvez en créer des objets dans les deux contrôleurs et les pousser dans la vue. C'est propre. Si vous voulez les traiter de la même manière (vérifiez si elles sont valides, mettez à jour dans la base de données, etc.), vous devriez faire en sorte que les assistants soient étendus avec 'Zend_Controller_Action_Helper_Abstract' pour chacun d'entre eux. En eux, vous pouvez faire tout ce que vous faites dans les contrôleurs. J'espère que je l'ai expliqué clairement. ;) – hsz

+0

Oui, j'utilise Zend_Form sur les deux contrôleurs. J'ai essayé de créer les objets explicitement au lieu d'utiliser le _helper-> actionStack mais les résultats sont les mêmes. Je pense que cela doit avoir à voir avec mes routes. Je vérifie ça maintenant. – user225195

3

Vous pouvez accomplir ceci dans votre phtml pour votre someAction. Donc, dans some.phtml mettre <?php echo $this->action('other','xyz');?> cela rendra la forme trouvée dans l'autreAction de XyzController

+0

J'ai essayé cela aussi. Même erreur exacte Il est étrange que 3 approches différentes aient toutes la même erreur. Je me demande si cela a à voir avec mon fichier de configuration de routes: routes.abc.route = "abc/buy /: id/*" routes.abc.defaults.controller = "traiter" routes.abc.defaults. action = "acheter" routes.abc.reqs.id = "\ d +" – user225195

0

Juste une mise à jour. L'erreur n'avait absolument rien à voir avec la manière dont l'action était appelée depuis le second contrôleur. Il se trouve que dans la mise en page du second contrôleur, il y avait un appel phtml séparé qui a été jeter l'erreur (mise en page/abc.phtml):

ligne
<?php echo $this->render('userNavigation.phtml') ?> 

d'erreur:

echo $this->navigation()->menu()->renderMenu(...) 

I Je vais débugger cela séparément pour ne pas boueux ce fil.

Merci à Akeem et hsz pour la réponse rapide. J'ai appris de vos réponses.

Pour résumer, il y avait 3 différentes façons d'appeler une action d'un contrôleur externe:

  1. instancier le second contrôleur du premier contrôleur et appeler l'action. ?
  2. Utilisez $ this -> _ helper-> ActionStack
  3. Dans le phtml du premier contrôleur, l'action ('autre', 'xyz');> (comme Akeem a souligné ci-dessus)

Espoir cela aide d'autres Zend noobs là-bas.

3

L'envie de faire quelque chose comme ceci est une indication que vous allez à ce sujet dans le mauvais sens. Si vous avez l'envie de réutiliser du contenu, il devrait probablement appartenir au modèle. S'il s'agit vraiment d'un code de contrôleur, il doit être encapsulé par un plugin de contrôleur d'action

0

Hm Je ne trouve pas et je ne vois pas pourquoi vous avez besoin d'utiliser différents contrôleurs pour une vue. Une meilleure pratique consiste à avoir tout en un contrôleur. J'utilise ceci comme dans cet exemple

DemoController extends My_Controller_Action() { 
.... 
public function indexAction() { 
    $this->view->oForm = new Form_Registration(); 
} 
} 

My_Controller_Action extends Zend_Controller_Action() { 
    public function init() { 
     parent::init(); 
     $this->setGeneralStuf(); 
    } 

    public function setGeneralStuf() { 
     $this->view->oLoginForm = new Form_Login(); 
    } 
} 
2

Dans le fichier phtml, vous pouvez utiliser $ this-> action(); pour rendre la page et que la réponse serait ajouté à la réponse actuelle ..

La syntaxe d'action est comme suit ::

public function action($action, $controller, $module = null, array $params = array()) 
0

Ce genre de définition d'itinéraire:

routes.abc.route = "abc/buy/:id/*" 
routes.abc.defaults.controller = "deal" 
routes.abc.defaults.action = "buy" 
routes.abc.reqs.id = "\d+" 

nécessite une paramètre afin de fonctionner. Vous pouvez le faire avec ActionStack mais vous pouvez également spécifier un identifiant par défaut dans le cas où aucun n'est fourni:

$this->_helper->actionStack('Action', 
          'Controller', 
          'Route', 
          array('param' => 'value') 
); 


routes.abc.defaults.id = "1" 
0

Pour moi, cela a fonctionné comme un charme

class abcController extends Zend_Controller_Action 
    { 
     public function dashBoardAction() 
     { 
      $this->_helper->actionStack('list-User-Data', 'xyz'); 
     } 
    } 

    class XyzController extends Zend_Controller_Action { 
     public function listUserDataAction() 
     { 
      $data = array('red','green','blue','yellow'); 
      return $data; 
     } 
    } 
Questions connexes