2011-02-01 6 views
2

zendを使用して複数ステップタイプのフォームを作成する方法を教えてください。これは私がやろうとしていることです。中間ステップを持つZendフォーム、通常のコードを変更する方法

通常、私はフォームを持っています、ユーザーはフォームを塗りつぶします。フォームが提出(投稿)され、有効であれば、私は最終的な行動を行います(データベースやその他のものに追加します)。

public function indexAction(){ 
    $form = new Application_Form_Test(); 

    if(form is valid){ 
     //do the final thing.. add to the database or whatever 
    } 
    $this->view->form = $form; 
} 

私がしたいのは、中間ステップを挿入することです。ユーザーがフォームを送信すると、すぐにデータベースに挿入したくありません。私は最初にいくつかの追加データを計算し、入力したばかりの入力に加えて計算されたデータをユーザーに表示し、確認ボタンを表示したいと思います。ユーザーがsubmitを押すと、データベースに追加する最後のことを行います。そうしないと、操作全体がキャンセルされます。だから、誰かがクレイジーなハッキングをしないでこれを行う簡単な方法を考えることができますか?

+1

を使用して、いくつかのCSRF保護が含まれている必要があり、通常のGETリクエスト

  • 上のセッション・ネームスペースアウト、おそらくクリアする必要がありますコミットする準備が整うまで、データを収集してセッションに格納します。ガイド[here](http://framework.zend.com/manual/en/zend.form.advanced.html)は非常に冗長ですが、あなたに考えを与えるべきです – Phil

  • +1

    http://で複数ページのフォームを見てくださいframework.zend.com/manual/en/zend.form.advanced.html。 – Marcin

    答えて

    7

    あなたの問題を克服する方法の草案を作成しました。基本的には、2つのアクション(indexActionとindex2Action)とセッションが必要です。

    indexAction

    public function indexAction() { 
        $form = new Application_Form_Test(); 
    
        if ($this->getRequest()->isPost()) { 
         if ($form->isValid($_POST)) { 
    
          // calculate some additional data 
          $calculatedData = someCalulations(); 
    
          // if form is valid than save submitted and calculated data in a session 
          $addAccInfoNamespace = new Zend_Session_Namespace('data'); 
          $addAccInfoNamespace->postData = $form->getValues(); 
          $addAccInfoNamespace->calculatedData = $calculatedData; 
          $addAccInfoNamespace->lock(); 
    
          // and redirect to the second stage (or middle stage) 
          return $this->_redirect('index/index2'); 
         } 
        } 
        $this->view->form = $form; 
    } 
    

    index2Action

    public function index2Action() { 
    
         // retrieve data saved in the first stage (indexAction). 
         $sessionData = new Zend_Session_Namespace('data'); 
    
         if (null === $sessionData->postData || null === $sessionData->calculatedData) { 
          // if no data go to index, or throw execption or whatever. 
          return $this->_redirect('index/index'); 
         } 
    
         // get the data 
         $oldPostData = $addAccInfoNamespace->postData; 
         $calculatedData = $sessionData->calculatedData; 
    
         // form that only shows cunfirmation button 
         // However, if you want to show data in this form, that you need to 
         // populate Application_Form_Test2 with whatever data you want. 
         $form = new Application_Form_Test2(); 
    
    
         if ($this->getRequest()->isPost()) { 
          if ($form->isValid($_POST)) { 
    
           if (!$form->confirm->isChecked()) { 
            // if confirm submit button was NOT clicked go to e.g. index 
            // This may mean that ,e.g. cancel submit button was click. 
            return $this->_redirect('index/index'); 
           } 
    
    
           //do the final thing.. add to the database or whatever 
    
    
           // don't need this session namespace anymore 
           Zend_Session::namespaceUnset('data'); 
    
           // and redirect to e.g. success confirmation page 
           return $this->_redirect('index/success'); 
          } 
         } 
    
         // show confirmation button and additional calculated data 
         $this->view->calculatedData = $calculatedData; 
         $this->view->form = $form; 
        } 
    

    あなたはどう思いますか?ここで

    +3

    うわー、それは私たちがそこに数分間頭脳を共有したようなものです: – Phil

    +0

    @Phil Brown。私は気づきました :-)。しかしそれは良いです。これは、OPが達成しようとしていることを行う方法であることを示唆しています。 – Marcin

    +0

    @jblue。助けてくれてありがとうと嬉しいです。 – Marcin

    4

    が、私はそれを行うだろう方法です...

    1. は、2つのコントローラのアクションを作成し、のは「stepOneAction」と「stepTwoAction」と呼んでみましょう。
    2. stepOneActionはフォームをインスタンス化して検証します(POST時)。検証に成功すると、セッション・ネーム・スペースにフォーム・データ($form->getValues())を格納し、stepTwoActionにリダイレクトします。
    3. stepTwoActionはフォーム・データをセッションから取り出し、表示します。このビューには、stepTwoActionに送信する2つのボタン(「確認」と「キャンセル」)を持つ小さなフォーム(Zend_Formでもかまいません)が含まれています。
    4. また、stepTwoActionでは、POST要求をチェックし、セッション名前空間をクリアし、押されたボタンをチェックしてそれに応じて動作します。

    いくつかの余分な配慮

    • stepOneActionはどちらの形式は、おそらく一般的な考え方があるZend_Form_Element_Hash
    関連する問題