zend freamwork 2でフラッシュメッセンジャーを使用するにはどうすればよいですか? セッションのドキュメントはまだです。誰でも知っていますか?しかし、セッション ライブラリはそこにあります。
4 に答える
アップデート :
Zend Framework の新しいリリースに FlashMessenger View Helper が追加されました。/library/Zend/View/Helper/FlashMessenger.php
古い答え:
フラッシュ メッセージを出力するためのカスタム ビュー ヘルパーを作成しました。
/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 インターフェイスと関連メソッドを実装する必要があります。プラグインは Service Manager にアクセスできるようになり、これを使用して Service Locator を取得し、最終的に 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() を呼び出すと、パーシャルに渡してレンダリングできるメッセージの配列が返されます。