我正在使用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; ?>
答案 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并搜索“当前”,则可以查看完整的功能列表
<强>更新强>
要在视图中显示消息,您可以使用两种方法:
检索控制器中的消息并将其发送到视图
在控制器中
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;
}
直接在视图中检索。首先想到的是使用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);
}
希望这会帮助你!