使用mui制作页面案例(Yii框架页面渲染操作实例详解)
使用mui制作页面案例
Yii框架页面渲染操作实例详解本文实例讲述了yii框架页面渲染操作。分享给大家供大家参考,具体如下:
1、一般页面渲染
yii的页面渲染通过在controller的action中调用$this->render($viewname...)
进行,流程如下图:
在render方法中,yii会先对你的view文件进行渲染,然后如果你使用了某些layouts,则会将view渲染的输出再传入对layouts的渲染方法中,上述这两步在虚线框中表示了,简单的页面渲染就是这样的。
当然这里面有些技巧需要注意,首先是黑框中显示的那几行代码(位于renderinternal方法中),yii首先启用输出缓冲,并禁止隐式的冲掉缓冲,然后require需要渲染的视图文件,最后再获取缓冲区的全部内容,即最终的渲染结果。这样处理有3个好处:
1.视图文件中多次echo也必须最后一起输出;
2.可以在视图文件中使用$this,即当前的controller对象。
3.第三个好处是这样的,黑框中漏掉了一句“extract($_data_,extr_prefix_same,'data');
”,extract
函数的作用是将$_data_数组中的$key=>$value
对变成当前作用域中的$key = $value赋值,这样视图文件中就可以直接使用$key引用$value的值了。不知道smarty中变量赋值是怎么进行的,但是感觉yii这种方式高效很多,因为不再需要使用php实现词法分析之类的功能了。
这个技巧我们可以自己简单实现一下,就会明白它的原理了。编写代码如下:
|
class controller { private $name = '' ; public function __construct( $name ) { $this ->name = $name ; } public function render( $viewname , $data ) { extract( $data , extr_prefix_same, 'data' ); ob_start(); ob_implicit_flush(0); require ( $viewname . '.php' ); echo ob_get_clean(); } } $ctrl = new controller( 'php' ); $ctrl ->render( 'view' , array ( 'age' =>20)); //模仿render方法调用 echo $this ->name . "\n" . $age . "\n" ; //view.php只有一句 |
假设第一段代码存为controller.php,第二段存为view.php(若存为其他名字,请相应修改调用render时传入的名字),在终端执行php controller.php会输出:
php
20
本来view.php中是没有$this和$age的,但是因为require时给予了它render方法的作用域,并且采用了extract方法操作传入的数组参数,使得读取这两个变量成为可能。
2、嵌套了layout的视图文件的渲染
这里嵌套是指controller采用了layout1并渲染视图view,而layout1又采用了布局layout2。采用layout1并渲染view是上
一部分的内容,而在layout1中采用layout2是这部分要讲的。采用这种方式进行渲染,通常需要在layout1中调用
controller的begincontent(layout2)
方法,并传入layout2的名称,然后在渲染结束后再调用controller的endcontent()
方法结束渲染过程。伪码如下:
|
<?php // $this is the controller $this ->begincontent( 'layout2' ); ?> some html and / or <?php echo $content ; ?> <?php $this ->endcontent(); ?> |
这里就要讲这两个方法以及整个过程的实现机制。先来看begincontent的工作流程:
请注意这一连串的过程都是在当前controller的作用域进行的。可以看到begincontent调用beginwidget并传入了一个类名,这个类的实例就是后面的widget,表示了一个装饰器,注意在createwidget时传入了当前controller的实例,并且会对widget的view属性赋值为layout名称(这里的过程还要稍微复杂些,但是大致的意图是这样的,具体可参考源码),这两个变量后面有用;然后调用widget的init方法使其初始化,并将其缓存到controller的一个stack中。值得注意的是init方法里做了什么:很熟悉,打开了输出缓冲区。用途是什么,看了第一部分你应该懂~~下面再看endcontent的执行过程:
这个过程稍微复杂些,先说明一直到第一个虚线框(包括)都是在当前controller的作用域,之后都是在widget的作用域了。可以看到调用endcontent之后其实先从controller的那个stack中弹出了先前保存的widget,然后调用widget的run方法。之后就主要是widget的工作了,首先是熟悉的ob_get_clean()拿到缓冲区中的内容,参考伪码你会明白,此时缓冲区中的内容是“some html and/or ...”,即你写的页面html和要echo出的东西;然后重要的工作在decorate方法中,它会通知controller去获取layout文件,并通知controller渲染这个文件,但是controller在哪儿?就是widget的owner属性,表示谁拥有这个widget,还记得在begincontent中向widget实例传入了controller对象吧?:) 之后的过程就简单了,跟渲染普通视图文件一样,只不过这里会将从缓冲区得到的内容全部传给视图文件,并获取最终的渲染结果。
同样的,我们也可以写个demo模拟这个渲染过程,编写代码如下:
|
<?php class decorator { public function begin() { ob_start(); ob_implicit_flush(0); } public function decorate( $content ) { echo 'from decorator ' . $content ; } public function end () { $output = ob_get_clean(); $this ->decorate( $output ); } } ?> |
|
require_once ( 'dec.php' ); $dec = new decorator(); $dec ->begin(); ?> <h1>sddfds</h1> <?php echo 'hello' ; ?> <?php $dec -> end (); ?> |
假设第一段代码为dec.php表示装饰器,第二段为layout.php,表示布局文件,运行php layout.php应该会输出:
from decorator
<h1>sddfds</h1>
hello
这个简化的过程能方便理解框架里的渲染流程。
3、总结
yii的两种渲染过程都有效的利用了语言的输出缓冲,而第二种方式更是通过将“开缓冲”和“取缓冲”的操作分离开,进而实现了对这两个操作之间的输出内容进行装饰的功能。
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/zhaozhi406/article/details/897473
- 使用mui制作页面案例(Yii框架页面渲染操作实例详解)
- yii框架使用教程(Yii框架连表查询操作示例)
- yii2对比springboot(Yii框架函数简单用法分析)
- php使用yield处理并发(Yii框架中使用PHPExcel的方法分析)
- yii2支持php7.2吗(Yii框架通过请求组件处理get,post请求的方法分析)
- yii框架使用教程(Yii框架分页技术实例分析)
- 基于yii2框架的开源系统(Yii框架参数配置文件params用法实例分析)
- pythonyield使用场景(Yii框架核心组件类实例详解)
- thinkphp导入excel(Yii框架使用PHPExcel导出Excel文件的方法分析改进版)
- yii框架的常用组件使用(Yii框架的布局文件实例分析)
- yii2对比springboot(Yii框架响应组件用法实例分析)
- apache和yii域名配置(yii框架数据库关联查询操作示例)
- yii2支持的数据库(Yii框架常见缓存应用实例小结)
- 如何让yii2高级模板运行起来(Yii框架数据库查询、增加、删除操作示例)
- yii与uniapp交互(Yii框架的路由配置方法分析)
- yii2对比springboot(Yii框架实现对数据库的CURD操作示例)
- 这支 奇兵队 腕大 有范儿还各怀绝技,毒贩杀人犯见了都要仓皇而逃(这支奇兵队腕大)
- 雄藩崛起 奇兵队与幕末长州藩军事改革(雄藩崛起奇兵队与幕末长州藩军事改革)
- 九月初,爱如蜜糖,甜到心扉,迷恋彼此,一日不见兮,思之若狂(九月初爱如蜜糖)
- ()
- 对你思念入骨的女人,跟你见面时会有这几种表现,藏都藏不住(对你思念入骨的女人)
- 纳兰性德绝美作,一场重逢,成就最后一首称得上惊艳的《如梦令》(纳兰性德绝美作)
热门推荐
- zabbix客户端看什么网络监控数据(分布式监控系统之Zabbix主动、被动及web监控的过程详解)
- sqlservercount函数怎么用(Sql Server中Substring函数的用法实例解析)
- sql server内外连接的作用(浅谈SQL Server交叉联接 内部联接)
- js中substring的用法、与substr的区别
- yii2对比springboot(Yii框架响应组件用法实例分析)
- apache架构设计参数详解(Apache之AllowOverride参数使用说明)
- centosdocker安装教程(centos下docker安装及springboot远程发布docker的方法)
- thinkphp5框架怎么设置(thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例)
- mysqlexplain各个字段作用(MySQL EXPLAIN语句的使用示例)
- python学生管理系统的思路(python实现学员管理系统)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9