Zend_Layout显示登录或导航

时间:2009-10-19 17:58:32

标签: php zend-framework zend-layout

我不确定我是否正确地做到了这一点。我的目标是在我的布局中在标题部分显示登录或导航。

我的实现看起来像这样(没有逻辑):

2布局脚本:

  • login.phtml
  • navigation.phtml

FrontController插件:

class Plugin_Header extends Zend_Controller_Plugin_Abstract {

        /**
         * PreDispatch
         *
         * Decides wich kind of navigation is displayed in header section
         * for logged in users the menu, for guests the login box and
         * link to registration form.
         *
         * @return void
         */
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            $layout = Zend_Layout::getMvcInstance();
            $layout->topNavigation = $layout->render('login'); // or navigation 
        } 
}

它工作正常,但这是最好的方法吗? ;)

2 个答案:

答案 0 :(得分:1)

我建议将功能放在view helper或partial中。你弯曲布局的方式不应该弯曲,我猜:)

我会这样做:

  • 有两个部分 - 导航&登录
  • 制作一个助手My_View_Helper_RenderHeader()查找一个参数 - boolean $ isLoggedIn
  • 基于$ isLoggedIn = true的布尔值渲染导航,否则登录部分。
  • 你也可以添加某种设置(让我们说不同的部分名称或不同的路径),以使这个组件更可重复使用

其他积极的一点是,如果你实现了“toString”方法,你可以在帮助器中存储布尔值 - 出于某种原因设置它为ex。在index.phtml视图中,然后使用echo $this->renderHeader()在布局中的适当位置渲染它。太棒了,不是吗?如果您不确定,请查看head *(脚本,链接,...)帮助程序代码。

答案 1 :(得分:0)

我使用不同的布局:

anonymous.phtml
authenticated.phtml

并在前端控制器插件的preDispatch()方法中使用它:

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    $layout = 'authenticated';
} else {
    $layout = 'anonymous';
}


// Bootstrap layouts
Zend_Layout::startMvc(array(
'layoutPath' => APPLICATION_PATH . '/layouts/scripts',
'layout' => $layout
));

此外,我发现在这里检查Ajax请求($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')以及第三个“ajax”(空)布局也很有用。