3

我如何在 zend framwork 2 中使用 flash messenger?会话文档还没有。有人知道吗?但是会话库在那里。

4

4 回答 4

15

更新 :

Zend Framework 新版本添加了 FlashMessenger View Helper ,在路径中找到/library/Zend/View/Helper/FlashMessenger.php

FlashMessenger.php


旧答案:

我写了一个自定义视图助手,用于打印 Flash 消息

在 /module/Application/Module.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 ;
               } 
           ),
    );
}

在 /library/My/View/Helper/FlashMessages.php 中创建自定义视图助手

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

然后从 layout.phtml 或您的 view.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>

希望这会有所帮助!

于 2012-10-12T05:39:04.447 回答
9

我前段时间写了一篇关于这个的帖子。你可以在这里找到它

基本上你使用它就像之前一样。

<?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; ?>

如果您需要进一步的描述,请参阅我的博客,但我想代码本身很清楚(除了 layout.phtml 示例)。或者,您总是可以自由地编写自己的视图助手,让它在您的视图模板中看起来更干净一些。

于 2012-09-21T05:59:48.243 回答
3

如何在 View Helper 中获取 Flashmessenger 的消息 - 按照 Sam 的要求共享代码。

View 助手应该实现 ServiceManagerAwareInterface 接口和相关方法。该插件现在可以访问服务管理器,我们可以使用它来获取服务定位器并最终访问 Flash Messenger。

自从我最初编写这段代码以来,我没有接触过它——所以可能有一种更优雅的方式来做这件事。

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() 应该返回一个消息数组,这些消息可以传递给部分并呈现。

于 2012-09-21T13:50:51.393 回答
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...');
于 2013-12-28T10:14:05.800 回答