2012-09-21 3 views
3

젠드 freamwork 2에서 플래시 메신저를 어떻게 사용할 수 있습니까? 세션 문서가 아직 없습니다. 누구든지 그것을 압니까? 그러나 세션 라이브러리가 있습니다.zf2의 플래시 메신저

답변

9

나는 얼마 전이 게시물을 작성했습니다. 찾을 수 있습니다 right here

기본적으로 이전과 똑같이 사용합니다.

<?php 
public function commentAction() 
{ 
    // ... display Form 
    // ... validate the Form 
    if ($form->isValid()) { 
     // try-catch passing data to database 

     $this->flashMessenger()->addMessage('Thank you for your comment!'); 

     return $this->redirect()->toRoute('blog-details'); //id, blabla 
    } 
} 

public function detailsAction() 
{ 
    // Grab the Blog with given ID 
    // Grab all Comments for this blog 
    // Assign the view Variables 

    return array(
     'blog' => $blog, 
     'comments' => $comments, 
     'flashMessages' => $this->flashMessenger()->getMessages() 
    ); 
} 

는 그런 다음로 .phtml 파일에이처럼 수행

// details.phtml 
<?php if(count($flashMessages)) : ?> 
<ul> 
    <?php foreach ($flashMessages as $msg) : ?> 
    <li><?php echo $msg; ?></li> 
    <?php endforeach; ?> 
</ul> 
<?php endif; ?> 

당신이 모든 단일로 .phtml 파일에 대해이 작업을 수행 가지고 분명히이 모든 너무 편리하지 않다. 이 더 설명이 필요하면, 내 블로그를 참조하십시오

<?php 
// layout.phtml 
// First get the viewmodel and all its children (ie the actions viewmodel) 
$children = $this->viewModel() 
       ->getCurrent() 
       ->getChildren(); 

$ourView = $children[0]; 

if (isset($ourView->flashMessages) && count($ourView->flashMessages)) : ?> 
<ul class="flashMessages"> 
    <?php foreach ($ourView->flashMessages as $fMessage) : ?> 
    <li><?php echo $fMessage; ?></li> 
    <?php endforeach; ?> 
</ul> 
<?php endif; ?> 

,하지만 난 떨어져 레이아웃 frmo (코드 자체는 매우 분명하다 생각 : 따라서 레이아웃 내에서 그 일을 다음과 같이 기껏를해야한다. phtml 예제). 또는 뷰 템플릿 내부에서 좀 더 깔끔하게 보이도록 자신 만의 뷰 도우미를 자유롭게 작성할 수 있습니다.

+1

나는 그것을 발견 메시지를 액세스하고 표시 할 수있는보기 도우미를 만들려면 매우 편리합니다. 관심있는 사람들을 위해 ServiceManagerAwareInterface를 구현 한 후 ServiceLocator를 통해 액세스 할 수있는 ControllerPluginManager에서 FlashMessenger를 가져 와서 수행 할 수 있습니다. 따라서 매번 작업에서 뷰 모델로 메시지를 전달할 필요가 없습니다. – DrBeza

+2

현재 가지고 있다면 코드 공유는 어떨까요? :) 나는 이것이 익숙하지 않은 많은 사람들을 도와 줄 것이라고 확신한다. 방금 "마법"조력자의 기본 작업을 나열했습니다.) – Sam

3

Sam이 요청한대로보기 도우미 공유 코드에서 Flashmessenger의 메시지를 가져 오는 방법.

보기 도우미는 ServiceManagerAwareInterface 인터페이스 및 관련 메소드를 구현해야합니다. 이제 플러그인은 Service Locator를 얻고 궁극적으로 Flash Messenger에 액세스하는 데 사용할 수있는 Service Manager에 액세스 할 수 있습니다.

처음부터이 코드를 읽은 적이 없으므로 좀 더 우아한 방법이 있습니다.

protected function getMessages() 
{ 
    $serviceLocator = $this->getServiceManager()->getServiceLocator(); 
    $plugin = $serviceLocator->get('ControllerPluginManager'); 
    $flashMessenger = $plugin->get('flashmessenger'); 

    $messages = $flashMessenger->getMessages(); 

    // Check for any recently added messages 
    if ($flashMessenger->hasCurrentMessages()) 
    { 
     $messages += $flashMessenger->getCurrentMessages(); 
     $flashMessenger->clearCurrentMessages(); 
    } 

    return $messages; 
} 

그리고 플러그인() 내에서 호출은 getMessages하는 부분에 전달하고 렌더링 할 수있는 메시지의 배열을 반환한다.

15

업데이트 :

젠드 프레임 워크의 새로운 버전이 경로에 FlashMessenger보기 도우미, 추가 /library/Zend/View/Helper/FlashMessenger.php

FlashMessenger.php


올드 답 :

내가 쓴 가지고 관례 인쇄 플래시 메시지 w 도우미,

namespace My\View\Helper; 
use Zend\View\Helper\AbstractHelper; 

class FlashMessages extends AbstractHelper 
{ 

     protected $flashMessenger; 

     public function setFlashMessenger($flashMessenger) 
     { 
       $this->flashMessenger = $flashMessenger ; 
     } 


     public function __invoke() 
     { 

       $namespaces = array( 
        'error' ,'success', 
        'info','warning' 
       ); 

       // messages as string 
       $messageString = ''; 

       foreach ($namespaces as $ns) { 

         $this->flashMessenger->setNamespace($ns); 

         $messages = array_merge(
           $this->flashMessenger->getMessages(), 
           $this->flashMessenger->getCurrentMessages() 
         ); 


         if (! $messages) continue; 

         $messageString .= "<div class='$ns'>" 
             . implode('<br />', $messages) 
            .'</div>'; 
       } 

       return $messageString ; 
     } 
} 
/library/My/View/Helper/FlashMessages.php

에서 사용자 지정보기 도우미를 만들기
public function getViewHelperConfig() 
{ 
    return array(     
     'factories' => array(            
      'flashMessage' => function($sm) {  

       $flashmessenger = $sm->getServiceLocator() 
             ->get('ControllerPluginManager') 
             ->get('flashmessenger');         

       $message = new \My\View\Helper\FlashMessages() ; 
       $message->setFlashMessenger($flashmessenger); 

       return $message ; 
       } 
      ), 
    ); 
} 

/module/Application/Module.php

에서

다음 간단한 호출을 layout.phtml 또는보기.PHTML

echo $this->flashMessage(); 

날 컨트롤러 액션의 예를 보여 드리죠 홈 페이지에서

public function testFlashAction() 
{ 
      //set flash message 
      $this->flashMessenger()->setNamespace('warning') 
       ->addMessage('Mail sending failed!'); 

      //set flash message 
      $this->flashMessenger()->setNamespace('success') 
       ->addMessage('Data added successfully'); 

      // redirect to home page 
      return $this->redirect()->toUrl('/'); 
} 

,이 의지 할 수

<div class="success">Data added successfully</div> 
<div class="warning">Mail sending failed!</div> 

희망을 인쇄! 오류 메시지를 렌더링 할 뷰 아래

0

추가 코드 : 만들기, 이전 요청에서

<?php echo $this->flashmessenger() 
    ->setMessageOpenFormat('<div class="alert alert-danger"><ul%s><li>') 
    ->setMessageCloseString('</li></ul></div>') 
    ->render('error') 
; ?> 

는 당신이 컨트롤러에 아래의 코드를 실행하여 오류 메시지가 생성 :

$this->flashmessenger()->addErrorMessage('Whops, something went wrong...');