我似乎无法弄清楚如何创建一个灵活的侧边栏包含和登录表单(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的侧边栏,但表单为空(不显示用户输入。也没有表单无法验证的消息。)
表单中的用户名字段应显示用户在提交之前提供的输入。并且应显示错误消息。
任何有关为什么这不是讨价还价的帮助,都非常受欢迎。
答案 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');
}
}
}
}
修改强>
不,如果表单实例已存在,则无法自检。你必须自己做。
我很确定建议的方法是使用视图助手。正如您在问题中所说,使用操作视图助手会导致另一个调度循环,这对性能有害。我不知道关于是否所有逻辑都应该保存在视图助手中的判断是什么。