我对ZF有一种奇怪的行为,我无法解决。我有一个layout.phtml和一个login.phtml。因此,当用户登录时,应该显示layout.phtml,否则显示login.phtml。这也有效,但在显示login.phtml之前,ZF会浏览layout.phtml,我可以通过error.log文件中的错误确认这一点。
这是我在引导程序中的内容:
public static function _initAcl()
{
$auth = Zend_Auth::getInstance();
$acl = new BM_Acl($auth);
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(
new BM_Controller_Plugin_Acl($auth, $acl)
);
}
这是我在auth控制器中的内容:
public function indexAction() {
$form = new BM_Form_Login();
$request = $this->getRequest();
if ($request->isPost()) {
if ($form->isValid($request->getPost())) {
if ($this->_process($form->getValues())) {
// We're authenticated! Redirect to the home page
//json validation on login page
$var = json_encode(array('valid' => true, 'redirect' => 'index'));
echo $var;
exit();
} else {
$var = json_encode(array('valid' => FALSE, 'error' => 'Authentication failed!', 'redirect' => 'auth'));
echo $var;
exit();
}
}
}// end if is POST
$this->_helper->layout()->setLayout('login'); // special login page
$this->view->form = $form;
}
任何帮助将不胜感激...... 问候 安德烈
P.S。仅当我从新的浏览器窗口启动应用程序时才会发生这种情况。如果我引用登录页面,则不再调用布局......
答案 0 :(得分:1)
视图适用于单页。如果您希望使用layout.phtml等模板显示单个页面,则可以编辑index action的views目录中的index.phtml。如果要禁用主布局
$this->_helper->layout()->disableLayout();
或使用空白布局
$this->_helper->layout()->setLayout('blank');
任何特定于单一页面的代码都应该以视图完成。
答案 1 :(得分:0)
我不确定,但我认为布局是在视图脚本之前重新编写的。您可以尝试将逻辑放在Controller中的preDispatch Hook中。
public function preDispatch() {
$form = new BM_Form_Login();
$request = $this->getRequest();
if ($request->isPost()) {
if ($form->isValid($request->getPost())) {
if ($this->_process($form->getValues())) {
// We're authenticated! Redirect to the home page
//json validation on login page
$var = json_encode(array('valid' => true, 'redirect' => 'index'));
echo $var;
exit();
} else {
$var = json_encode(array('valid' => FALSE, 'error' => 'Authentication failed!', 'redirect' => 'auth'));
echo $var;
exit();
}
}
}// end if is POST
$this->_helper->layout()->setLayout('login'); // special login page
$this->view->form = $form;
}
或使用ControllerPlugin:
答案 2 :(得分:0)
当我理解正确时,您有一个在所有页面上使用的布局,登录除外。您应该禁用此操作的布局,而只是正常渲染login.phtml,而不是使用视图作为布局进行登录。您可以通过在控制器的loginAction中调用以下代码而不是setLayout('login')
来执行此操作:
$this->_helper->layout()->disableLayout();
这只会禁用布局,但视图会正常呈现。
如果你想按自己的方式去做,你必须将login.phtml放入布局路径,而不是放在视图路径中(如果你想要更详细的解释,只需在评论中提问)。