Din*_*nga 3 session zend-framework2
我怎样才能在zend freamwork 2中使用flash messenger?会话文档还没有.谁知道呢?但会话库就在那里.
rab*_*rab 15
更新:
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 ;
}
),
);
}
Run Code Online (Sandbox Code Playgroud)
在/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 ;
}
}
Run Code Online (Sandbox Code Playgroud)
然后从layout.phtml或你的view.phtml简单调用
echo $this->flashMessage();
Run Code Online (Sandbox Code Playgroud)
让我举例说明控制器动作
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('/');
}
Run Code Online (Sandbox Code Playgroud)
在主页中,它打印
<div class="success">Data added successfully</div>
<div class="warning">Mail sending failed!</div>
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助!
我前段时间写了一篇关于此的帖子.你可以在这里找到它
基本上你像以前一样使用它.
<?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()
);
}
Run Code Online (Sandbox Code Playgroud)
然后在.phtml文件中,你这样做:
// details.phtml
<?php if(count($flashMessages)) : ?>
<ul>
<?php foreach ($flashMessages as $msg) : ?>
<li><?php echo $msg; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)
显然这不是太方便,因为你必须为每个.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; ?>
Run Code Online (Sandbox Code Playgroud)
如果您需要进一步的说明,请参见我的博客,但我想代码本身是相当清楚的(除了frmo的layout.phtml例子).或者,您可以随时自由编写自己的视图帮助程序,使其在视图模板中看起来更清晰.