今天就跟大家聊聊有关使用Yii框架怎么实现一个页面渲染操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
<强> 1,一般页面渲染强>
Yii的页面渲染通过在控制器的动作中调用<代码> $ this→渲染($ viewname…) 代码>进行,流程如下图:
在渲染方法中,Yii会先对你的看法文件进行渲染,然后如果你使用了某些布局,则会将视图渲染的输出再传入对布局的渲染方法中,上述这两步在虚线框中表示了,简单的页面渲染就是这样的。
当然这里面有些技巧需要注意,首先是黑框中显示的那几行代码(位于renderInternal方法中),Yii首先启用输出缓冲,并禁止隐式的冲掉缓冲,然后要求需要渲染的视图文件,最后再获取缓冲区的全部内容,即最终的渲染结果。这样处理有3个好处:
1。视图文件中多次回波也必须最后一起输出;
2。可以在视图文件中使用美元,即当前的控制器对象。
3。第三个好处是这样的,黑框中漏掉了一句“<代码>提取($ _data_ EXTR_PREFIX_SAME & # 39;数据# 39;);代码”>,<代码> 代码>提取函数的作用是将美元_data_数组中的<代码> $关键=祝辞美元价值> 代码对变成当前作用域中美元的键=$值赋值,这样视图文件中就可以直接使用美元关键引用价值的美元值了。不知道smarty中变量赋值是怎么进行的,但是感觉Yii这种方式高效很多,因为不再需要使用php实现词法分析之类的功能了。
这个技巧我们可以自己简单实现一下,就会明白它的原理了。编写代码如下:
class 控制器 { ,private $ name=& # 39; & # 39;; ,public function  __construct(名称) ,{ 这个美元才能→name =,美元名称; ,} ,public function 渲染(viewName美元,,数据) ,{ 提取才能(数据,美元,EXTR_PREFIX_SAME, & # 39;数据# 39;); ob_start才能(); ob_implicit_flush才能(0); 要求才能(viewName 美元;只& # 39;。php # 39;); echo 才能ob_get_clean (); ,} } $ ctrl =, new 控制器(& # 39;php # 39;); 美元ctrl→渲染(& # 39;视图# 39;,,数组(& # 39;年龄# 39;=祝辞20)),,//模仿渲染方法调用 echo 这→美元name 又是“\ n",只age 美元;只“\ n",,//view.php只有一句
假设第一段代码存为controller.php,第二段存为视图。php(若存为其他名字,请相应修改调用渲染时传入的名字),在终端执行php controller.php会输出:
20 php
引用>
本来view.php中是没有这和年龄的美元,但是因为需要时给予了它渲染方法的作用域,并且采用了提取方法操作传入的数组参数,使得读取这两个变量成为可能。
<强> 2,嵌套了布局的视图文件的渲染强>
这里嵌套是指控制器采用了layout1并渲染视图视图,而layout1又采用了布局layout2。采用layout1并渲染视图是上
一部分的内容,而在layout1中采用layout2是这部分要讲的。采用这种方式进行渲染,通常需要在layout1中调用
控制器的<代码> beginContent (layout2) 代码>方法,并传入layout2的名称,然后在渲染结束后再调用控制器的<代码> endContent() 代码>
方法结束渲染过程。伪码如下:
& lt; php ?//,美元却;能够is 从而控制器 $ this→beginContent (& # 39; layout2& # 39;); 比; some html 和/或& lt; ? php echo 内容;美元,?比; & lt; ? php 这→美元endContent();, ?在这里就要讲这两个方法以及整个过程的实现机制。先来看beginContent的工作流程:
请注意这一连串的过程都是在当前控制器的作用域进行的。可以看到beginContent调用beginWidget并传入了一个类名,这个类的实例就是后面的部件,表示了一个装饰器,注意在createWidget时传入了当前控制器的实例,并且会对小部件的视图中属性赋值为布局名称(这里的过程还要稍微复杂些,但是大致的意图是这样的,具体可参考源码),这两个变量后面有用,然后调用小部件的初始化方法使其初始化,并将其缓存到控制器的一个堆栈中。值得注意的是初始化方法里做了什么:很熟悉,打开了输出缓冲区。用途是什么,看了第一部分你应该懂~ ~下面再看endContent的执行过程:
使用Yii框架怎么实现一个页面渲染操作