2010-06-27 6 views
3

Comment puis-je transférer vers une autre action à l'intérieur du même contrôleur en évitant de répéter tout le processus d'expédition?Zend Framework _forward vers une autre action à l'intérieur du même contrôleur

Exemple: Si point i à l'utilisateur Contrôleur l'action par défaut est indexAction() dans ce funciton j'utilise _forwad ('list') ... mais tout proccess d'expédition sont répétées .. et je ne que

Quel est le bon chemin?

Répondre

6

Habituellement, vous allez installer des routes pour rediriger vos utilisateurs vers l'action correcte (par défaut), au lieu de l'action d'index (lisez comment rediriger depuis un itinéraire donné en utilisant Zend_Router). Mais vous pouvez tout faire manuellement si vous voulez vraiment (mais cela s'appelle "écrire le code pirate pour réaliser quelque chose de sale") directement à partir du contrôleur.

Changer votre « script de vue » à rendre, appelez votre méthode d'action ....

// inside your controller... 
public function indexAction() { 
    $this->_helper->viewRenderer('foo'); // the name of the action to render instead 
    $this->fooAction(); // call foo action now 
} 

Si vous avez tendance à utiliser ce « truc » souvent, peut-être vous pouvez écrire un contrôleur de base que vous étendre dans votre application, qui peut simplement avoir une méthode comme:

abstract class My_Controller_Action extends Zend_Controller_Action { 
    protected function _doAction($action) { 
     $method = $action . 'Action'; 
     $this->_helper->viewRenderer($action); 
     return $this->$method(); // yes, this is valid PHP 
    } 
} 

appeler ensuite la méthode de votre action ...

class Default_Controller extends My_Controller_Action 
    public function indexAction() { 
     if ($someCondition) { 
     return $this->_doAction('foo'); 
     } 

     // execute normal code here for index action 
    } 
    public function fooAction() { 
     // foo action goes here (you may even call _doAction() again...) 
    } 
} 

NOTE: ce n'est pas la manière officielle de le faire, mais est une solution.

0

Si vous ne voulez pas re-dispatch il n'y a aucune raison que vous ne pouvez pas simplement appeler l'action - c'est juste une fonction.

class Default_Controller extends My_Controller_Action 
{ 
    public function indexAction() 
    { 
     return $this->realAction(); 
    } 

    public function realAction() 
    { 
     // ... 
    } 
} 
0

Vous pouvez également créer un itinéraire. Par exemple, j'ai dans mon /application/config/routes.ini une section:

; rss 
routes.rss.route    = rss 
routes.rss.defaults.controller = rss 
routes.rss.defaults.action  = index 

routes.rssfeed.route    = rss/feed 
routes.rssfeed.defaults.controller = rss 
routes.rssfeed.defaults.action  = index 

Maintenant, vous seulement besoin d'une action et qui est l'action d'index, mais le flux RSS/requess va également là.

public function indexAction() 
{ 
    ... 
} 
+1

Non merci, je veux rediriger du contrôleur, des itinéraires avant utilisés ... – ovitinho

1

Nous pouvons utiliser également cette aide pour rediriger

$this->_helper->redirector->gotoSimple($action, $controller, $module, $params); 

    $this->_helper->redirector->gotoSimple('edit'); // Example 1 

    $this->_helper->redirector->gotoSimple('edit', null, null, ['id'=>1]); // Example 2 With Params 
Questions connexes