视图名
渲染视图时,可指定一个视图名或视图文件路径/别名,大多数情况下使用前者因为前者简洁灵活, 我们称用名字的视图为 视图名.
视图名可以依据以下规则到对应的视图文件路径:
视图名可省略文件扩展名,这种情况下使用 .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。
echo $this->render('report', [ 'foo' => 1, 'bar' => 2, ]);
拉取方式可让视图从yii\base\View视图组件或其他对象中主动获得数据(如Yii::$app), 在视图中使用如下表达式$this->context可获取到控制器ID, 可让你在report视图中获取控制器的任意属性或方法,如以下代码获取控制器ID。
The controller ID is: <"htmlcode">$this->params['breadcrumbs'][] = 'About Us';在布局文件(也是一个视图)中,可使用依次加入到yii\base\View::params数组的值来 生成显示breadcrumbs:
<"htmlcode"><"en"> <head> <meta charset="UTF-8"/> <"htmlcode">namespace app\controllers; use yii\web\Controller; class PostController extends Controller { public $layout = 'post'; // ... }对于模块中的控制器,可配置模块的 yii\base\Module::layout 属性指定布局文件应用到模块的所有控制器。
由于layout 可在不同层级(控制器、模块,应用)配置,在幕后Yii使用两步来决定控制器实际使用的布局。
第一步,它决定布局的值和上下文模块:
如果控制器的 yii\base\Controller::layout 属性不为空null,使用它作为布局的值, 控制器的 yii\base\Controller::module模块 作为上下文模块。
如果 yii\base\Controller::layout 为空,从控制器的祖先模块(包括应用) 开始找 第一个yii\base\Module::layout 属性不为空的模块,使用该模块作为上下文模块, 并将它的yii\base\Module::layout 的值作为布局的值, 如果都没有找到,表示不使用布局。
第二步,它决定第一步中布局的值和上下文模块对应到实际的布局文件,布局的值可为:路径别名 (如 @app/views/layouts/main).
绝对路径 (如 /main): 布局的值以斜杠开始,在应用的[[yii\base\Application::layoutPath|layout path] 布局路径 中查找实际的布局文件,布局路径默认为 @app/views/layouts。
相对路径 (如 main): 在上下文模块的yii\base\Module::layoutPath布局路径中查找实际的布局文件, 布局路径默认为yii\base\Module::basePath模块目录下的views/layouts 目录。
布尔值 false: 不使用布局。
布局的值没有包含文件扩展名,默认使用 .php作为扩展名。嵌套布局
有时候你想嵌套一个布局到另一个,例如,在Web站点不同地方,想使用不同的布局, 同时这些布局共享相同的生成全局HTML5页面结构的基本布局,可以在子布局中调用 yii\base\View::beginContent() 和yii\base\View::endContent() 方法,如下所示:
<"htmlcode">... <"htmlcode">... <"htmlcode">[ // ... 'components' => [ 'view' => [ 'class' => 'app\components\View', ], // ... ], ]视图组件提供如下实用的视图相关特性,每项详情会在独立章节中介绍:
- 主题: 允许为你的Web站点开发和修改主题;
- 片段缓存: 允许你在Web页面中缓存片段;
- 客户脚本处理: 支持CSS 和 JavaScript 注册和渲染;
- 资源包处理: 支持 资源包的注册和渲染;
- 模板引擎: 允许你使用其他模板引擎,如 Twig, Smarty。
开发Web页面时,也可能频繁使用以下实用的小特性。
设置页面标题
每个Web页面应有一个标题,正常情况下标题的标签显示在 布局中, 但是实际上标题大多由内容视图而不是布局来决定,为解决这个问题, yii\web\View 提供 yii\web\View::title 标题属性可让标题信息从内容视图传递到布局中。
为利用这个特性,在每个内容视图中设置页面标题,如下所示:
<"htmlcode"><"keywords" 元标签,在布局渲染后会渲染该注册的元标签, 然后,如下HTML代码会插入到布局中调用yii\web\View::head()方法处:<meta name="keywords" content="yii, framework, php">注意如果多次调用 yii\web\View::registerMetaTag() 方法,它会注册多个元标签,注册时不会检查是否重复。
为确保每种元标签只有一个,可在调用方法时指定键作为第二个参数, 例如,如下代码注册两次 "description" 元标签,但是只会渲染第二个。
$this->registerMetaTag(['name' => 'description', 'content' => 'This is my cool website made with Yii!'], 'description'); $this->registerMetaTag(['name' => 'description', 'content' => 'This website is about funny raccoons.'], 'description');注册链接标签
和 Meta标签 类似,链接标签有时很实用,如自定义网站图标,指定Rss订阅,或授权OpenID到其他服务器。 可以和元标签相似的方式调用yii\web\View::registerLinkTag(),例如,在内容视图中注册链接标签如下所示:
$this->registerLinkTag([ 'title' => 'Live News for Yii', 'rel' => 'alternate', 'type' => 'application/rss+xml', 'href' => 'http://www.yiiframework.com/rss.xml/', ]);上述代码会转换成
复制代码 代码如下:
<link title="Live News for Yii" rel="alternate" type="application/rss+xml" href="http://www.yiiframework.com/rss.xml/">
和 yii\web\View::registerMetaTag() 类似, 调用yii\web\View::registerLinkTag() 指定键来避免生成重复链接标签。视图事件
yii\base\View 视图组件会在视图渲染过程中触发几个事件, 可以在内容发送给终端用户前,响应这些事件来添加内容到视图中或调整渲染结果。
- yii\base\View::EVENT_BEFORE_RENDER: 在控制器渲染文件开始时触发, 该事件可设置 yii\base\ViewEvent::isValid 为 false 取消视图渲染。
- yii\base\View::EVENT_AFTER_RENDER: 在布局中调用 yii\base\View::beginPage() 时触发, 该事件可获取yii\base\ViewEvent::output的渲染结果,可修改该属性来修改渲染结果。
- yii\base\View::EVENT_BEGIN_PAGE: 在布局调用 yii\base\View::beginPage() 时触发;
- yii\base\View::EVENT_END_PAGE: 在布局调用 yii\base\View::endPage() 是触发;
- yii\web\View::EVENT_BEGIN_BODY: 在布局调用 yii\web\View::beginBody() 时触发;
- yii\web\View::EVENT_END_BODY: 在布局调用 yii\web\View::endBody() 时触发。
例如,如下代码将当前日期添加到页面结尾处:
\Yii::$app->view->on(View::EVENT_END_BODY, function () { echo date('Y-m-d'); });渲染静态页面
静态页面指的是大部分内容为静态的不需要控制器传递动态数据的Web页面。
可将HTML代码放置在视图中,在控制器中使用以下代码输出静态页面:
public function actionAbout() { return $this->render('about'); }如果Web站点包含很多静态页面,多次重复相似的代码显得很繁琐, 为解决这个问题,可以使用一个在控制器中称为 yii\web\ViewAction 的独立操作。 例如:
namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { public function actions() { return [ 'page' => [ 'class' => 'yii\web\ViewAction', ], ]; } }现在如果你在@app/views/site/pages目录下创建名为 about 的视图, 可通过如下rul显示该视图:
http://localhost/index.php?r=site/page&view=about
GET 中 view 参数告知 yii\web\ViewAction 操作请求哪个视图,然后操作在 @app/views/site/pages目录下寻找该视图,可配置 yii\web\ViewAction::viewPrefix 修改搜索视图的目录。最佳实践
视图负责将模型的数据展示用户想要的格式,总之,视图
- 应主要包含展示代码,如HTML, 和简单的PHP代码来控制、格式化和渲染数据;
- 不应包含执行数据查询代码,这种代码放在模型中;
- 应避免直接访问请求数据,如 $_GET, $_POST,这种应在控制器中执行, 如果需要请求数据,应由控制器推送到视图。
- 可读取模型属性,但不应修改它们。
- 为使模型更易于维护,避免创建太复杂或包含太多冗余代码的视图,可遵循以下方法达到这个目标:
- 使用 布局 来展示公共代码(如,页面头部、尾部);
- 将复杂的视图分成几个小视图,可使用上面描述的渲染方法将这些小视图渲染并组装成大视图;
- 创建并使用 小部件 作为视图的数据块;
- 创建并使用助手类在视图中转换和格式化数据。
标签:PHP,Yii,视图,view
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com桃源资源网 Design By www.nqtax.com暂无“PHP的Yii框架中View视图的使用进阶”评论...P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。