2010-08-31 2 views
1

C'est une chose assez basique, mais je ne peux pas comprendre comment résoudre ce "correctement" avec Zend Framework:

Scénario:

  1. page affiche formulaire 1,
  2. Page Formulaire d'affichage 2

C'est une chose assez basique, mais je ne peux pas comprendre comment résoudre ce « correctement » avec Zend Framework:

S cenario:

  1. page affiche formulaire 1,
  2. page affiche formulaire 2
 
class FooController extends Zend_Controller_Action { 
    ... 
    public function form1Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form1 in database 
      $this->_forward('form2'); 
     } 
     // display form1 
    } 
    public function form2Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form2 in database 
      $this->_forward('somewherelese'); 
     } 
     // display form2 
    } 
} 

Lorsque les messages de l'utilisateur form1, d'abord le si condition dans form1Action est exécuté (ce qui est ce que je veux), mais aussi la condition if dans form2Action.

Quelle serait la bonne façon de "désinstaller $ this-> getRequest() -> isPost()"?

Note: les formes sont construites "à la main" (ne pas utiliser Zend Form)

+0

Vous ne devriez pas utiliser 'isValid()' à un moment donné? Cela devrait vous empêcher de traiter les données dans form2 lorsque form1 est POSTed, à moins bien sûr qu'ils soient exactement les mêmes. Ou utilisez les formulaires multi-pages de Zend, documentés ici http://framework.zend.com/manual/fr/zend.form.advanced.html –

+0

C'est parfaitement logique, mais dans ce cas les formulaires sont construits "à la main", ie ne pas utiliser Zend_Form ... – jamie0725

Répondre

4

Vous avez trois options:

  1. Utilisation _redirect au lieu de _forward. Redirections directes sous la même requête. Redirect va créer une nouvelle requête. '
  2. Définir un param dans votre appel _forward, que vous pouvez vérifier dans votre deuxième forme: tel que 'form' => 2.More information.
  3. Utilisez les built in multipage forms qui sont inclus dans Zend_Form hors de la boîte.
+0

C'est comme ça que je l'ai résolu pour le moment, mais je ne suis pas satisfait de cette solution car créer une nouvelle requête signifie plus de stress pour le serveur.Je voudrais éviter cela .. :-) – jamie0725

+0

J'ai mis à jour ma réponse pour inclure une nouvelle option. Option # 2 qui fournira une solution pour vous si vous voulez toujours utiliser _forward. – balupton

0

Vous pouvez toujours définir une variable de classe dans l'action un et si elle est vraie, n'exécutez pas le code dans l'action deux.

Quelque chose comme:

class FooController extends Zend_Controller_Action { 
private $_fromAction1 = false; 
    ... 
    public function form1Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form1 in database 
$this->_fromAction1 = true; 
      $this->_forward('form2'); 
     } 
     // display form1 
    } 
    public function form2Action(){ 
     if ($this->getRequest()->isPost() && !$this->_formAction1) { 
      // save data from form2 in database 
      $this->_forward('somewherelese'); 
     } 
     // display form2 
    } 
} 
0

Cette dernière option ne fonctionne pas pour moi.

$ this -> _ forward() crée une nouvelle instance du contrôleur, donc la définition d'une variable dans la première instance n'affecte pas celle du nouveau.

Ma solution rendait $ _fromAction1 static pour partager la variable entre les deux instances.

class FooController extends Zend_Controller_Action { 
private static $_fromAction1 = false; 
    ... 
    public function form1Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form1 in database 
FooController::_fromAction1 = true; 
      $this->_forward('form2'); 
     } 
     // display form1 
    } 
    public function form2Action(){ 
     if ($this->getRequest()->isPost() && !FooController::_formAction1) { 
      // save data from form2 in database 
      $this->_forward('somewherelese'); 
     } 
     // display form2 
    } 
}