您可以渲染一个包含侧边栏元素的“部分视图脚本”,而不是使用操作堆栈和 action() 视图助手。
# in your layout.phtml
<div id="sidebar">
<?php echo $this->render('blog/_sidebar.phtml'); /*relative to your view scripts directory*/ ?>
</div>
# in blog/_sidebar.phtml
<div id="blog_categories">
<?php foreach ($this->categories as $category): ?>
<?php echo $category->name; ?>
<?php endforeach; ?>
</div>
render() 视图助手用于渲染另一个视图脚本的内容。它与所有其他视图脚本具有相同的范围,因此如果有任何变量分配给视图,它们将可用于您的部分。所以在上面的例子中,categories 变量是在控制器中设置的。
还有另一个视图助手称为partial() 视图助手。这个函数有点贵,因为它创建了自己的变量范围。换句话说,您当前的视图变量都将不可用。你将有一个干净的工作,这意味着你必须传递你需要的任何变量:
# in your layout.phtml
<div id="sidebar">
<?php echo $this->partial('blog/_sidebar.phtml', array('categories2'=>$this->categories)); ?>
</div>
# in blog/_sidebar.phtml
<div id="blog_categories">
<?php foreach ($this->categories2 as $category): ?>
<?php echo $category->name; ?>
<?php endforeach; ?>
</div>
我发现自己不经常使用partial(),因为它更昂贵,而且我很少需要创建单独的上下文。
就设置在侧边栏部分中使用的变量(本示例中为$this->categories)而言,我根据特定问题使用了许多不同的方法。如果它特定于控制器动作,我将编写代码并在视图脚本中分配它:
# controller
public function somethingAction()
{
$this->view->categories = $this->_getCategoriesForThisParticularAction();
// other controller code
}
如果我的代码对控制器的所有操作更通用,我将使用控制器的preDispatch() 函数。如果它对多个控制器更通用,我会将代码放在我的基本控制器的init()(我的大部分控制器都扩展的控制器)。
有时我什至没有将代码放入我的控制器中。如果它足够简单,我只需将代码粘贴在部分中。如果它更复杂一点,我会将其移至视图助手。这可能会破坏 MVC 模式,但我认为这确实取决于特定情况以确定最佳位置。