2

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;
}

西山雨
1.3k 声望26 粉丝

fighting


引用和评论

0 条评论