2013-10-02 123 views
0

我在Zend Framework 2.2.0中使用flashMesssenger將消息從一個動作傳遞到另一個動作。flashmessenger不顯示新消息

我有一個聯繫我們的表格,它被執行後,我發送一封電子郵件,並轉發用戶到主頁。

public function contactUsExecuteAction() { 
    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     $contactUs = new ContactUs(); 
     $form = new ContactUsForm(); 
     $form->setInputFilter($contactUs->getInputFilter()); 
     $form->setData($request->getPost()); 
     if ($form->isValid()) { 
      $contactUs->exchangeArray($form->getData()); 
      $name = $contactUs->name; 
      $email = $contactUs->email; 
      $message = $contactUs->message; 
      $completeMessage='name:'.$name."\n".'email:'.$email."\n".$message; 
      $subject = 'myalcoholist contact us'; 
      mail('<EMAIL_ADDRESSS>',$subject,$completeMessage); 
      $this->flashMessenger()->addMessage("thank you for contacting myalcoholist."); 

      return $this->forward()->dispatch('home'); 
     } 

    } 
    } 

現在我明白,只是向前轉發頁面,我應該只在下次迭代得到的消息,除非我使用getCurrentMessages。所以這是我layout.phtml

<?php 
use Zend\Mvc\Controller\Plugin\FlashMessenger; 

$messenger = $this->flashMessenger()->getPluginFlashMessenger(); 
foreach(array(
    FlashMessenger::NAMESPACE_ERROR, 
    FlashMessenger::NAMESPACE_SUCCESS, 
    FlashMessenger::NAMESPACE_INFO, 
    FlashMessenger::NAMESPACE_DEFAULT) 
    as $namespace): 

$messenger->setNamespace($namespace); 
$userMsgs = array_merge($messenger->getCurrentMessages(), $messenger->getMessages()); 
$messenger->clearCurrentMessages(); 

foreach($userMsgs as $msg): 
    $msgText = $msg; 
    if (is_array($msg)){ 
     $msgText = $msg['message']; 
    } 
    ?> 
    <div class="alert alert-<?=$namespace?>"> 
     <?=$msgText?> 
    </div> 
<?php endforeach ?> 
<?php endforeach ?> 

,但由於某種原因,我沒有得到任何的消息!它會正確地轉發用戶,但這就是它。

什麼想法?

+0

可能是由於您使用的控制器的方式插件裏面的佈局導致問題..?最好在這種情況下創建一個View Helper .. – Andrew

回答

4

1)

不要使用前,會有無新的要求。

嘗試使用重定向,這樣你將得到一個新的請求,並會發現等待你的消息,你不應該需要任何額外的代碼來使它工作。

$this->redirect()->toRoute('routeName'); 

$this->redirect()->toUrl('http://google.com/'); 

2)

如果您dertermined使用它在那樣的觀點,那麼你總是可以做一個簡單的 視圖助手:

namespace Application\View\Helper; 

use Zend\Mvc\Controller\Plugin\FlashMessenger as ZendFlash; 
use Zend\View\Helper\AbstractHelper; 

class FlashMessenger extends AbstractHelper 
{ 
    /** 
    * @var \Zend\Mvc\Controller\Plugin\FlashMessenger 
    */ 
    protected $flashMessenger; 
    /** 
    * @var array 
    */ 
    protected $namespaces = array(
     'default', 
     'error', 
     'success', 
     'info', 
     'warning' 
    ); 

    /** 
    * Set the Controller plugin 
    * 
    * @param Zend\Mvc\Controller\Plugin\FlashMessenger 
    */ 
    public function setFlashMessenger($flashMessenger) 
    { 
     $this->flashMessenger = $flashMessenger; 

     return $this; 
    } 

    /** 
    * @return string 
    */ 
    public function __invoke() 
    { 
     $messageString = '';    
     foreach($this->namespaces as $ns) { 
      $this->flashMessenger->setNamespace($ns); 
      $messages = $this->flashMessenger->getMessages(); 
      if($this->flashMessenger->hasCurrentMessages()) { 
       $messages += $this->flashMessenger->getCurrentMessages(); 
       $this->flashMessenger->clearCurrentMessages(); 
      } 

      if(count($messages) > 0) { 
       // Twitter bootstrap message box 
       $messageString .= sprintf(
        '<div class="container-fluid"> 
         <div class="alert alert-%s fade in"> 
          <button data-dismiss="alert" class="close" type="button">×</button> 
          %s 
         </div> 
        </div>', 
        $ns, 
        implode('<br />', $messages) 
       ); 
      } 
     } 

     return $messageString; 
    } 
} 

現在注入Flash控制器插件我n中的服務管理器:

public function getViewHelperConfig() 
{ 
    return array(
     'factories' => array(
      'flashMessenger' => function($sm) {  
       $flash = $sm->getServiceLocator() 
        ->get('ControllerPluginManager') 
        ->get('flashmessenger') 
       ; 
       $messages = new \Application\View\Helper\FlashMessenger(); 
       $messages->setFlashMessenger($flash); 

       return $messages; 
      }, 

現在你可以使用視圖好得多內的視圖助手:

example.phtml

<?php echo $this->flashMessenger() ?> 
+0

我也在想這個,但是不應該'getCurrentMessages()'從當前請求中返回消息? – Sam

+0

是的,我修改了我的flash使者做他想要的,但最簡單的方法是重定向,這也將停止任何雙重提交作爲獎金 – Andrew

+0

非常有用。謝謝! –