使用Zend2 Flashmessenger控制器/插件显示成功消息

时间:2013-12-28 15:48:15

标签: zend-framework zend-framework2 zend-form

我正在使用FlashMessenger Controller / Plugin来显示错误消息,而且工作正常。我试图通过将命名空间设置为成功来显示成功消息。

$this->flashMessenger()->addSuccessMessage('Success msg!');
$successMessages = $this->flashMessenger()->hasSuccessMessages();
print_r($successMessages);exit;
$view = new ViewModel(array('success' => $successMessages));

当我打印$ successMessages时,它会显示Array(),因为没有要显示的消息。

同样如果我尝试像这样设置命名空间。

$this->flashMessenger()->setNamespace('success')->addSuccessMessage('Success msg!');
$successMessages = $this->flashMessenger()->setNamespace('success')->getMessages();

这是设置命名空间的方式以及如何在视图上显示消息吗? 我使用它来显示错误消息,但它不适用于成功消息。

    <?php if (!empty($this->messages)): ?>
    <?php foreach ($this->messages as $msg) : ?>
            <div class="error-box"><?php echo $this->translate($msg) ?></div>
    <?php endforeach; ?>
    <?php endif; ?>

这是my FlashMessenger类。

2 个答案:

答案 0 :(得分:3)

看起来您正在同一个请求中编写和阅读邮件。 认为flashMessenger主要用于保存消息以供日后使用,您可以在old but meaningful ZF1 docs中阅读:

  

FlashMessenger帮助程序允许您传递用户的消息   可能需要查看下一个请求。

例如,您所处的请求来自一个表单,该表单旨在将记录添加到列表中,在接收保存记录表单的控制器/操作中,将消息写入flashmessenger ,并将用户重定向到再次显示记录列表的控制器/操作。 您可以在ZF2 mvc plugins docs

中看到此示例中的内容
public function processAction()
{
    // ... do some work ...
    $this->flashMessenger()->addMessage('You are now logged in.');
    return $this->redirect()->toRoute('user-success');
}

public function successAction()
{
    $return = array('success' => true);
    $flashMessenger = $this->flashMessenger();
    if ($flashMessenger->hasMessages()) {
        $return['messages'] = $flashMessenger->getMessages();
    }
    return $return;
}

如果您需要阅读相同请求中的消息(这也是非常常见的消息),您必须使用帮助程序的“当前消息”方法。因此,而不是调用

$this->flashMessenger()->hasSuccessMessages()

你应该致电

$this->flashMessenger()->hasCurrentSuccessMessages()

而不是调用

$this->flashMessenger()->getSuccessMessages()

你应该致电

$this->flashMessenger()->getCurrentSuccessMessages()

如果您转到Zend.Mvc.Controller.Plugin.FlashMessenger API docs并搜索“当前”,则可以查看完整的功能列表

<强>更新

要在视图中显示消息,您可以使用两种方法:

  1. 检索控制器中的消息并将其发送到视图

    在控制器中

    public function yourAction() {
        return array (
          '$successMessages' 
                    => $this->flashMessenger()->getCurrentSuccessMessages()       
        );
    }
    

    在视图中

    //note that getCurrentSuccessMessages() returns an array, 
    //so in the vew $successMessages is an array
    foreach ($successMessages as $m) {
       echo $m;
    }
    
  2. 直接在视图中检索。首先想到的是使用FlashMessenger视图助手(Zend\View\Helper \FlashMessenger),但我担心它没有获取当前消息的功能。所以,你可以扩展它,甚至更多,你可以编写自己的视图助手。你有here关于如何做到这一点的好教程。

答案 1 :(得分:1)

我刚刚在Controller中测试了以下内容:

$this->flashMessenger()->addSuccessMessage('test');

if ($this->flashMessenger()->hasSuccessMessages()) {
    print_r($this->flashMessenger()->getSuccessMessages());
}

这导致Array ( [0] => test )

根据您的问题,您似乎尚未拨打getSuccessMessages()

要将消息传入ViewModel,您可以执行以下操作:

$viewModel = new ViewModel();
$viewModel->setVariable('messages', ($this->flashMessenger()->hasSuccessMessages()) ? $this->flashMessenger()->getSuccessMessages() : null);

在你的视图中你可以这样做:

if (!is_null($this->messages)) {
    foreach ($this->messages as $message) {
        echo $message . "\n";
    }
}

尝试重新加载页面几次以确保消息可见。我个人使用EventManager(在我的控制器中)来检查和处理存储在flashMessenger()中的消息。例如:

public function setEventManager(EventManagerInterface $events)
{
    parent::setEventManager($events);

    $events->attach('dispatch', function () {
        $this->getServiceLocator()->get('translator')->setLocale('en');

        if ($this->flashMessenger()->hasMessages()) {
            $this->Flash()->Display($this->flashMessenger()->getMessages()); // Custom Controller Plugin
        }
    }, 100);
}

希望这会帮助你!