使用Zend Form在每个页面上显示登录表单

时间:2010-02-21 15:35:38

标签: php zend-framework

我似乎无法弄清楚如何创建一个灵活的侧边栏包含和登录表单(Zend_Form)和各种模块/控制器特定的链接。

最常见的解决方案似乎是使用:

echo $this->action('login', 'authentication', 'default');

但显然这不是'最好'的方式?我已经读过,这会引发一个调度循环,从而导致性能下降?

我想过为侧边栏唱一个View_Helper:

class Zend_View_Helper_Sidebar extends Zend_View_Helper_Abstract
{
    public function sidebar()
    {
        $sidebar = $this->view->placeholder('sidebar');
        $sidebar->setPrefix('<div class="sidebar-element">')
                ->setSeparator('</div><div class="sidebar-element">')
                ->setPostfix('</div>');

        $sidebar->append(new Form_Login);
        $sidebar->append(new Model_Category->getList());
        return $sidebar
    }
}

在我的Form_Login中,我将操作设置为/ auth / login,其中包含以下代码:

public function loginAction()
{
    $request = $this->getRequest();

    if($request->isPost()) {
        $form = new Form_Login();
        $data = $request->getPost();
        if($form->isValid($data)) {
            $username = $form->getValue('username');
            $password = $form->getValue('password');
            $users = new Model_DbTable_Users();
            $authenticated = $users->login($username, $password);
            if($authenticated) {                    
                    //Succes - show identity instead of loginForm                   
            } else {                                      
                $this->view->loginForm = $form;
                $this->render('/index');
            }
        }
    }
}

如果我提供了错误的用户名/密码,它会呈现当前为空的indexAction。这可以。它还根据需要呈现包含loginForm的侧边栏,但表单为空(不显示用户输入。也没有表单无法验证的消息。)

表单中的用户名字段应显示用户在提交之前提供的输入。并且应显示错误消息。

任何有关为什么这不是讨价还价的帮助,都非常受欢迎。

1 个答案:

答案 0 :(得分:3)

您正在loginAction中进行表单验证,并且您说您当前正在发布索引操作,这是一个错字吗?

除此之外,您还要创建Form_Login的两个副本。一次,在动作中,一次在视图中帮助。如果在操作中的一个实例上进行验证,则需要在视图助手中显示该表单的相同实例。您可以将所有验证逻辑移动到视图助手中,也可以在视图助手和操作之间共享实例。我打算建议后者。

如果注册表中已存在表单,请检查您的视图助手。如果是,请使用该实例。否则,您可以创建一个新实例。这是我的意思的一个粗略的例子:

class Zend_View_Helper_Sidebar extends Zend_View_Helper_Abstract
{
    public function sidebar()
    {
        $sidebar = $this->view->placeholder('sidebar');
        $sidebar->setPrefix('<div class="sidebar-element">')
                ->setSeparator('</div><div class="sidebar-element">')
                ->setPostfix('</div>');

        if(Zend_Registry::isReigistered('loginForm')) {
            $loginForm = Zend_Registry::get('loginForm');
        } else {
            $loginForm = new Form_Login();
        }

        $sidebar->append($loginForm);
        $sidebar->append(new Model_Category->getList());
        return $sidebar
    }
}

public function loginAction()
{
    $form = new Form_Login();
    Zend_Registry::set('loginForm', $form);

    $request = $this->getRequest();

    if($request->isPost()) {        
        $data = $request->getPost();
        if($form->isValid($data)) {
            $username = $form->getValue('username');
            $password = $form->getValue('password');
            $users = new Model_DbTable_Users();
            $authenticated = $users->login($username, $password);
            if($authenticated) {                    
                    //Succes - show identity instead of loginForm                   
            } else {                                      
                $this->view->loginForm = $form;
                $this->render('/index');
            }
        }
    }
}

修改

不,如果表单实例已存在,则无法自检。你必须自己做。

我很确定建议的方法是使用视图助手。正如您在问题中所说,使用操作视图助手会导致另一个调度循环,这对性能有害。我不知道关于是否所有逻辑都应该保存在视图助手中的判断是什么。