视图(View)
视图(View)这一部分比较多,总共包括11个知识点:
- 基本定义
- 部件(Widget)
- 安全
- 模板引擎
- 在模板中使用视图对象
- 设置页面标题
- 添加meta标签
- 注册连接标签
- 注册CSS
- 注册脚本
- 注册asset bundles
- 布局(Layout)
- 局部(Partial)
- 访问上下文
- 静态页面
- 缓存区块
- 自定义视图组件
视图基本上就是我们所说的在views文件夹中的显示前台页面的模板。 另外还有一个对应的视图类(yii\web\view)这个是在Yii2中新增加的,我们在views中的模板文件中看到的$this对象就是Yii2中的视图对象。 我们下面就用模板来称呼前台view中的视图,以便和yii\web\view这个视图类混淆。
默认情况下,Yii使用php语言来解析模板,也就是说在views中的模板里面直接用php代码来输出数据。
在模板页面最好不要包含复杂的php逻辑代码,应该尽可能的把它们放到控制器或者部件里面去实现。
模板一般在控制器中的动作(Action)里执行 render()方法的时候调用。
- public function actionIndex()
- {
- return $this->render('index', ['username' => 'samdark']);
- }
在这里只需要添加模板的文件名就可以了,不用加路径以及后缀。Yii会在当前控制器的 ID(如 site)目录下搜索这个模板文件。
如当前控制器是SiteController,那个将会在views/site目录下面搜索index文件。
如果想知道Yii是怎样查找视图文件的可以查看 yii\base\Controller::render()
第二个参数是一个name-value的数组。这个数组会直接传递到views目录中的模板文件里面,并且name可直接作为php变量来引用,value就是对应的变量的值。如上面的index视图文件为 views/site/index.php。
- <p>Hello, <?= $username ?>!</p>
除了上面说的render()方法外,在yii\web\Controller中还有几种加载视图的方法:
- render():渲染一个模板,然后对渲染的结果应用布局文件。这个是通常用来渲染一个完整的页面。
- renderPartial():仅仅渲染一个模板,不对渲染的结果使用布局文件。通常用来渲染页面的局部。
- renderAjax():也是只渲染模板,不使用布局文件,但会加载所有注册的js/css等脚本文件。通常把渲染的html代码作为Ajax请求的响应。
- renderFile()渲染一个模板文件,基本和renderPartial()功能一样,只不过这里要求的是文件的路径而不是文件的名称。
部件是视图中的独立的区块,用来把一些复杂的逻辑、页面显示及相应的功能实到一个独立的组件中。
Yii内置很多常用的部件,如表单(active form),面包屑(breadcrumbs),菜单(menu)以及对bootstrap的包装。另外在某些扩展组件中也提供了部件,如官方的jQueryUI组件。
下面是在视图文件中使用部件的例子:
- // Note that you have to "echo" the result to display it
- //输出部件Menu中的内容
- echo \yii\widgets\Menu::widget(['items' => $items]);
- // Passing an array to initialize the object properties
- //可往部件中传递参数来初始化部件
- $form = \yii\widgets\ActiveForm::begin([
- 'options' => ['class' => 'form-horizontal'],
- 'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']],
- ]);
- ... form inputs here ...
- \yii\widgets\ActiveForm::end();