Phalcon 有多种渲染级别,他们的嵌套关系,简单来说就是这张图:
我们必须在外层视图文件中调用 <?php echo $this->getContent(); ?>
的方法,使他们能够嵌套起来。如果是 volt 引擎的话,可以使用 {{ content() }}
,它经过 volt 编译后和前面的方法是一样的。
那为什么使用 getContent() 方法呢,我们先看一下源码中它的作用是什么
/**
* Externally sets the view content
*
*<code>
* $this->view->setContent("<h1>hello</h1>");
*</code>
*/
public function setContent(string content) -> <View>
{
let this->_content = content;
return this;
}
/**
* Returns cached output from another view stage
*/
public function getContent() -> string
{
return this->_content;
}
而 $this->_content 是在什么时候被赋值的,我们需要了解 Phalcon 整个 view 层的渲染原理和过程:http://segmentfault.com/a/1190000004358686
我们可以通过$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');
以渲染 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()
的方法指定为 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;
}
关于 view 的渲染原理和过程,参考我的另一篇博文:http://segmentfault.com/a/1190000004358686
更多细节参考官网文档:https://docs.phalconphp.com/zh/latest/reference/views.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。