3

zend freamwork 2でフラッシュメッセンジャーを使用するにはどうすればよいですか? セッションのドキュメントはまだです。誰でも知っていますか?しかし、セッション ライブラリはそこにあります。

4

4 に答える 4

15

アップデート :

Zend Framework の新しいリリースに FlashMessenger View Helper が追加されました。/library/Zend/View/Helper/FlashMessenger.php

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>

これが役立つことを願っています!

于 2012-10-12T05:39:04.447 に答える
9

私はこれについて少し前に記事を書きました。ここで見つけることができます

基本的には先ほどと同じように使用します。

<?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 の例は別として)。別の方法として、独自のビュー ヘルパーをいつでも自由に記述して、ビュー テンプレート内で少しきれいに見えるようにすることができます。

于 2012-09-21T05:59:48.243 に答える
3

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() を呼び出すと、パーシャルに渡してレンダリングできるメッセージの配列が返されます。

于 2012-09-21T13:50:51.393 に答える