Qeephp中的控制器视图机制

Qeephp中的控制器视图机制

Qee中视图是如何被调用的

处理视图的两个类的职责分别是什么

控制器中的数据时如何传递到前台视图的

视图的模板继承机制是如何实现的

Qee中视图是如何被调用的

每次请求访问一个action生成视图,函数调用的次序是

Controller->execute()   返回QView_Render_PHP视图对象

QView_Render_PHP->execute()   该函数调用该类中的display函数

QView_Render_PHP->display()    该函数调用该类中的fetch函数

QView_Render_PHP->fetch()      该函数调用QView_Render_PHP_Parser中的parser函数

QView_Render_PHP_Parser->parser()  该函数是递归函数,用来处理qee的模板继承机制,同时该函数调用该类中的_include()函数,加载页面view,并执行页面中的_block,_endblock,_control,_element函数

QView_Render_PHP_parser->block()  该函数用来加载view中的blockviewblock的堆栈中

QView_Render_PHP_parser->endblock()  该函数用来将堆栈中的block及其内容转移到堆栈的blocks参数中,并且设置占位符

QView_Render_PHP_parser->control    调用控件,直接生成字符串返回

QView_Render_PHP_parser->element    调用element,直接生成字符串返回

最后返回页面的html字符串,在index.php人口文件中显示

处理视图的两个类的职责分别是什么

QView_Render_PHP类主要的作用是获取视图view的文件名并加载文件,获取控制器中传递过来的变量,设置一些常用的全局变量到view中,例如 $_BASE_DIR 

QView_Render_PHP_parser主要负责将解析QView_Render_PHP类加载视图文件,把控制器总的变量都传递给视图,同时实现qeephp视图的模板继承机制

每次请求访问页面,都要生成一个QView_Render_PHPQView_Render_PHP_parser对象

控制器中的数据是如何传递到前台视图的

每次执行action后,都会将变量以$this->_view["变量名"] =>变量值   的方式传递给QView_Render_PHP类,

QView_Render_PHP类通过fetch()函数调用QView_Render_PHP_parser类的assign函数赋值给QView_Render_PHP_parser类的_vars属性,

在执行block函数,在执行QView_Render_PHP_parser->parser()函数时,调用QView_Render_PHP_parser->_include()函数,该函数调用extract($this->_vars);函数,使得view页面中可以直接以变量的形式使用$this->_vars数组中的变量,Extract()函数的作用就是直接定义数组当中的名值对为变量,然后include $___filename;导入文件,让文件中可以使用$this->_vars中的变量值

下面为_include函数

视图的模板继承机制是如何实现的

Qee的模板继承机制主要是QView_Render_PHP_parser类中的parser()block()endblock()三个函数来实现的,

parser()函数主要解决的是view页面如何继承布局layout的问题,

Block()endblock()函数主要解决的是viewblock块如何替换layout中的block的问题

这两个函数操作的都是一个名为stacks的视图堆栈,parser函数是将view以及layout页面存入堆栈,blockendblock函数主要是将block块内容存入viewlayout的堆栈中,以下为stacks堆栈中的一个view视图有的参数及其值

视图堆栈stacks中的视图数组中的配置

参数名

说明

id

Int   随机数(数字,例如1350873922

每个视图view都会有一个编号,做为视图的唯一编号,不论是view还是布局layoutid都是一个

contents

String 类型%block_contents_placeholder_main_1350873922%  或 页面的具体html内容

%block_contents_placeholder_main_1350873922%是一个占位符,每个block函数都会生成一个这个语句,是用来被继承该页面的语句块替换用的

extends

String   _layouts/default1_layout

该页面所继承的布局

blocks

Array   模块名 => 模块内容

页面块的内容,每个view中的所有block中的内容,qee中的视图继承机制,就是通过将view中的block的内容替换布局layout中的block的内容,这样就实现了模板继承机制

Blocks_stacks

Array 模块名 => 模块内容

View在加载时,临时存放viewblock的堆栈

Blocks_config

Array 模块名 => append|repalce|

View中模块替换布局中的模块时需要的配置,

Append表示view中模块继承布局中的模块时,是将view中的内容放到布局中模块的后面

Repalce表示是替换布局中模块的内容,默认情况下就是replace

Nested_blocks

Array  array(子嵌套模块,父嵌套模块)

框架记录每个模块的嵌套关系

每次页面请求访问,qee会将view页面先压入堆栈中,然后再将view页面继承的layout压入堆栈,再压入该layout继承的layout到堆栈中,依次类推,知道某个layout没有继承的layout为止,

viewlayout依次压入堆栈时,qee会执行viewlayout页面,调用页面中block函数将block的内容压入viewlayout中的blocks_stacks块堆栈中,并通过调用endblock函数依次调用抛出blocks_stacks堆栈中的block内容,并设置block的占位符

如果view页面中block块的嵌套次序为

Mian

   First

     Second

则在调用完页面中所有的block函数之后,view页面中的blocks_stacks堆栈中的结构为 Second

First  

Main

下面为block函数

main最先压入到堆栈中,而endblock函数则是将堆栈中的块一个一个抛出,并设置占位符,

下面为endblock函数

将堆栈中的内容块转移到blocks中,下面为view页面中的blocks的数据

最后通过parser函数将view中的block块的内容替换layout中的同名block块内容

                    





posted @ 2013-02-24 14:59  jrsjeff  Views(476)  Comments(0)    收藏  举报