2011-02-05 7 views
3

内からビュー・オブジェクトを取得、私は私のFlashMessengerメッセージを統合するpostDispatchを持っている:は私のコントローラではZendのコントローラーのプラグイン

public function postDispatch() 
{  
    $messages = $this->_helper->getHelper ('FlashMessenger') 
     ->getMessages(); 

    if ($this->_helper->getHelper ('FlashMessenger') 
     ->hasCurrentMessages()) 
    { 
     $messages = array_merge ($messages, $this->_helper->getHelper ('FlashMessenger') 
      ->getCurrentMessages()); 
     $this->_helper->getHelper ('FlashMessenger') 
      ->clearCurrentMessages(); 
    } 

    $this->view->alert = $messages; 
} 

私はコントローラのプラグインにこれ​​をしたいです。

更新:私はこれがなぜ必要なのか理解しました。JSONコンテキストで呼び出されたときにJSONでフラッシュメッセージを渡したいと思います。メッセージがViewオブジェクトに追加されない限り、メッセージは受信されません。

私は配列にメッセージを取得することができましたが、私は、ビューに渡す方法がわからない:

class Plugin_FlashMessenger extends Zend_Controller_Plugin_Abstract 
{ 
    public function postDispatch($request) 
    { 
     $flashmessenger = Zend_Controller_Action_HelperBroker::getStaticHelper ('FlashMessenger'); 

     $messages = $flashmessenger->getMessages(); 
     if ($flashmessenger->hasCurrentMessages()) 
     { 
      $messages = array_merge ($messages, $flashmessenger->getCurrentMessages()); 
      $flashmessenger->clearCurrentMessages(); 
     } 

     // THIS LINE IS WRONG. HOW DO I SEND $messages TO THE VIEW? 
     $this->view->alert = $messages; 
    } 
} 

ボーナス質問を - これは、これを達成するための正しい方法ですか?ありがとう!

答えて

1

私はそれが間違っていると思います。 FlashMessengerは、ある要求から次の要求への通知をほとんど受けないことです。 ビューで利用可能です。

このように、flashmessengerはすでにコントローラアクションヘルパー(上記の目的のために)の上に別のヘルパーを構築したいのですか? :)

あなたの問題は実際にはビュー内のメッセージを取得しています。そのために、すでにビューヘルパーがあります。 noumenalから。それは素晴らしいです。

+0

FlashMessengerは、次のページでアラートを表示します。したがって、* this *ページにページを送る場合は、ロジックを実行する必要があります(以前のメッセージを取得し、現在のメッセージを取得し、それらを結合する必要があります)。だから、レイアウト/ビューにロジックを置くだけでいいですか?それは確かにはるかに簡単ですが、私はそれがビュースクリプトのようなロジックを持つのは悪い習慣だと思った? – Corey

+0

@Corey、Noumenal Flash Messengerのビューヘルパーは既にあなたのためにgetMessages()/ getCurrentMessages()ロジックを処理しています。 –

0

すべてのコントローラでこの機能を利用するには、Zend_Controller_Actionを拡張して、ポストディスパッチコードを含む新しいクラスを作成します。

+0

ありがとうございます。すべてのコントローラに機能を取り入れることは、まさに私が望むものです。私は自分の図書館を作りましたが、それはちっぽけなようです。私はむしろプラグインを追加/削除して機能を得るだろう。 – Corey

12

同じことを検索しながらあなたの投稿を見つけました。 this threadに基づいて、それを達成するための2つの簡単な方法がある。あなたのビューは、ブートストラップ時に初期化されていない場合:

ワン:

$view = Zend_Controller_Front::getInstance() 
     ->getParam('bootstrap') 
     ->getResource('view'); 

2:あなたのビューが(resources.view[] =があなたのapplication.iniである)、ブートストラップ時に初期化されている場合、あなたは単にこれを呼び出すことができます

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); 
if (null === $viewRenderer->view) { 
    $viewRenderer->initView(); 
} 
$view = $viewRenderer->view; 
関連する問題