2010-02-21 69 views
0

我似乎无法弄清楚如何创建一个灵活的侧边栏包含和登录窗体(Zend_Form)和各种模块/控制器特定的链接。使用Zend表单在每个页面上显示登录表单

最常见的解决方案似乎可以用:

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

但apperently这个心不是 '最好' 的方法是什么?我读过这个apprently触发一个dispatchloop,从而使性能受到影响?

我想过唱的侧边栏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我有动作设定/认证/登录其中包含以下代码:

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的边栏,但表单为空(不显示用户输入,也不是表单无法验证的消息)。

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

任何帮助,为什么这不是happing,非常appriciated。

回答

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'); 
      } 
     } 
    } 
} 

编辑:

没有,没有自我检查,如果一个窗体的实例已经存在。你必须自己做。

我很确定建议的方法是使用视图助手。正如你在你的问题中所说的那样,使用动作视图助手会导致另一个对性能不利的调度循环。我不知道是否所有的逻辑都应该保留在视图助手的判断中。

相关问题