1

在我的 Zend Framework 2 应用程序中,我使用了zfcUserLoginWidget,这是一个由ZfcUser提供的 View Helper 。此 View Helper 旨在将登录表单嵌入到另一个页面上。

<?php echo $this->zfcUserLoginWidget(); ?>

我在我的index.phtml中使用这个 View Helper,它由我的IndexController控制。按下“登录”按钮调用UserController的loginAction函数。如果输入的登录数据无效,则UserController默认重定向到登录页面:

class UserController extends AbstractActionController
{
    const ROUTE_LOGIN = 'zfcuser/login';    // Leads to 'user/login'

    public function loginAction()
    {
        // ...

        if (!$form->isValid()) {
            $this->flashMessenger()->setNamespace('zfcuser-login-form')->addMessage($this->failedLoginMessage);
            return $this->redirect()->toUrl($this->url()->fromRoute(static::ROUTE_LOGIN).($redirect ? '?redirect='. rawurlencode($redirect) : ''));
        }

        // ...
    }
}

如果输入的登录数据无效,则login.phtml默认显示错误消息:

<?php echo $this->formElementErrors($form->get('identity')) ?>

在我的应用程序中,我已将重定向路由更改回由IndexController控制的index.phtml(到 LoginWidget),而不是由UserController控制的login.phtml

const ROUTE_LOGIN = 'home';    // Leads to 'index/index'

更改此重定向路由会导致错误消息丢失:之前提到的formElementErrors函数仍然被调用,但没有可用的消息了。

问题:

  • 我如何告知 LoginWidget 已经输入了无效的登录数据并且页面不仅被简单地重新加载的事实?

如果是这种情况,我想将输入字段着色为红色......

4

1 回答 1

0

遇到同样的问题,我使用 Zend\Session\Container 解决了它,生成了我自己的消息。

修改:ZendSkeletonApplication\vendor\zf-commons\zfc-user\src\ZfcUser\Controller\UserController.php

添加

use Zend\Session\Container;

const ROUTE_LOGIN        = 'home';

在 UserController.php 的 loginAction 中添加/更改

//open session
$session = new Container('loginmsg');

if (!$form->isValid()) {
//$this->flashMessenger()->setNamespace('zfcuser-login-form')->addMessage($this->failedLoginMessage);
//$this->flashMessenger()->addMessage('not working');
//return $this->redirect()->toUrl($this->url()->fromRoute(static::ROUTE_LOGIN).($redirect ? '?redirect='.$redirect : ''));
$session->loginmsg = 'Username and password do not match.'; //store loginmsg
return $this->redirect()->toRoute('home');
} else {
$session->loginmsg = "";
}

还要修改authenticateAction

if (!$auth->isValid()) {
            $this->flashMessenger()->setNamespace('zfcuser-login-form')->addMessage($this->failedLoginMessage);
            $adapter->resetAdapters();
            //open session
            $session = new Container('loginmsg');
            $session->loginmsg = 'Username and password do not match.'; //store loginmsg
            return $this->redirect()->toUrl($this->url()->fromRoute(static::ROUTE_LOGIN)
                . ($redirect ? '?redirect='.$redirect : ''));
        }

在主路由(indexAction)中:

    $session = new Container('loginmsg');

    $loginmsg = strip_tags($session->loginmsg);

    $session->getManager()->getStorage()->clear('loginmsg');

    $this->layout('layout/index');

    return new ViewModel(array(
        'loginmsg' => $loginmsg,
    ));

在索引视图中

<?php if(!(empty($loginmsg))):?>
<div class="alert alert-danger" role="alert"><?php echo $loginmsg;?></div>
<?php endif; ?>

为我工作(起初),向我发送信息以获取更多信息。

亲切的问候,大卫

于 2014-11-05T19:32:15.277 回答