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

Php 使用Zend表单在每个页面上显示登录表单,php,zend-framework,Php,Zend Framework,我似乎不知道如何创建一个灵活的边栏,其中包含登录表单(Zend_表单)和各种模块/控制器特定的链接 最常见的解决方案似乎是使用: echo$this->action('login','authentication','default') 但显然这不是最好的方式?我已经读到,这明显触发了dispatchloop,从而导致性能下降 我想为侧边栏唱一首View_助手: class Zend_View_Helper_Sidebar extends Zend_View_Helper_Abstract {

我似乎不知道如何创建一个灵活的边栏,其中包含登录表单(Zend_表单)和各种模块/控制器特定的链接

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

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

但显然这不是最好的方式?我已经读到,这明显触发了dispatchloop,从而导致性能下降

我想为侧边栏唱一首View_助手:

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
    }
}
如果我提供了错误的用户名/密码,它将呈现当前为空的indexAction。这很好。它还会根据需要呈现包含loginForm的侧边栏,但表单为空(不显示用户输入,也没有表单验证失败的消息)

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


关于为什么不发生这种情况,我们非常感谢您提供的任何帮助。

您正在登录操作中进行表单验证,并且您说您当前正在发布索引操作,这是打字错误吗

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

如果注册表中已存在表单,请签入视图帮助器。如果有,就使用那个实例。否则,您可以创建一个新实例。这里有一个粗略的例子来说明我的意思:

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');
            }
        }
    }
}
class Zend\u View\u Helper\u侧栏扩展了Zend\u View\u Helper\u抽象
{
公共函数边栏()
{
$sidebar=$this->view->placeholder('sidebar');
$sidebar->setPrefix(“”)
->设置分离器(“”)
->setPostfix(“”);
if(Zend_Registry::isreRegistered('loginForm')){
$loginForm=Zend_注册表::get('loginForm');
}否则{
$loginForm=新表单_Login();
}
$sidebar->append($loginForm);
$sidebar->append(新模型\类别->获取列表());
返回$sidebar
}
}
公共函数登录()
{
$form=新表单_Login();
Zend_注册表::set('loginForm',$form);
$request=$this->getRequest();
如果($request->isPost()){
$data=$request->getPost();
如果($form->isValid($data)){
$username=$form->getValue('username');
$password=$form->getValue('password');
$users=新模型_DbTable_users();
$authenticated=$users->login($username,$password);
如果($authenticated){
//成功-显示标识而不是登录信息
}否则{
$this->view->loginForm=$form;
$this->render('/index');
}
}
}
}
编辑:

否,如果表单实例已存在,则不进行自检。你必须自己做这件事


我很确定建议的方法是使用视图帮助器。正如您在问题中所说,使用action view helper会导致另一个调度循环,这对性能不利。我不知道所有逻辑是否都应该保留在视图帮助器中的结论是什么。

您正在登录操作中进行表单验证,并且您说您当前正在发布索引操作,这是一个输入错误吗

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

如果注册表中已存在表单,请签入视图帮助器。如果有,就使用那个实例。否则,您可以创建一个新实例。这里有一个粗略的例子来说明我的意思:

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');
            }
        }
    }
}
class Zend\u View\u Helper\u侧栏扩展了Zend\u View\u Helper\u抽象
{
公共函数边栏()
{
$sidebar=$this->view->placeholder('sidebar');
$sidebar->setPrefix(“”)
->设置分离器(“”)
->setPostfix(“”);
if(Zend_Registry::isreRegistered('loginForm')){
$loginForm=Zend_注册表::get('loginForm');
}否则{
$loginForm=新表单_Login();
}
$sidebar->append($loginForm);
$sidebar->append(新模型\类别->获取列表());
返回$sidebar
}
}
公共函数登录()
{
$form=新表单_Login();
Zend_注册表::set('loginForm',$form);
$request=$this->getRequest();
如果($request->isPost()){
$data=$request->getPost();
如果($form->isValid($data)){
$username=$form->getValue('username');
$password=$form->getValue('password');
$users=新模型_DbTable_users();
$authenticated=$users->login($username,$password);
如果($authenticated){
//成功-显示标识而不是登录信息
}否则{
$this->view->loginForm=$form;
$this->render('/index');
}
}
}
}
编辑:

否,如果表单实例已存在,则不进行自检。你必须自己做这件事

我很确定建议的方法是使用视图帮助器。正如您在问题中所说,使用action view helper会导致另一个调度循环,这对性能不利。我不知道对w的判决是什么