Zend插件FlashMessenger推迟一页刷新

时间:2018-03-25 14:01:27

标签: php zend-framework3 flashmessenger

我正在使用zend的ZF3和FlashMessenger插件。此插件不需要任何配置。我只用我的自定义类覆盖它,因为我想以其他方式使用两种方法:

class CustomFlashMessenger extends FlashMessenger
{
public function hasMessages($namespace = null)
{
    if (null !== $namespace) {
        return parent::hasMessages($namespace);
    }

    return parent::hasMessages('default') ||
        parent::hasMessages('error') ||
        parent::hasMessages('warning') ||
        parent::hasMessages('info') ||
        parent::hasMessages('success');
}

public function clearMessages($namespace = null)
{
    if (null !== $namespace) {
        return parent::clearMessages($namespace);
    }

    return parent::clearMessages('default') ||
        parent::clearMessages('error') ||
        parent::clearMessages('warning') ||
        parent::clearMessages('info') ||
        parent::clearMessages('success');
    }
}

它已在Module.php注册,并且工作正常。

我的问题是,当我想在屏幕上显示消息时:

UserController.php

    public function loginAction()
{
    $form = new LoginForm();

    if (null !== $this->identity()) {
        return $this->redirect()->toRoute('home');
    }

    if ($this->getRequest()->isPost()) {
        $data = $this->params()->fromPost();
        $form->setData($data);

        if (!$form->isValid()) {
            foreach ($form->getMessages() as $message) {
                if (is_array($message)) {
                    $message = array_pop($message);
                }
                $this->flashMessenger()->addErrorMessage($message);
            }
        }

        $data = $form->getData();
        $result = $this->authManager->login($data[ 'login' ], $data[ 'password' ], $data[ 'remember_me' ]);

        if ($result->getCode() == Result::SUCCESS) {
            return $this->redirect()->toRoute('home');
        } else {
            $this->flashMessenger()->addErrorMessage('Error');
        }
    }

    $this->layout()->setTemplate('layout/login');

    return new ViewModel(
        [
            'form' => $form,
        ]);
}

布局/ login.phtml

<?php if ($this->flashMessenger()->hasMessages()) { ?>
        <div class="message">
            <?php echo $this->partial('partial/messages'); ?>
        </div>
    <?php } ?>

部分/ messages.phtml

<?php
echo $this->flashMessenger()->render('info');
echo $this->flashMessenger()->render('success');
echo $this->flashMessenger()->render('warning');
echo $this->flashMessenger()->render('error');
?>

我要查看的消息会延迟一页刷新。 例如。情形:

  1. 转到登录页面
  2. 想要使用错误密码登录并点击提交
  3. 页面刷新且无法找到任何信息
  4. 使用优质信用卡登录并点击提交
  5. 我已登录并在主页上看到错误消息(密码错误)。

1 个答案:

答案 0 :(得分:1)

flash messenger插件旨在显示 next 请求中的消息,并且对于例如 post-request-get plugin

如果您的代码在呈现它们的同一请求中生成消息,那么只需将消息直接传递给视图模型,无需插件。

return new ViewModel(
    [
        'messages' => $form->getMessages(),
        // ... other variables
    ]
);

与您的问题无关,但在您发布的代码loginAction中,无论您的表单是否经过验证,都会调用方法$this->authManager->login。您可能希望在if (!$form->isValid()) { ...

之后将该方法的调用放在else中