2013-10-02 2 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

:

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; }, 

는 이제보기 훨씬 좋네요 내부의보기 도우미를 사용할 수 있습니다 문제를 일으키는 레이아웃 내부의 플러그인 ..? 이 경우에 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; 
    } 
} 

이제 플래시 컨트롤러 플러그인을 삽입합니다. n은 서비스 관리자 : 때문에 당신이 컨트롤러를 사용하는 방법에

example.phtml 어쩌면

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

그 점에 대해서도 생각하고 있었지만 getCurrentMessages()가 현재 요청의 메시지를 반환하지 않아야합니까? – Sam

+0

예. 플래시 메신저를 수정하여 원하는대로 할 수 있지만 가장 간단한 방법은 리디렉션하는 것입니다. 이중 전송을 보너스로 사용할 수 없습니다. – Andrew

+0

매우 유용합니다. 감사! –

관련 문제