ZF奇怪的布局行为

时间:2012-02-15 07:56:55

标签: zend-framework

我对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。仅当我从新的浏览器窗口启动应用程序时才会发生这种情况。如果我引用登录页面,则不再调用布局......

3 个答案:

答案 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:

Zend Controller Plugin - Doc

答案 2 :(得分:0)

当我理解正确时,您有一个在所有页面上使用的布局,登录除外。您应该禁用此操作的布局,而只是正常渲染login.phtml,而不是使用视图作为布局进行登录。您可以通过在控制器的loginAction中调用以下代码而不是setLayout('login')来执行此操作:

$this->_helper->layout()->disableLayout();

这只会禁用布局,但视图会正常呈现。

如果你想按自己的方式去做,你必须将login.phtml放入布局路径,而不是放在视图路径中(如果你想要更详细的解释,只需在评论中提问)。