【问题标题】:Using Zend2 Flashmessenger Controller/Plugin to show success msg使用 Zend Flashmessenger 控制器/插件显示成功消息
【发布时间】:2013-12-28 15:48:15
【问题描述】:

我正在使用 FlashMessenger 控制器/插件来显示错误消息,并且效果很好。我试图通过将命名空间设置为成功来显示成功消息。

$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; ?>

这是my FlashMessenger 班级。

【问题讨论】:

    标签: zend-framework zend-framework2 zend-form


    【解决方案1】:

    看起来您正在同一个请求中写入和读取消息。 认为 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 并搜索“当前”,您可以查看完整的函数列表

    更新

    要在视图中显示消息,您可以使用 2 种方法:

    1. 检索控制器中的消息并将其发送到视图

      在控制器中

      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;
      }
      
    2. 直接在视图中检索。首先想到的是使用 FlashMessenger 视图助手(Zend\View\Helper \FlashMessenger),但恐怕它没有获取当前消息的功能。因此,您可以扩展它,甚至更多,您可以编写自己的视图助手。你有here 一个很好的教程,教你如何做到这一点。

    【讨论】:

    • 感谢您的回答。我使用了 hasCurrentSuccessMessages(),现在当我打印 $successMessages 时它显示 thw 消息。我尝试将其设置为要在视图中显示的变量,但我无法成功在视图中显示消息。如何在查看页面上显示消息?再次非常感谢您
    【解决方案2】:

    我刚刚在控制器中测试了以下内容:

    $this->flashMessenger()->addSuccessMessage('test');
    
    if ($this->flashMessenger()->hasSuccessMessages()) {
        print_r($this->flashMessenger()->getSuccessMessages());
    }
    

    这导致Array ( [0] =&gt; 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(在我的 Controller 中)来检查和处理存储在 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);
    }
    

    希望对你有所帮助!

    【讨论】:

    • 感谢您对此的帮助。我试过你的例子,但它显示了一个空数组。大批()。它没有通过 if 条件,但我在 if 之外打印它并且只显示空数组。我做错了什么,什么可能导致这个问题?谢谢
    • 根据我的示例,我注意到的唯一一件事是我需要在初始加载后重新加载页面。然后消息如我所料地出现了。但是我相信这也是这样设计的。我认为这并不重要,但以防万一,我使用的是最新的 ZF2 和完整版本,而不是单独的包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多