2009-03-25 10 views
1

リダイレクト(たとえば、$ this - > _ redirect-> gotoSimple();)を実行した後で、追加の表示パラメータを送信するにはどうすればよいですか?Zend:リダイレクト後にビュー変数を送信することはできますか?

たとえば、ユーザーにエラーアクションハンドラをリダイレクトする編集アクションがあり、カスタムの詳細なエラーメッセージをそのビューに送信したいとします。それは明確に説明するために、フローは次のようになります。編集ビューで

  1. (たとえば、http://localhost/product/edit)、ユーザーが)editAction(AT
  2. 厄介な何かを提出し、チェックに失敗は私のエラービューにリダイレクトをトリガー/アクションハンドラ(私のURLはhttp://localhost/error/indexのようになります)
  3. エラー/ index.phtmlはカスタムエラーメッセージを表示するために "errorMessage"ビュー変数を受け取り、editAction()はその値を " errorMessage "ビュー変数

クイックコードスニペットは、おそらく次のようになります。

public function editAction() { 
    //DO THINGS... 

    // Upon failure 
    if($fail) { 
     $this->_redirector->gotoUrl('/error/index'); 
     //TODO: I need to be able to do something like 
     //  $errorView->errorMessage = "Generic error"; 
    } 
} 

どれソリューション、またはこれを達成するも、他のより良い方法を、非常に高く評価されます。

答えて

4

アクション(editAction)が別のアクションのビュー(errorView)にアクセスする場所は見たことがありません。エラー処理の特別な場合、私の考えは例外を使用しています。あなたは別の悪い状況に異なる例外をスローし、あなたのエラーハンドラのアクションで、あなたは、例外の種類に基づいて、ユーザに表示するように決めることができます。

// file: ProductContorller.php 
public function editAction() { 
    // some code 
    if ($badThing) { 
     throw new Exception('describe the bad thing',$errorCode); 
    } 
    if ($badThing2) { 
     throw new Exception('describe the other bad thing',$errorCode2); 
    } 
} 

// file: ErrorController.php 
public function errorAction() { 
    $error = $this->_getParam('error_handler'); 
    $exception = $error->exception; // the original Exception object thrown by some code 
    $code = $exception->getCode(); 
    switch ($code) { 
      // decide different things for different errors 
    } 
} 

エラー処理の詳細については、Zend Framework quick startは素晴らしいチュートリアルです。

他の状況では、いくつかのメッセージングメカニズムを使用して、これら2つのアクション間で通信することができます。 flashMessengerアクションヘルパーを使用すると、最初は私の心に入ってくるです:

// file: ProductContorller.php 
public function editAction() { 
    // some code 
    if ($badThing) { 
     $this->_helper->flashMessenger->addMessage('error1'); 
     $this->_redirect('error'); 
    } 
    if ($badThing2) { 
     $this->_helper->flashMessenger->addMessage('error2'); 
     $this->_redirect('error'); 
    } 
} 

// file: ErrorController.php 
public function errorAction() { 
    $errors = $this->_helper->flashmessenger->getMessages(); 
    if (in_array('error1',$errors)) { 
     // do something 
    } // elseif (... 
} 

セッションと最も可能性の高いクッキーは、このメッセージングプロセスに関与することが予定されているのでflashMessengerは、セッションを使用していることを覚えているが。

5

gotoURL()を内部リダイレクトに使用しないでください。 gotoSimple()を使用してください。私は4つのまでのパラメータを取ります。

$this->_redirector->gotoSimple('index', 
           'error', 
           null, 
           array('errorMessage'=>$errMsg)); 

詳細についてはRedirector Zend_Controller_Action_Helperを参照してください:

gotoSimple($action, 
      $controller = null, 
      $module = null, 
      array $params = array()) 

あなたのケースでは可能になるだろう。

3

これを行う標準的な方法は、表示するメッセージのセッションベースのストアです。ビューベースのヘルパー、FlashMessengerがあるのは一般的です。

FlashMessengerヘルパーは、ユーザーが 次のリクエストに見せる必要のあるメッセージを渡すためにあなた ことができます。 これを達成するために、FlashMessengerは、 Zend_Session_Namespaceを使用して、 の将来のまたは次の要求のためにメッセージ を保存します。 Zend_Session またはZend_Session_Namespaceを使用する予定がある場合は、ブートストラップファイルで をZend_Session :: start() で初期化することをお勧めします。 (その使用方法の詳細 詳細については にZend_Sessionのドキュメントを参照してください。)

+0

これは、メッセージを一般的に渡す最も良い方法です。受け入れられた答えは、例外的なエラーのより具体的なケースです。 –

0

前にビュー変数を設定する方法について説明し...このリンクを通過しますこれは、FlashMessengerクラスがどのように動作するかについていくつかの情報を提供します(私はいくつかの問題を見つけ出しました)。私はセッションが私のコード..but

Zend_Session::start(); 

を使用してbootstrap.phpの中に開始する必要があることをどこかで読ん

はそのなしで働いていたので、私はセッションがすでに開始されている疑いがあります。

私たちはコントローラオブジェクトにあり、アクションメソッドが呼び出されています。そして、データベースへの挿入や編集のような何かが実際に起こります。

1つ以上のメッセージを設定するようになりました。私は次の構文を使用します。これは、セッション内のメッセージを設定し

$this->_helper->FlashMessenger->addMessage("Message in a bottle."); 

を使用するなど、まさに同じある

$this->_helper->FlashMessenger("Message in a bottle."); 

、あなたは

print_r($this->_helper->FlashMessenger->getMessages()); 
die(); 

を呼び出して直接それを確認することができます今へのリダイレクトがあります新しいURL(基本的には新しいリクエスト)、コントローラ内で+要求を処理しているアクションのように、メッセージをビューに追加します:

$this->view->flashMessages = $this->_helper->FlashMessenger->getMessages(); 

これらのメッセージの出力先を選択できるようになりました。私たちは、特定のコントローラ「に属する」という見解の内側にこれを行うことができ、そのためには、ここでの欠点は、あなたがそれを使用するすべてのviewscriptにメッセージを出力するコードを追加する必要があるだろうということです

views/scripts/index/index.phtml 

である可能性があります。それほどではないDRY

私の目では、優れた解決策は次のとおりです。これらのメッセージは、アプリケーションの基本レイアウトを定義するファイルに出力します。おそらく

layouts/scripts/index.phtml 

私は次のコードを書いています。

<?php if(isset($this->flashMessages) && !empty($this->flashMessages)){ ?> 
    <ul id="messages">    
     <?php foreach($this->flashMessages as $message){?> 
      <li> 
       <?php echo $message;?> 
      </li>  
     <?php } ?> 
    </ul> 
<?php } ?> 
関連する問題