Phalcon 有多种渲染级别,他们的嵌套关系,简单来说就是这张图:
我们必须在外层视图文件中调用 <?php echo $this->getContent(); ?>
的方法,使他们能够嵌套起来。如果是 volt 引擎的话,可以使用 {{ content() }}
,它经过 volt 编译后和前面的方法是一样的。
我们可以通过$this->view->setRenderLevel(View::LEVEL_MAIN_LAYOUT);
的方法选择渲染级别。
类常量 | 解释 | 顺 序 |
---|---|---|
LEVEL_NO_RENDER | 表明要避免产生任何形式的显示 | |
LEVEL_ACTION_VIEW | 生成显示到视图关联的动作 | 1 |
LEVEL_BEFORE_TEMPLATE | 生成显示到控制器模板布局之前 | 2 |
LEVEL_LAYOUT | 生成显示到控制器布局 | 3 |
LEVEL_AFTER_TEMPLATE | 生成显示到控制器模板布局后 | 4 |
LEVEL_MAIN_LAYOUT | 生成显示到主布局 | 5 |
我们可以在 controller 的 initialize() 方法中,使用下面的方法来指定 Level_After_Template 和 Level_Before_Template 对应的文件。
$this->view->setTemplateBefore('before');
$this->view->setTemplateAfter('after');
也可以在某方法中使用 $this->view->disableLevel(View::LEVEL_AFTER_TEMPLATE);禁用对应的模板调用。
以渲染 testController helloAction 为例,它们的目录结构应该是这样
其中,views 根目录下的 index.phtml 是主布局文件。
layouts 文件夹下的三个文件分别对应,Level_After_Template、Level_Before_Template、Level_Layout。
test 文件夹是对应 testController 下每一个 action 的视图,hello 就是 testController 下 helloAction 对应的视图。
Level_Main_Layout 默认是 index.phtml 或 index.volt,后缀取决去你的模板渲染引擎,而且这个文件必须是视图文件夹的根目录下。我们可以可以通过 setMainView('test/index')
的方法指定为 views 根目录下的其他文件。
下面是有关的部分源码。
protected _mainView = "index";
/**
* Sets default view name.
* Must be a file without extension in the views directory
*
* <code>
* //Renders as main view views-dir/base.phtml
* $this->view->setMainView('base');
* </code>
*/
public function setMainView(string viewPath) -> <View>
{
let this->_mainView = viewPath;
return this;
}
/**
* Returns the name of the main view
*/
public function getMainView() -> string
{
return this->_mainView;
}