内容简介: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# – 将数据从部分视图传递到其父视图
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning PHP, MySQL, and JavaScript
Robin Nixon / O'Reilly Media / 2009-7-21 / USD 39.99
Learn how to create responsive, data-driven websites with PHP, MySQL, and JavaScript - whether or not you know how to program. This simple, streamlined guide explains how the powerful combination of P......一起来看看 《Learning PHP, MySQL, and JavaScript》 这本书的介绍吧!
图片转BASE64编码
在线图片转Base64编码工具
UNIX 时间戳转换
UNIX 时间戳转换