我如何在 zend framwork 2 中使用 flash messenger?会话文档还没有。有人知道吗?但是会话库在那里。
4 回答
更新 :
Zend Framework 新版本添加了 FlashMessenger View Helper ,在路径中找到/library/Zend/View/Helper/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>
希望这会有所帮助!
我前段时间写了一篇关于这个的帖子。你可以在这里找到它
基本上你使用它就像之前一样。
<?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 示例)。或者,您总是可以自由地编写自己的视图助手,让它在您的视图模板中看起来更干净一些。
如何在 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() 应该返回一个消息数组,这些消息可以传递给部分并呈现。
将以下代码添加到视图以呈现错误消息:
<?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...');