内容简介:yii2视图(布局)中各种函数总结报告及使用场景
yii2布局文件里有很多函数,你是否研究过他们都是干嘛用的?这篇文章告诉你~
我们以安装完yii2程序后默认的布局为例说明
// @app/views/layouts/main.php
/* @var $this \yii\web\View */
/* @var $content string */
use yii\helpers\Html;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
<meta charset="<?= Yii::$app->charset ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="wrap">
<div class="container">
<?= $content ?>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-left">© My Company <?= date('Y') ?></p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
首先要说的是,布局其实就是视图,一种特殊的视图而已,所以我们明说布局函数,实质在说视图类View。
我就是我 $this
既然是一种特殊的视图,所以布局里面的 $this 对象其实就是当前视图本身,这在默认布局的注释里已经说明。
/* @var $this \yii\web\View */ /* @var $content string */
所以我建议你在阅读本文的时候,打开yiiwebView源代码同步进行。
写啥是啥 $content
这是在布局文件里除了 $this 外的第二个变量,我们都知道布局就像一个容器一样将基础架构先画出来,然后想用此结构的视图直接使用就可以了,那么 $content 就是使用此布局的视图自己的内容。
开山函数 beginPage 和 endPage
记住,所有的HTML我们都应该包含在 beginPage 和 endPage 函数之间,它们代表一个页面的开始和结束。
之外它们还分别触发了下面的两个事件
View::EVENT_BEGIN_PAGE View::EVENT_END_PAGE
如果你想统计视图页面内代码的渲染时间,可以在这两个事件上做做手脚。当然,endPage的作用要更加大,后面会单独拿出来说明。
资源在哪我说的算 head()
确切的说,该函数只是告诉了yii要将资源文件(比如js和css)放到页面的哪里,一般它在head标签内,如果你将它移到其他地方,你会发现将来页面的js文件和css文件等也转移了。
head有啥我来做 renderHeadHtml()
从名字你就可以知道,它负责将头部的一些代码渲染出来,比如js和css等文件的具体html标签,具体放哪?那必须是放到head()函数里指定的位置了,另外,这是一个protected类型方法,你不要想着能直接->就调用它,没门,它仅仅为View类的其他方法服务。
beginBody 和 endBody
这两个函数和 beginPage 和 endPage 有雷同的地方,就是做了两个标记,代表body的开始和结束,作为位置标签,另外也触发了两个事件
View::EVENT_BEGIN_BODY View::EVENT_END_BODY
当然 endBody 和 endPage 一样,还有其他职责,放到最后说,你先了解他们代表开始和结束,同时触发事件即可。
中场总结
上面说了 head、beginBody、endBody 都具有标签的作用,View为其设计了3个常量作为代表,分别如下
PH_HEAD // $this->head() PH_BODY_BEGIN // $this->beginBody() PH_BODY_END // $this->endBody
根据我们上面的了解,先画一个图出来,看看布局的可视化样子。
// 我是图 $this->beginPage() - <html> -- <head> $this->head() // PH_HEAD -- </head> -- <body> $this->beginBody() // PH_BODY_BEGIN $content $this->endBody() // PH_BODY_END -- </body> - </html> $this->endPage()
renderBodyBeginHtml 和 renderBodyEndHtml 函数
上面我们知道有一个叫做 renderHeadHtml 方法负责往 PH_HEAD 位置放资源文件,那么PH_BODY_BEGIN和PH_BODY_END 也应该同类待遇,renderBodyBeginHtml和renderBodyEndHtml就是干这个的。
而从代码来看 renderBodyBeginHtml 和 renderBodyEndHtml 做的事情和 renderHeadHtml 差不多,都是资源的具体代码话,你是否记得我们在兄弟连时候有一节( http://nai8.me/course-video.h... )说过关于asset资源类位置的问题(指定资源在页面的上部还是下部),对,renderBodyBeginHtml、renderBodyEndHtml 等就是做这个的。
我们分条说下
-
renderBodyBeginHtml渲染的是位置为 POS_BEGIN 的js文件
-
renderBodyEndHtml渲染的是位置为 POS_END、POS_READY、POS_LOAD的js文件
-
renderHeadHtml渲染的是位置为POS_HEAD的js文件和所有css文件(无位置功能)以及一些head的metaTags。
现在你明白了吧,到此刻,你知道了有三个函数负责三个位置的代码渲染,而这些渲染其实就是资源的代码实现。
再说endPage
到现在,万事俱备,但是东风在哪里?它就是endPage
看一部分endPage的源代码我们
echo strtr($content, [
self::PH_HEAD => $this->renderHeadHtml(),
self::PH_BODY_BEGIN => $this->renderBodyBeginHtml(),
self::PH_BODY_END => $this->renderBodyEndHtml($ajaxMode),
]);
endPage活生生的实现了代码和位置之间的替换,说白了就是字符串替换。。。
当然,在View类里还有一些小方法,比如registerJs()、clear()等等,阿北相信当你了解了布局(视图)形成的流程后,这些很容易看懂,如果还不懂,请留言此贴问。
最后一个例子
如果我们把最后相应给客户的页面比作一栋大楼。那么看看角色的分类
-
布局 代表大楼图纸(代表着一个框架)
-
资源类 代表购物清单
-
View的三个render函数 代表具体的建筑工人,采购资源类,并放到大楼里。
-
endPage函数,就是售楼许可证,保证所有资源都到位。
-
使用布局的视图 就是人,入驻大楼,没有视图的布局都是纸老虎。
(完)
更多yii2干货 http://nai8.me
以上所述就是小编给大家介绍的《yii2视图(布局)中各种函数总结报告及使用场景》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Django 基于函数的视图与基于类的视图
- flask视图函数自定义转换器
- 从源码角度理解Django中给特定视图函数放开CSRF校验的原理
- iOS小技巧·把子视图控制器的视图添加到父视图控制器
- CouchDB 视图简介及增量更新视图的方法
- c# – 将数据从部分视图传递到其父视图
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序设计方法(中文版)
Matthias Fellisen / 黄林鹏、朱崇恺 / 人民邮电出版社 / 2003-12 / 49.00元
《程序设计方法》以Scheme语言为基础介绍计算和程序设计的一般理论和实践。《程序设计方法》由8个部分和7个独立的章节(第8、13、18、24、29、33、38章)组成。8个部分主要讨论程序设计,独立章节则介绍一些与程序设计和计算相关的话题。《程序设计方法》第1至第3部分介绍了基于数据驱动的程序设计基础。第4部分介绍了程序设计中的抽象问题。第5部分和第6部分是与递归及累积相关的内容。《程序设计方法......一起来看看 《程序设计方法(中文版)》 这本书的介绍吧!