如何在Zend_Application中使用多个视图(使用Zend_Layout)?

时间:2010-09-01 16:50:54

标签: php zend-framework

我的布局有4个单独的“块”。他们是:

  • 带有菜单和面包屑的导航面板。这是使用Zend_Navigation构建的。
  • 侧边栏,默认显示一般“新闻”
  • 内容区域,其中将放置每个控制器操作的主要输出
  • 标题区域,位于导航上方,通常只显示一些股票文本和照片。

内容区域符合Zend_Application文档所述的传统单一视图模型,但其他三种模型不符合。它们都有合理的默认视图可供使用,但控制器需要能够在需要时覆盖它们。例如,管理页面覆盖“新闻”视图以显示系统上最近采取的管理操作的日志是有意义的。

然而,Zend_Layout / Zend_Application示例都采用单一视图(他们称之为<?php echo $this->layout()->content; ?>

如何实现这种覆盖布局?我想到的唯一解决方案是在Zend_View内存储被覆盖的Zend_Registry,但这似乎就像用胶带把东西放在一起;)

2 个答案:

答案 0 :(得分:4)

我相信你所指的是“命名段”。 Zend Framework的响应对象支持这些所谓的“命名段”,并允许您将正文内容分成不同的段。

例如,请使用以下布局文件:

<div id="nav">
    <?php echo $this->layout()->nav ?>
</div>
<div id="content">
    <?php echo $this->layout()->content ?>
</div>

这里有2个命名段,分别是“内容”和“导航”。默认情况下,视图脚本的输出将呈现为“内容”段。为了将输出呈现到“nav”段,您可以在控制器中执行以下操作:

<?php

$response = $this->getResponse();
$response->insert('nav', $view->render('nav.phtml'));

?>

与ActionStack操作助手一起使用时,此功能特别有用。例如,您处于管理页面,并且您想要覆盖“nav”部分,然后您可以确定每个控制器要将哪个部分渲染到该段。解释这个的最好方法是通过代码示例:

<?php

class PageController extends Zend_Controller_Action
{
    public function barAction()
    {
        // this would render the output of NavController::menuAction()
        // to the "nav" segment (note how we set the response segment in the
        // NavController in order to do this)
        $this->_helper->actionStack('menu', 'nav');
    }
}

class NavController extends Zend_Controller_Action
{
    public function menuAction()
    {
        $this->_helper->viewRenderer->setResponseSegment('nav'); 
        // do stuff
    }
}

?>

答案 1 :(得分:3)

通常你会有一个包含标题区域,导航面板,内容区域和侧边栏的布局。内容区域将使用您包含的$ this-&gt; layout() - &gt;内容片段加载,其他块可以在主布局中调用或包含在内。谐音。如果采用后一种方法,您的布局文件可能如下所示:

<html>
<head>
<title><?=$this->headTitle()?></title>
</head>

<body>

<?=$this->render('_header.phtml')?>

<?=$this->render('_navigation.phtml')?>

<?=$this->render('_sidebar.phtml')?>

<?=$this->layout()->content?>

</body>
</html>

如果您发现您的部分内容包含的PHP代码多于HTML,您可以考虑编写一个帮助程序。因此,您可以沿着这些行创建一个侧边栏帮助器:

<?php
class My_View_Helper_Sidebar extends Zend_view_Helper_Abstract
{
    public function sidebar()
    {
        $html = '';

        // code to generate side bar here

        return $html;
    }
}
?>

然后我不会像上面那样呈现部分,而是调用侧边栏助手:

<?=$this->sidebar()?>

控制器覆盖布局相当容易,因此您可能会创建一个管理布局,看起来像我上面的示例,但没有侧边栏,可能还有不同的标题。然后,您将使管理控制器使用此而不是默认值。

我可以想到你需要配置多个Zend_View对象的几种情况,你暗示你正在考虑这些对象。