视图名
渲染视图时,可指定一个视图名或视图文件路径/别名,大多数情况下使用前者因为前者简洁灵活, 我们称用名字的视图为 视图名.
视图名可以依据以下规则到对应的视图文件路径:
视图名可省略文件扩展名,这种情况下使用 .PHP 作为扩展, 视图名 about 对应到 about.PHP 文件名; 视图名以双斜杠 // 开头,对应的视图文件路径为 @app/views/ViewName, 也就是说视图文件在 yii\base\Application::viewPath 路径下找, 例如 //site/about 对应到 @app/views/site/about.PHP。 视图名以单斜杠/开始,视图文件路径以当前使用模块 的yii\base\Module::viewPath开始, 如果不存在模块,使用@app/views/ViewName开始,例如,如果当前模块为user, /user/create 对应成@app/modules/user/views/user/create.PHP,如果不在模块中,/user/create对应@app/views/user/create.PHP。 如果 yii\base\View::context 渲染视图 并且上下文实现了 yii\base\ViewContextInterface,视图文件路径由上下文的 yii\base\ViewContextInterface::getViewPath() 开始, 这种主要用在控制器和小部件中渲染视图,例如 如果上下文为控制器SiteController,site/about 对应到 @app/views/site/about.PHP。 如果视图渲染另一个视图,包含另一个视图文件的目录以当前视图的文件路径开始, 例如被视图@app/views/post/index.PHP 渲染的 item 对应到 @app/views/post/item。 根据以上规则,在控制器中 app\controllers\PostController 调用 $this->render('view'), 实际上渲染@app/views/post/view.PHP 视图文件,当在该视图文件中调用 $this->render('_overview') 会渲染@app/views/post/_overview.PHP 视图文件。
视图中访问数据
在视图中有两种方式访问数据:推送和拉取。
推送方式是通过视图渲染方法的第二个参数传递数据,数据格式应为名称-值的数组, 视图渲染时,调用PHP extract() 方法将该数组转换为视图可访问的变量。 例如,如下控制器的渲染视图代码推送2个变量到 report 视图:$foo = 1 和 $bar = 2。
拉取方式可让视图从yii\base\View视图组件或其他对象中主动获得数据(如Yii::$app), 在视图中使用如下表达式$this->context可获取到控制器ID, 可让你在report视图中获取控制器的任意属性或方法,如以下代码获取控制器ID。
推送方式让视图更少依赖上下文对象,是视图获取数据优先使用方式, 缺点是需要手动构建数组,有些繁琐,在不同地方渲染时容易出错。
视图间共享数据
yii\base\View视图组件提供yii\base\View::params参数属性来让不同视图共享数据。
例如在about视图中,可使用如下代码指定当前breadcrumbs的当前部分。
在布局文件(也是一个视图)中,可使用依次加入到yii\base\View::params数组的值来 生成显示breadcrumbs:
布局
布局是一种特殊的视图,代表多个视图的公共部分,例如,大多数Web应用共享相同的页头和页尾, 在每个视图中重复相同的页头和页尾,更好的方式是将这些公共放到一个布局中, 渲染内容视图后在合适的地方嵌入到布局中。
创建布局
由于布局也是视图,它可像普通视图一样创建,布局默认存储在@app/views/layouts路径下, 模块中使用的布局应存储在yii\base\Module::basePath模块目录 下的views/layouts路径下,可配置yii\base\Module::layoutPath来自定义应用或模块的布局默认路径。
如下示例为一个布局大致内容,注意作为示例,简化了很多代码, 在实际中,你可能想添加更多内容,如头部标签,主菜单等。
/ @var $content string 字符串 /
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="en"> <Meta charset="UTF-8"/> = Html::csrfMetaTags() ?>