使用Yii框架怎么实现一个页面渲染操作

  介绍

今天就跟大家聊聊有关使用Yii框架怎么实现一个页面渲染操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强> 1,一般页面渲染

Yii的页面渲染通过在控制器的动作中调用<代码> $ this→渲染($ viewname…) 进行,流程如下图:

使用Yii框架怎么实现一个页面渲染操作

在渲染方法中,Yii会先对你的看法文件进行渲染,然后如果你使用了某些布局,则会将视图渲染的输出再传入对布局的渲染方法中,上述这两步在虚线框中表示了,简单的页面渲染就是这样的。

当然这里面有些技巧需要注意,首先是黑框中显示的那几行代码(位于renderInternal方法中),Yii首先启用输出缓冲,并禁止隐式的冲掉缓冲,然后要求需要渲染的视图文件,最后再获取缓冲区的全部内容,即最终的渲染结果。这样处理有3个好处:

1。视图文件中多次回波也必须最后一起输出;

2。可以在视图文件中使用美元,即当前的控制器对象。

3。第三个好处是这样的,黑框中漏掉了一句“<代码>提取($ _data_ EXTR_PREFIX_SAME & # 39;数据# 39;);,<代码> 提取函数的作用是将美元_data_数组中的<代码> $关键=祝辞美元价值>

这个技巧我们可以自己简单实现一下,就会明白它的原理了。编写代码如下:

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的工作流程:

使用Yii框架怎么实现一个页面渲染操作

请注意这一连串的过程都是在当前控制器的作用域进行的。可以看到beginContent调用beginWidget并传入了一个类名,这个类的实例就是后面的部件,表示了一个装饰器,注意在createWidget时传入了当前控制器的实例,并且会对小部件的视图中属性赋值为布局名称(这里的过程还要稍微复杂些,但是大致的意图是这样的,具体可参考源码),这两个变量后面有用,然后调用小部件的初始化方法使其初始化,并将其缓存到控制器的一个堆栈中。值得注意的是初始化方法里做了什么:很熟悉,打开了输出缓冲区。用途是什么,看了第一部分你应该懂~ ~下面再看endContent的执行过程:

使用Yii框架怎么实现一个页面渲染操作