本文实例讲述了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的