手机版

Yii框架页面渲染操作示例详解

时间:2021-08-21 来源:互联网 编辑:宝哥软件园 浏览:

本文举例说明了Yii框架的页面渲染操作。分享给大家参考,如下:

1.常规页面呈现

Yii的页面渲染是通过调用$this-render($viewname)来执行的.)在控制器的作用下,流程如下:

在渲染方法中,yii会先渲染你的视图文件,然后如果你使用了一些布局,视图渲染的输出会转移到布局的渲染方法中。这两个步骤用虚线框表示,简单的页面渲染是这样的。

当然,还有一些技巧需要注意。首先是黑框中显示的代码行(renderInternal方法中),yii首先启用输出缓冲区,禁止隐式刷新缓冲区,然后要求渲染视图文件,最后获取缓冲区的所有内容,也就是最终的渲染结果。这种方法有三个优点:

1.视图文件中的多个回显最终必须一起输出;

2.您可以在视图文件中使用$this,即当前控制器对象。

3.第三个优点是“提取($ _ data _,extr _ prefix _ same,' data ')在黑盒中缺失;”extract的功能是将$_data_ array中的$key=$value对改为当前作用域中的$key=$value,这样$value的值就可以被视图文件中的$key直接引用。我不知道如何在smarty中分配变量,但我觉得yii的效率要高得多,因为不再需要php来实现词法分析等功能。

我们可以简单地自己实现这个技能,然后我们就会理解它的原理。按如下方式编写代码:

类控制器{ 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);需要($viewName)。PHP ');echo ob _ get _ clean();}}$ctrl=新控制器(' PHP ');$ctrl-render('view ',array(' age '=20));//模仿render方法调用echo $this-name。\n。$年龄。\ n ';//view.php只有一句话,假设第一段代码保存为controller.php,第二段保存为view.php(如果保存为其他名称,请相应修改调用render时传入的名称),在终端执行PHP controller.php会输出:

php20

最初,view.php中没有$this和$age,但是可以读取这两个变量,因为在需要时它被赋予了render方法的范围,并且传入的数组参数由extract方法操作。

2.与布局嵌套的视图文件的呈现

这里的嵌套表示控制器采用布局1并渲染视图,布局1采用布局布局2。采用布局1,渲染视图打开

内容的一部分,在layout1中使用layout2是这一部分的内容。以这种方式呈现通常需要在layout1中调用

控制器的beginContent(layout2)方法,传入layout2的名称,然后在呈现后调用控制器的endContent()。

方法结束呈现过程。伪代码如下:

?PHP//$这是控制器$ this-Begin cent(' layout 2 ');一些html和/或?php echo $内容;PHP $ this-end content();下面我们就来说说这两种方法以及整个过程的实现机制。我们先来看看beginContent的工作流程:

请注意,这一系列过程是在当前控制器的范围内进行的。您可以看到beginContent调用beginwidget并传入一个类名。这个类的实例是下面的小部件,它代表一个装饰器。请注意,在createWidget时,会传入一个当前控制器的实例,并为Widget的view属性分配布局名称(这里的过程稍微复杂一些,但大致意图是这样的,具体请参考源代码)。这两个变量在后面很有用。然后调用widget的Init方法对其进行初始化,并将其缓存在控制器的堆栈中。值得注意的是在init方法中做了什么:我很熟悉它并打开了输出缓冲区。目的是甚麽?看完第一部分,你应该明白了~ ~我们来看看endContent的执行过程:

这个过程有点复杂。首先显示第一个虚线框(包括)在当前控制器的范围内,然后在widget的范围内。可以看到在调用endContent之后,之前保存的小部件实际上是从控制器的栈中弹出来的,然后调用小部件的run方法。之后主要是小部件的工作。首先,熟悉的ob_get_clean()获取缓冲区中的内容。通过参考伪代码,您会明白缓冲区中的内容是“一些html和/或……”,也就是你写的页面HTML和你想呼应的东西;那么重要的工作就是在装修方法,会通知控制器获取布局文件,通知控制器渲染文件,但是控制器在哪里呢?是小部件的所有者属性,表示小部件的所有者。还记得控制器对象被传递给了beginContent中的小部件实例吗?)很简单,就像渲染一个普通的视图文件一样,除了从缓冲区获得的所有内容都被传输到视图文件,并获得最终的渲染结果。

同样,我们也可以编写一个演示来模拟这个渲染过程,并编写以下代码:

?PHP class Decorator { public function begin(){ ob _ start();ob _ implicit _ flush(0);}公共功能装饰($content) { echo 'from Decorator '。$ content} public function end(){ $ output=ob _ get _ clean();$ this-装修($ output);}}?require _ once(' dec . PHP ');$ dec=new Decorator();$ dec-begin();h1sddfds/h1?php echo ' hello?PHP $ dec-end();假设第一个代码是dec.php表示装饰器,第二个代码是layout.php表示布局文件。运行PHP layout.php应该输出:

来自装饰者h1sddfds/h1hello

这个简化的过程使得理解框架中的渲染过程变得容易。

3.摘要

yii的两个渲染过程有效地利用了语言的输出缓冲区,而第二种方式将“打开缓冲区”和“获取缓冲区”的操作分离开来,进而在这两个操作之间实现修饰输出内容的功能。

更多对Yii相关内容感兴趣的读者,请查看本网站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》

希望本文对基于Yii框架的PHP编程有所帮助。

版权声明:Yii框架页面渲染操作示例详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。