我的布局有4个单独的“块”。他们是:
内容区域符合Zend_Application文档所述的传统单一视图模型,但其他三种模型不符合。它们都有合理的默认视图可供使用,但控制器需要能够在需要时覆盖它们。例如,管理页面覆盖“新闻”视图以显示系统上最近采取的管理操作的日志是有意义的。
然而,Zend_Layout
/ Zend_Application
示例都采用单一视图(他们称之为<?php echo $this->layout()->content; ?>
。
如何实现这种覆盖布局?我想到的唯一解决方案是在Zend_View
内存储被覆盖的Zend_Registry
,但这似乎就像用胶带把东西放在一起;)
答案 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对象的几种情况,你暗示你正在考虑这些对象。