先试下出个页面 - 模板

  • 作者:KK

  • 发表日期:2016.12.8

  • 更新日期:2018.8.6

    补充了“使用 layout 时自定义各页面的标题”小节。


基本使用

Yii2默认是不用模板引擎的,模板目录则是views 目录

比如上一篇文章中叫你创建了test控制器,则在这个views目录下也建一个test目录,里面创建一个 index.php ,输入一些你想测试的显示内容

这样就部署好一个页面模板了,接下来要显示它,在test控制器的方法里执行

return $this->renderPartial('index');

就可以输出页面了

  • 明白了吧,控制器ID叫test的话,$this->renderPartial('index')的时候就会自动去views目录根据控制器ID找到test目录,再找指定的index.php来输出

本质上不叫输出,而叫渲染,它返回个HTML字符串而已

把test方法的代码改成这样试试:

$content = $this->renderPartial('index');
file_put_contents('D:/a.html', $content); // 具体的文件路径自己拟定
return '输出内容';

访问后会看到“输出内容”,再打开D:/a.html,发现里面有HTML内容

因为$content就是这个HTML字符串,renderPartial方法返回的就是根据index.php这个模板渲染后的一个字符串

所以概念上来说renderPartial不是输出模板,而是渲染模板,不过我们有时候交流方便直接说输出模板而已,这样其实大家都知道是把渲染结果return给框架

那其实echo $this->renderPartial('index');也是可以输出页面的


注册变量

要传递一个叫做nameage的变量给模板,控制器要在renderPartial里传入第二个参数,比如这样:

return $this->renderPartial('index', [
	'name' => '小明',	//注册name变量给模板,就是$name
	'age' => '15',	//你懂的
]);

那模板就可以直接调用输出了

echo $name;
echo $age;

Layout(模板布局)

现在许多流程框架都有一个叫“模板布局“的概念,不管叫什么,反正它们通常都是要实现同一个普遍的网站需求:大部分页面都使用相同的页眉和页脚

在yii里是这样解决的,在views里有个layouts文件夹,你在里面创建一个叫common.php的文件(这就是模板布局文件),编写以下代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>XXX网站"pageMainContent"><?php echo $content; ?></div>
	<footer>页脚

然后将test方法改成这样:

public function actionTest(){
	$this->layout = 'common';
	return $this->render('index');
}

好了,刷新页面你会发现类似我这样的页面输出:

估计你也懂了,views/layouts/common.php 这个模板定义了各页面的页眉和页脚内容,通过echo $content把中间部分输出就可以了,但这里要注意,需要用 render 方法才可以使用layout布局,如果你改成$this->renderPartial('index')

就会不使用layout的,比如特定的活动页面或别的页面不使用公共页眉页脚才用renderPartial

  • 默认 layout 和指定 layout

    但你可能会疑惑是不是每次render前都要设置 $this->layout属性呢?

    其实不用的,这个layout属性的默认值是main,如果你不设置它,它就会以views/layouts/main.php作为模板布局(官方已经放好这个文件了,你拿着改也可以),接下来你可以尝试着去掉$this->layout的赋值,直接render,就会以自带的main这个layout作为布局进行渲染了。

    如果你想整个控制器所有action进行render的时候都统一用另一个layout的话可以重写父类的属性声明public $layout = 'common';这样来定义。

    而如果要整个站点都用另一个layout都可以,以后再说,因为涉及配置文件的知识。


使用 layout 时自定义各页面的标题

在上面的 layout 里写死了title叫“XXX网站”这是不行的,因为实际上每个页面的标题都会各不相同,一般我们应该这样做:

  1. layout 的 title 如此输出:

    <title><?php echo $this->title; ?> - 汽车论坛
  2. 在主内容模板里对$this->title进行赋值:

    echo $this->title = '主题列表';
    

然后就会输出“主题列表 - 汽车论坛”这样的标题了。